blob: 1b45b823ad201d73aa4ad9bac0cb8453c5b849a9 [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}
800
Karl Schultz6addd812016-02-02 17:17:23 -0700801TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600802 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600803 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600804 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
805 fenceInfo.pNext = NULL;
806
Karl Schultz6addd812016-02-02 17:17:23 -0700807 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700808 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600809 "submitted to VkResetFences in UNSIGNALED STATE");
810
Tony Barbour0b4d9562015-04-09 10:48:04 -0600811 ASSERT_NO_FATAL_FAILURE(InitState());
812 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +0800813 VkFence fences[1] = {testFence.handle()};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600814 vkResetFences(m_device->device(), 1, fences);
Tony Barbour300a6082015-04-07 13:44:53 -0600815
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200816 m_errorMonitor->VerifyFound();
Tony Barbour300a6082015-04-07 13:44:53 -0600817}
Tobin Ehlis41376e12015-07-03 08:45:14 -0600818
Chia-I Wu08accc62015-07-07 11:50:03 +0800819/* TODO: Update for changes due to bug-14075 tiling across render passes */
820#if 0
Tobin Ehlis41376e12015-07-03 08:45:14 -0600821TEST_F(VkLayerTest, InvalidUsageBits)
822{
823 // Initiate Draw w/o a PSO bound
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600824
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600826 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -0600827
828 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800829 VkCommandBufferObj commandBuffer(m_device);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600830 BeginCommandBuffer();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600831
832 const VkExtent3D e3d = {
833 .width = 128,
834 .height = 128,
835 .depth = 1,
836 };
837 const VkImageCreateInfo ici = {
838 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
839 .pNext = NULL,
840 .imageType = VK_IMAGE_TYPE_2D,
841 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
842 .extent = e3d,
843 .mipLevels = 1,
844 .arraySize = 1,
Chia-I Wu5c17c962015-10-31 00:31:16 +0800845 .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600846 .tiling = VK_IMAGE_TILING_LINEAR,
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600847 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
Tobin Ehlis41376e12015-07-03 08:45:14 -0600848 .flags = 0,
849 };
850
851 VkImage dsi;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800852 vkCreateImage(m_device->device(), &ici, NULL, &dsi);
Tobin Ehlis41376e12015-07-03 08:45:14 -0600853 VkDepthStencilView dsv;
854 const VkDepthStencilViewCreateInfo dsvci = {
855 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
856 .pNext = NULL,
857 .image = dsi,
858 .mipLevel = 0,
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -0600859 .baseArrayLayer = 0,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600860 .arraySize = 1,
861 .flags = 0,
862 };
Chia-I Wuf7458c52015-10-26 21:10:41 +0800863 vkCreateDepthStencilView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600864
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200865 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600866}
Mark Lobodzinski209b5292015-09-17 09:44:05 -0600867#endif // 0
868#endif // MEM_TRACKER_TESTS
869
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600870#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -0700871TEST_F(VkLayerTest, PipelineNotBound) {
872 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600873
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -0700875 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600876
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600877 ASSERT_NO_FATAL_FAILURE(InitState());
878 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600879
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800880 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700881 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
882 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600883
884 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700885 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
886 ds_pool_ci.pNext = NULL;
887 ds_pool_ci.maxSets = 1;
888 ds_pool_ci.poolSizeCount = 1;
889 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600890
891 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -0700892 err =
893 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600894 ASSERT_VK_SUCCESS(err);
895
896 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700897 dsl_binding.binding = 0;
898 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
899 dsl_binding.descriptorCount = 1;
900 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
901 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600902
903 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700904 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
905 ds_layout_ci.pNext = NULL;
906 ds_layout_ci.bindingCount = 1;
907 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600908
909 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700910 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
911 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600912 ASSERT_VK_SUCCESS(err);
913
914 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800915 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800916 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -0700917 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -0600918 alloc_info.descriptorPool = ds_pool;
919 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700920 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
921 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600922 ASSERT_VK_SUCCESS(err);
923
924 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700925 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
926 pipeline_layout_ci.pNext = NULL;
927 pipeline_layout_ci.setLayoutCount = 1;
928 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600929
930 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700931 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
932 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600933 ASSERT_VK_SUCCESS(err);
934
Mark Youngad779052016-01-06 14:26:04 -0700935 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600936
937 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700938 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
939 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600940
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200941 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600942
Chia-I Wuf7458c52015-10-26 21:10:41 +0800943 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
944 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
945 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -0600946}
947
Karl Schultz6addd812016-02-02 17:17:23 -0700948TEST_F(VkLayerTest, BindInvalidMemory) {
949 VkResult err;
950 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -0600951
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -0700953 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600954
Tobin Ehlisec598302015-09-15 15:02:17 -0600955 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -0600956
957 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700958 VkImage image;
959 VkDeviceMemory mem;
960 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -0600961
Karl Schultz6addd812016-02-02 17:17:23 -0700962 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
963 const int32_t tex_width = 32;
964 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -0600965
966 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700967 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
968 image_create_info.pNext = NULL;
969 image_create_info.imageType = VK_IMAGE_TYPE_2D;
970 image_create_info.format = tex_format;
971 image_create_info.extent.width = tex_width;
972 image_create_info.extent.height = tex_height;
973 image_create_info.extent.depth = 1;
974 image_create_info.mipLevels = 1;
975 image_create_info.arrayLayers = 1;
976 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
977 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
978 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
979 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -0600980
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800981 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700982 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
983 mem_alloc.pNext = NULL;
984 mem_alloc.allocationSize = 0;
985 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -0600986
Chia-I Wuf7458c52015-10-26 21:10:41 +0800987 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -0600988 ASSERT_VK_SUCCESS(err);
989
Karl Schultz6addd812016-02-02 17:17:23 -0700990 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -0600991
992 mem_alloc.allocationSize = mem_reqs.size;
993
Karl Schultz6addd812016-02-02 17:17:23 -0700994 pass =
995 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -0600996 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -0600997
998 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800999 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001000 ASSERT_VK_SUCCESS(err);
1001
1002 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001003 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001004
1005 // Try to bind free memory that has been freed
1006 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1007 // This may very well return an error.
1008 (void)err;
1009
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001010 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001011
Chia-I Wuf7458c52015-10-26 21:10:41 +08001012 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001013}
1014
Karl Schultz6addd812016-02-02 17:17:23 -07001015TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1016 VkResult err;
1017 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001018
Karl Schultz6addd812016-02-02 17:17:23 -07001019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1020 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001021
Tobin Ehlisec598302015-09-15 15:02:17 -06001022 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001023
Karl Schultz6addd812016-02-02 17:17:23 -07001024 // Create an image object, allocate memory, destroy the object and then try
1025 // to bind it
1026 VkImage image;
1027 VkDeviceMemory mem;
1028 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001029
Karl Schultz6addd812016-02-02 17:17:23 -07001030 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1031 const int32_t tex_width = 32;
1032 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001033
1034 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001035 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1036 image_create_info.pNext = NULL;
1037 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1038 image_create_info.format = tex_format;
1039 image_create_info.extent.width = tex_width;
1040 image_create_info.extent.height = tex_height;
1041 image_create_info.extent.depth = 1;
1042 image_create_info.mipLevels = 1;
1043 image_create_info.arrayLayers = 1;
1044 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1045 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1046 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1047 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001048
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001049 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001050 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1051 mem_alloc.pNext = NULL;
1052 mem_alloc.allocationSize = 0;
1053 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001054
Chia-I Wuf7458c52015-10-26 21:10:41 +08001055 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001056 ASSERT_VK_SUCCESS(err);
1057
Karl Schultz6addd812016-02-02 17:17:23 -07001058 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001059
1060 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001061 pass =
1062 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001063 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001064
1065 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001066 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001067 ASSERT_VK_SUCCESS(err);
1068
1069 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001070 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001071 ASSERT_VK_SUCCESS(err);
1072
1073 // Now Try to bind memory to this destroyed object
1074 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1075 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001076 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001077
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001078 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001079
Chia-I Wuf7458c52015-10-26 21:10:41 +08001080 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001081}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001082
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001083#endif // OBJ_TRACKER_TESTS
1084
Tobin Ehlis0788f522015-05-26 16:11:58 -06001085#if DRAW_STATE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07001086TEST_F(VkLayerTest, LineWidthStateNotBound) {
1087 m_errorMonitor->SetDesiredFailureMsg(
1088 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001089 "Dynamic line width state not set for this command buffer");
1090
Karl Schultz6addd812016-02-02 17:17:23 -07001091 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line "
1092 "width state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001093
Karl Schultz6addd812016-02-02 17:17:23 -07001094 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1095 BsoFailLineWidth);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001096
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001097 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001098}
1099
Karl Schultz6addd812016-02-02 17:17:23 -07001100TEST_F(VkLayerTest, DepthBiasStateNotBound) {
1101 m_errorMonitor->SetDesiredFailureMsg(
1102 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001103 "Dynamic depth bias state not set for this command buffer");
1104
Karl Schultz6addd812016-02-02 17:17:23 -07001105 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1106 "bias state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001107
Karl Schultz6addd812016-02-02 17:17:23 -07001108 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1109 BsoFailDepthBias);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001110
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001111 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001112}
1113
Karl Schultz6addd812016-02-02 17:17:23 -07001114// Disable these two tests until we can sort out how to track multiple layer
1115// errors
1116TEST_F(VkLayerTest, ViewportStateNotBound) {
1117 m_errorMonitor->SetDesiredFailureMsg(
1118 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001119 "Dynamic viewport state not set for this command buffer");
1120
Karl Schultz6addd812016-02-02 17:17:23 -07001121 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1122 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001123
Karl Schultz6addd812016-02-02 17:17:23 -07001124 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1125 BsoFailViewport);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001126
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001127 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001128}
1129
Karl Schultz6addd812016-02-02 17:17:23 -07001130TEST_F(VkLayerTest, ScissorStateNotBound) {
1131 m_errorMonitor->SetDesiredFailureMsg(
1132 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001133 "Dynamic scissor state not set for this command buffer");
1134
Karl Schultz6addd812016-02-02 17:17:23 -07001135 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1136 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001137
Karl Schultz6addd812016-02-02 17:17:23 -07001138 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1139 BsoFailScissor);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001140
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001141 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001142}
1143
Karl Schultz6addd812016-02-02 17:17:23 -07001144TEST_F(VkLayerTest, BlendStateNotBound) {
1145 m_errorMonitor->SetDesiredFailureMsg(
1146 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7a1d2352016-03-28 11:18:19 -06001147 "Dynamic blend constants state not set for this command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001148
Karl Schultz6addd812016-02-02 17:17:23 -07001149 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend "
1150 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001151
Karl Schultz6addd812016-02-02 17:17:23 -07001152 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1153 BsoFailBlend);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001154
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001155 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001156}
1157
Karl Schultz6addd812016-02-02 17:17:23 -07001158TEST_F(VkLayerTest, DepthBoundsStateNotBound) {
1159 m_errorMonitor->SetDesiredFailureMsg(
1160 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001161 "Dynamic depth bounds state not set for this command buffer");
1162
Karl Schultz6addd812016-02-02 17:17:23 -07001163 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1164 "bounds state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001165
Karl Schultz6addd812016-02-02 17:17:23 -07001166 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1167 BsoFailDepthBounds);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001168
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001169 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001170}
1171
Karl Schultz6addd812016-02-02 17:17:23 -07001172TEST_F(VkLayerTest, StencilReadMaskNotSet) {
1173 m_errorMonitor->SetDesiredFailureMsg(
1174 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001175 "Dynamic stencil read mask state not set for this command buffer");
1176
Tobin Ehlis963a4042015-09-29 08:18:34 -06001177 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001178
Karl Schultz6addd812016-02-02 17:17:23 -07001179 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1180 "read mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001181
Karl Schultz6addd812016-02-02 17:17:23 -07001182 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1183 BsoFailStencilReadMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001184
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001185 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001186}
1187
Karl Schultz6addd812016-02-02 17:17:23 -07001188TEST_F(VkLayerTest, StencilWriteMaskNotSet) {
1189 m_errorMonitor->SetDesiredFailureMsg(
1190 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001191 "Dynamic stencil write mask state not set for this command buffer");
1192
Tobin Ehlis963a4042015-09-29 08:18:34 -06001193 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001194
Karl Schultz6addd812016-02-02 17:17:23 -07001195 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1196 "write mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001197
Karl Schultz6addd812016-02-02 17:17:23 -07001198 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1199 BsoFailStencilWriteMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001200
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001201 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001202}
1203
Karl Schultz6addd812016-02-02 17:17:23 -07001204TEST_F(VkLayerTest, StencilReferenceNotSet) {
1205 m_errorMonitor->SetDesiredFailureMsg(
1206 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001207 "Dynamic stencil reference state not set for this command buffer");
1208
Karl Schultz6addd812016-02-02 17:17:23 -07001209 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1210 "reference is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001211
Karl Schultz6addd812016-02-02 17:17:23 -07001212 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1213 BsoFailStencilReference);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001214
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001215 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001216}
1217
Karl Schultz6addd812016-02-02 17:17:23 -07001218TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001219 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001220
Karl Schultz6addd812016-02-02 17:17:23 -07001221 m_errorMonitor->SetDesiredFailureMsg(
1222 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1223 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
1224 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001225
1226 VkFenceCreateInfo fenceInfo = {};
1227 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1228 fenceInfo.pNext = NULL;
1229 fenceInfo.flags = 0;
1230
1231 ASSERT_NO_FATAL_FAILURE(InitState());
1232 ASSERT_NO_FATAL_FAILURE(InitViewport());
1233 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1234
Karl Schultz6addd812016-02-02 17:17:23 -07001235 // We luck out b/c by default the framework creates CB w/ the
1236 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001237 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001238 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1239 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001240 EndCommandBuffer();
1241
1242 testFence.init(*m_device, fenceInfo);
1243
1244 // Bypass framework since it does the waits automatically
1245 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001246 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001247 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1248 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001249 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001250 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001251 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001252 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001253 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001254 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001255 submit_info.pSignalSemaphores = NULL;
1256
Karl Schultz6addd812016-02-02 17:17:23 -07001257 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
1258 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001259
Karl Schultz6addd812016-02-02 17:17:23 -07001260 // Cause validation error by re-submitting cmd buffer that should only be
1261 // submitted once
1262 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001263
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001264 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001265}
1266
Karl Schultz6addd812016-02-02 17:17:23 -07001267TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001268 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07001269 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001270
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001272 "Unable to allocate 1 descriptors of "
1273 "type "
1274 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001275
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001276 ASSERT_NO_FATAL_FAILURE(InitState());
1277 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001278
Karl Schultz6addd812016-02-02 17:17:23 -07001279 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
1280 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001281 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001282 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
1283 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001284
1285 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001286 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1287 ds_pool_ci.pNext = NULL;
1288 ds_pool_ci.flags = 0;
1289 ds_pool_ci.maxSets = 1;
1290 ds_pool_ci.poolSizeCount = 1;
1291 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001292
1293 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001294 err =
1295 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001296 ASSERT_VK_SUCCESS(err);
1297
1298 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001299 dsl_binding.binding = 0;
1300 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1301 dsl_binding.descriptorCount = 1;
1302 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1303 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001304
1305 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001306 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1307 ds_layout_ci.pNext = NULL;
1308 ds_layout_ci.bindingCount = 1;
1309 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001310
1311 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001312 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1313 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001314 ASSERT_VK_SUCCESS(err);
1315
1316 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001317 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001318 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001319 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001320 alloc_info.descriptorPool = ds_pool;
1321 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001322 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1323 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001324
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001325 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001326
Chia-I Wuf7458c52015-10-26 21:10:41 +08001327 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1328 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001329}
1330
Karl Schultz6addd812016-02-02 17:17:23 -07001331TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
1332 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06001333
Karl Schultz6addd812016-02-02 17:17:23 -07001334 m_errorMonitor->SetDesiredFailureMsg(
1335 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1336 "It is invalid to call vkFreeDescriptorSets() with a pool created "
1337 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001338
Tobin Ehlise735c692015-10-08 13:13:50 -06001339 ASSERT_NO_FATAL_FAILURE(InitState());
1340 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06001341
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001342 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001343 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1344 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06001345
1346 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001347 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1348 ds_pool_ci.pNext = NULL;
1349 ds_pool_ci.maxSets = 1;
1350 ds_pool_ci.poolSizeCount = 1;
1351 ds_pool_ci.flags = 0;
1352 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
1353 // app can only call vkResetDescriptorPool on this pool.;
1354 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06001355
1356 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001357 err =
1358 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06001359 ASSERT_VK_SUCCESS(err);
1360
1361 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001362 dsl_binding.binding = 0;
1363 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1364 dsl_binding.descriptorCount = 1;
1365 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1366 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06001367
1368 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001369 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1370 ds_layout_ci.pNext = NULL;
1371 ds_layout_ci.bindingCount = 1;
1372 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06001373
1374 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001375 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1376 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06001377 ASSERT_VK_SUCCESS(err);
1378
1379 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001380 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001381 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001382 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001383 alloc_info.descriptorPool = ds_pool;
1384 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001385 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1386 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06001387 ASSERT_VK_SUCCESS(err);
1388
1389 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001390 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06001391
Chia-I Wuf7458c52015-10-26 21:10:41 +08001392 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1393 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06001394}
1395
Karl Schultz6addd812016-02-02 17:17:23 -07001396TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06001397 // Attempt to clear Descriptor Pool with bad object.
1398 // ObjectTracker should catch this.
1399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1400 "Invalid VkDescriptorPool Object 0xbaad6001");
1401 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
1402 vkResetDescriptorPool(device(), badPool, 0);
1403 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001404}
1405
Karl Schultz6addd812016-02-02 17:17:23 -07001406TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06001407 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
1408 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001409 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06001410 // call vkCmdBindDescriptorSets w/ false Descriptor Set
1411 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
1412 VkResult err;
1413 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1414 "Invalid VkDescriptorSet Object 0xbaad6001");
1415
1416 ASSERT_NO_FATAL_FAILURE(InitState());
1417
1418 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
1419 layout_bindings[0].binding = 0;
1420 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1421 layout_bindings[0].descriptorCount = 1;
1422 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
1423 layout_bindings[0].pImmutableSamplers = NULL;
1424
1425 VkDescriptorSetLayout descriptor_set_layout;
1426 VkDescriptorSetLayoutCreateInfo dslci = {};
1427 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1428 dslci.pNext = NULL;
1429 dslci.bindingCount = 1;
1430 dslci.pBindings = layout_bindings;
1431 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
1432 assert(!err);
1433
1434 VkPipelineLayout pipeline_layout;
1435 VkPipelineLayoutCreateInfo plci = {};
1436 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1437 plci.pNext = NULL;
1438 plci.setLayoutCount = 1;
1439 plci.pSetLayouts = &descriptor_set_layout;
1440 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
1441 assert(!err);
1442
1443 BeginCommandBuffer();
1444 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
1445 pipeline_layout, 0, 1, &badSet, 0, NULL);
1446 m_errorMonitor->VerifyFound();
1447 EndCommandBuffer();
1448 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
1449 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001450}
1451
Karl Schultz6addd812016-02-02 17:17:23 -07001452TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06001453 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
1454 // ObjectTracker should catch this.
1455 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
1456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1457 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
1458
1459 VkPipelineLayout pipeline_layout;
1460 VkPipelineLayoutCreateInfo plci = {};
1461 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1462 plci.pNext = NULL;
1463 plci.setLayoutCount = 1;
1464 plci.pSetLayouts = &bad_layout;
1465 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
1466
1467 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001468}
1469
Karl Schultz6addd812016-02-02 17:17:23 -07001470TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06001471 // Attempt to bind an invalid Pipeline to a valid Command Buffer
1472 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001473 // Create a valid cmd buffer
1474 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06001475 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
1476 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1477 "Invalid VkPipeline Object 0xbaad6001");
1478 ASSERT_NO_FATAL_FAILURE(InitState());
1479 BeginCommandBuffer();
1480 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1481 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
1482 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001483}
1484
Karl Schultz6addd812016-02-02 17:17:23 -07001485TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
1486 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
1487 // CommandBuffer
1488 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001489
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07001490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001491 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001492
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001493 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06001494 ASSERT_NO_FATAL_FAILURE(InitViewport());
1495 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001496 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001497 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1498 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06001499
1500 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001501 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1502 ds_pool_ci.pNext = NULL;
1503 ds_pool_ci.maxSets = 1;
1504 ds_pool_ci.poolSizeCount = 1;
1505 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06001506
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001507 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001508 err =
1509 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001510 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001511
Tony Barboureb254902015-07-15 12:50:33 -06001512 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001513 dsl_binding.binding = 0;
1514 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1515 dsl_binding.descriptorCount = 1;
1516 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1517 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001518
Tony Barboureb254902015-07-15 12:50:33 -06001519 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001520 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1521 ds_layout_ci.pNext = NULL;
1522 ds_layout_ci.bindingCount = 1;
1523 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001524 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001525 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1526 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001527 ASSERT_VK_SUCCESS(err);
1528
1529 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001530 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001531 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001532 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001533 alloc_info.descriptorPool = ds_pool;
1534 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001535 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1536 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001537 ASSERT_VK_SUCCESS(err);
1538
Tony Barboureb254902015-07-15 12:50:33 -06001539 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001540 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1541 pipeline_layout_ci.pNext = NULL;
1542 pipeline_layout_ci.setLayoutCount = 1;
1543 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001544
1545 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001546 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1547 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001548 ASSERT_VK_SUCCESS(err);
1549
Karl Schultz6addd812016-02-02 17:17:23 -07001550 VkShaderObj vs(m_device, bindStateVertShaderText,
1551 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06001552 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07001553 // on more devices
1554 VkShaderObj fs(m_device, bindStateFragShaderText,
1555 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001556
Tony Barbourc95e4ac2015-08-04 17:05:26 -06001557 VkPipelineObj pipe(m_device);
1558 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06001559 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06001560 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06001561 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06001562
1563 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001564 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1565 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
1566 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1567 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1568 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001569
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001570 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001571
Chia-I Wuf7458c52015-10-26 21:10:41 +08001572 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1573 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1574 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06001575}
1576
Karl Schultz6addd812016-02-02 17:17:23 -07001577TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001578 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07001579 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001580
Karl Schultz6addd812016-02-02 17:17:23 -07001581 m_errorMonitor->SetDesiredFailureMsg(
1582 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001583 "Attempt to update descriptor with invalid bufferView ");
1584
1585 ASSERT_NO_FATAL_FAILURE(InitState());
1586 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001587 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1588 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001589
1590 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001591 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1592 ds_pool_ci.pNext = NULL;
1593 ds_pool_ci.maxSets = 1;
1594 ds_pool_ci.poolSizeCount = 1;
1595 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001596
1597 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001598 err =
1599 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001600 ASSERT_VK_SUCCESS(err);
1601
1602 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001603 dsl_binding.binding = 0;
1604 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1605 dsl_binding.descriptorCount = 1;
1606 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1607 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001608
1609 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001610 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1611 ds_layout_ci.pNext = NULL;
1612 ds_layout_ci.bindingCount = 1;
1613 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001614 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001615 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1616 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001617 ASSERT_VK_SUCCESS(err);
1618
1619 VkDescriptorSet descriptorSet;
1620 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001621 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001622 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001623 alloc_info.descriptorPool = ds_pool;
1624 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001625 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1626 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001627 ASSERT_VK_SUCCESS(err);
1628
Karl Schultz6addd812016-02-02 17:17:23 -07001629 VkBufferView view =
1630 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001631 VkWriteDescriptorSet descriptor_write;
1632 memset(&descriptor_write, 0, sizeof(descriptor_write));
1633 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1634 descriptor_write.dstSet = descriptorSet;
1635 descriptor_write.dstBinding = 0;
1636 descriptor_write.descriptorCount = 1;
1637 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1638 descriptor_write.pTexelBufferView = &view;
1639
1640 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1641
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001642 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001643
1644 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1645 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1646}
1647
Karl Schultz6addd812016-02-02 17:17:23 -07001648TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
1649 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
1650 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07001651 // 1. No dynamicOffset supplied
1652 // 2. Too many dynamicOffsets supplied
1653 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07001654 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001656 " requires 1 dynamicOffsets, but only "
1657 "0 dynamicOffsets are left in "
1658 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001659
1660 ASSERT_NO_FATAL_FAILURE(InitState());
1661 ASSERT_NO_FATAL_FAILURE(InitViewport());
1662 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1663
1664 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001665 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1666 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001667
1668 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001669 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1670 ds_pool_ci.pNext = NULL;
1671 ds_pool_ci.maxSets = 1;
1672 ds_pool_ci.poolSizeCount = 1;
1673 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001674
1675 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001676 err =
1677 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001678 ASSERT_VK_SUCCESS(err);
1679
1680 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001681 dsl_binding.binding = 0;
1682 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1683 dsl_binding.descriptorCount = 1;
1684 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1685 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001686
1687 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001688 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1689 ds_layout_ci.pNext = NULL;
1690 ds_layout_ci.bindingCount = 1;
1691 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001692 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001693 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1694 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001695 ASSERT_VK_SUCCESS(err);
1696
1697 VkDescriptorSet descriptorSet;
1698 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001699 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001700 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001701 alloc_info.descriptorPool = ds_pool;
1702 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001703 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1704 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001705 ASSERT_VK_SUCCESS(err);
1706
1707 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001708 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1709 pipeline_layout_ci.pNext = NULL;
1710 pipeline_layout_ci.setLayoutCount = 1;
1711 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001712
1713 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001714 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1715 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001716 ASSERT_VK_SUCCESS(err);
1717
1718 // Create a buffer to update the descriptor with
1719 uint32_t qfi = 0;
1720 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001721 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1722 buffCI.size = 1024;
1723 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1724 buffCI.queueFamilyIndexCount = 1;
1725 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001726
1727 VkBuffer dyub;
1728 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
1729 ASSERT_VK_SUCCESS(err);
1730 // Correctly update descriptor to avoid "NOT_UPDATED" error
1731 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001732 buffInfo.buffer = dyub;
1733 buffInfo.offset = 0;
1734 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001735
1736 VkWriteDescriptorSet descriptor_write;
1737 memset(&descriptor_write, 0, sizeof(descriptor_write));
1738 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1739 descriptor_write.dstSet = descriptorSet;
1740 descriptor_write.dstBinding = 0;
1741 descriptor_write.descriptorCount = 1;
1742 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1743 descriptor_write.pBufferInfo = &buffInfo;
1744
1745 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1746
1747 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001748 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1749 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1750 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001751 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07001752 uint32_t pDynOff[2] = {512, 756};
1753 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07001754 m_errorMonitor->SetDesiredFailureMsg(
1755 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07001756 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07001757 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1758 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1759 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12001760 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07001761 // Finally cause error due to dynamicOffset being too big
Karl Schultz6addd812016-02-02 17:17:23 -07001762 m_errorMonitor->SetDesiredFailureMsg(
1763 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07001764 " from its update, this oversteps its buffer (");
1765 // Create PSO to be used for draw-time errors below
1766 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12001767 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07001768 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07001769 "out gl_PerVertex { \n"
1770 " vec4 gl_Position;\n"
1771 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07001772 "void main(){\n"
1773 " gl_Position = vec4(1);\n"
1774 "}\n";
1775 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12001776 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07001777 "\n"
1778 "layout(location=0) out vec4 x;\n"
1779 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
1780 "void main(){\n"
1781 " x = vec4(bar.y);\n"
1782 "}\n";
1783 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
1784 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1785 VkPipelineObj pipe(m_device);
1786 pipe.AddShader(&vs);
1787 pipe.AddShader(&fs);
1788 pipe.AddColorAttachment();
1789 pipe.CreateVKPipeline(pipeline_layout, renderPass());
1790
Karl Schultz6addd812016-02-02 17:17:23 -07001791 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1792 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
1793 // This update should succeed, but offset size of 512 will overstep buffer
1794 // /w range 1024 & size 1024
1795 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1796 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1797 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07001798 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001799 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001800
1801 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1802 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1803}
1804
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07001805TEST_F(VkLayerTest, InvalidPushConstants) {
1806 // Hit push constant error cases:
1807 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
1808 // 2. Incorrectly set push constant size to 0
1809 // 3. Incorrectly set push constant size to non-multiple of 4
1810 // 4. Attempt push constant update that exceeds maxPushConstantSize
1811 VkResult err;
1812 m_errorMonitor->SetDesiredFailureMsg(
1813 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1814 "vkCreatePipelineLayout() call has push constants with offset ");
1815
1816 ASSERT_NO_FATAL_FAILURE(InitState());
1817 ASSERT_NO_FATAL_FAILURE(InitViewport());
1818 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1819
1820 VkPushConstantRange pc_range = {};
1821 pc_range.size = 0xFFFFFFFFu;
1822 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
1823 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1824 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1825 pipeline_layout_ci.pushConstantRangeCount = 1;
1826 pipeline_layout_ci.pPushConstantRanges = &pc_range;
1827
1828 VkPipelineLayout pipeline_layout;
1829 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1830 &pipeline_layout);
1831
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001832 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07001833 // Now cause errors due to size 0 and non-4 byte aligned size
1834 pc_range.size = 0;
1835 m_errorMonitor->SetDesiredFailureMsg(
1836 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1837 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
1838 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1839 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001840 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07001841 pc_range.size = 1;
1842 m_errorMonitor->SetDesiredFailureMsg(
1843 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1844 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
1845 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1846 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001847 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07001848 // Cause error due to bad size in vkCmdPushConstants() call
1849 m_errorMonitor->SetDesiredFailureMsg(
1850 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1851 "vkCmdPushConstants() call has push constants with offset ");
1852 pipeline_layout_ci.pushConstantRangeCount = 0;
1853 pipeline_layout_ci.pPushConstantRanges = NULL;
1854 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1855 &pipeline_layout);
1856 ASSERT_VK_SUCCESS(err);
1857 BeginCommandBuffer();
1858 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
1859 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001860 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07001861 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1862}
1863
Karl Schultz6addd812016-02-02 17:17:23 -07001864TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07001865 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07001866 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001867
1868 ASSERT_NO_FATAL_FAILURE(InitState());
1869 ASSERT_NO_FATAL_FAILURE(InitViewport());
1870 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1871
1872 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
1873 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001874 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1875 ds_type_count[0].descriptorCount = 10;
1876 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1877 ds_type_count[1].descriptorCount = 2;
1878 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
1879 ds_type_count[2].descriptorCount = 2;
1880 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
1881 ds_type_count[3].descriptorCount = 5;
1882 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
1883 // type
1884 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
1885 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1886 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001887
1888 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001889 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1890 ds_pool_ci.pNext = NULL;
1891 ds_pool_ci.maxSets = 5;
1892 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
1893 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001894
1895 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001896 err =
1897 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001898 ASSERT_VK_SUCCESS(err);
1899
1900 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
1901 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001902 dsl_binding[0].binding = 0;
1903 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1904 dsl_binding[0].descriptorCount = 5;
1905 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
1906 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001907
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001908 // Create layout identical to set0 layout but w/ different stageFlags
1909 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001910 dsl_fs_stage_only.binding = 0;
1911 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1912 dsl_fs_stage_only.descriptorCount = 5;
1913 dsl_fs_stage_only.stageFlags =
1914 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
1915 // bind time
1916 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001917 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001918 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1919 ds_layout_ci.pNext = NULL;
1920 ds_layout_ci.bindingCount = 1;
1921 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001922 static const uint32_t NUM_LAYOUTS = 4;
1923 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001924 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001925 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
1926 // layout for error case
1927 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1928 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001929 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07001930 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07001931 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1932 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001933 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001934 dsl_binding[0].binding = 0;
1935 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001936 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07001937 dsl_binding[1].binding = 1;
1938 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
1939 dsl_binding[1].descriptorCount = 2;
1940 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
1941 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07001942 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001943 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07001944 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1945 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001946 ASSERT_VK_SUCCESS(err);
1947 dsl_binding[0].binding = 0;
1948 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001949 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001950 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07001951 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1952 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001953 ASSERT_VK_SUCCESS(err);
1954 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001955 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07001956 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1957 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001958 ASSERT_VK_SUCCESS(err);
1959
1960 static const uint32_t NUM_SETS = 4;
1961 VkDescriptorSet descriptorSet[NUM_SETS] = {};
1962 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001963 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001964 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001965 alloc_info.descriptorPool = ds_pool;
1966 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001967 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1968 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001969 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001970 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07001971 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001972 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07001973 err =
1974 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001975 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001976
1977 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001978 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1979 pipeline_layout_ci.pNext = NULL;
1980 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
1981 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07001982
1983 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001984 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1985 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07001986 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001987 // Create pipelineLayout with only one setLayout
1988 pipeline_layout_ci.setLayoutCount = 1;
1989 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001990 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1991 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001992 ASSERT_VK_SUCCESS(err);
1993 // Create pipelineLayout with 2 descriptor setLayout at index 0
1994 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
1995 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07001996 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1997 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001998 ASSERT_VK_SUCCESS(err);
1999 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
2000 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
2001 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07002002 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2003 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002004 ASSERT_VK_SUCCESS(err);
2005 // Create pipelineLayout with UB type, but stageFlags for FS only
2006 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
2007 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002008 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2009 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002010 ASSERT_VK_SUCCESS(err);
2011 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
2012 VkDescriptorSetLayout pl_bad_s0[2] = {};
2013 pl_bad_s0[0] = ds_layout_fs_only;
2014 pl_bad_s0[1] = ds_layout[1];
2015 pipeline_layout_ci.setLayoutCount = 2;
2016 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
2017 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07002018 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2019 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002020 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002021
2022 // Create a buffer to update the descriptor with
2023 uint32_t qfi = 0;
2024 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002025 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2026 buffCI.size = 1024;
2027 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2028 buffCI.queueFamilyIndexCount = 1;
2029 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002030
2031 VkBuffer dyub;
2032 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2033 ASSERT_VK_SUCCESS(err);
2034 // Correctly update descriptor to avoid "NOT_UPDATED" error
2035 static const uint32_t NUM_BUFFS = 5;
2036 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002037 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002038 buffInfo[i].buffer = dyub;
2039 buffInfo[i].offset = 0;
2040 buffInfo[i].range = 1024;
2041 }
Karl Schultz6addd812016-02-02 17:17:23 -07002042 VkImage image;
2043 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2044 const int32_t tex_width = 32;
2045 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002046 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002047 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2048 image_create_info.pNext = NULL;
2049 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2050 image_create_info.format = tex_format;
2051 image_create_info.extent.width = tex_width;
2052 image_create_info.extent.height = tex_height;
2053 image_create_info.extent.depth = 1;
2054 image_create_info.mipLevels = 1;
2055 image_create_info.arrayLayers = 1;
2056 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2057 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2058 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2059 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002060 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2061 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002062
Karl Schultz6addd812016-02-02 17:17:23 -07002063 VkMemoryRequirements memReqs;
2064 VkDeviceMemory imageMem;
2065 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002066 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002067 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2068 memAlloc.pNext = NULL;
2069 memAlloc.allocationSize = 0;
2070 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002071 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
2072 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002073 pass =
2074 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002075 ASSERT_TRUE(pass);
2076 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
2077 ASSERT_VK_SUCCESS(err);
2078 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
2079 ASSERT_VK_SUCCESS(err);
2080
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002081 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002082 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2083 image_view_create_info.image = image;
2084 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
2085 image_view_create_info.format = tex_format;
2086 image_view_create_info.subresourceRange.layerCount = 1;
2087 image_view_create_info.subresourceRange.baseMipLevel = 0;
2088 image_view_create_info.subresourceRange.levelCount = 1;
2089 image_view_create_info.subresourceRange.aspectMask =
2090 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002091
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002092 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07002093 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
2094 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002095 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002096 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002097 imageInfo[0].imageView = view;
2098 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2099 imageInfo[1].imageView = view;
2100 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002101 imageInfo[2].imageView = view;
2102 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2103 imageInfo[3].imageView = view;
2104 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002105
2106 static const uint32_t NUM_SET_UPDATES = 3;
2107 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
2108 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2109 descriptor_write[0].dstSet = descriptorSet[0];
2110 descriptor_write[0].dstBinding = 0;
2111 descriptor_write[0].descriptorCount = 5;
2112 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2113 descriptor_write[0].pBufferInfo = buffInfo;
2114 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2115 descriptor_write[1].dstSet = descriptorSet[1];
2116 descriptor_write[1].dstBinding = 0;
2117 descriptor_write[1].descriptorCount = 2;
2118 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2119 descriptor_write[1].pImageInfo = imageInfo;
2120 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2121 descriptor_write[2].dstSet = descriptorSet[1];
2122 descriptor_write[2].dstBinding = 1;
2123 descriptor_write[2].descriptorCount = 2;
2124 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002125 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002126
2127 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002128
Tobin Ehlis88452832015-12-03 09:40:56 -07002129 // Create PSO to be used for draw-time errors below
2130 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002131 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002132 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002133 "out gl_PerVertex {\n"
2134 " vec4 gl_Position;\n"
2135 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002136 "void main(){\n"
2137 " gl_Position = vec4(1);\n"
2138 "}\n";
2139 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002140 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002141 "\n"
2142 "layout(location=0) out vec4 x;\n"
2143 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2144 "void main(){\n"
2145 " x = vec4(bar.y);\n"
2146 "}\n";
2147 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2148 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002149 VkPipelineObj pipe(m_device);
2150 pipe.AddShader(&vs);
2151 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07002152 pipe.AddColorAttachment();
2153 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07002154
2155 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07002156
Karl Schultz6addd812016-02-02 17:17:23 -07002157 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2158 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2159 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
2160 // of PSO
2161 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
2162 // cmd_pipeline.c
2163 // due to the fact that cmd_alloc_dset_data() has not been called in
2164 // cmd_bind_graphics_pipeline()
2165 // TODO : Want to cause various binding incompatibility issues here to test
2166 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07002167 // First cause various verify_layout_compatibility() fails
2168 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002169 // verify_set_layout_compatibility fail cases:
2170 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07002171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2172 " due to: invalid VkPipelineLayout ");
2173 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2174 VK_PIPELINE_BIND_POINT_GRAPHICS,
2175 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
2176 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002177 m_errorMonitor->VerifyFound();
2178
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002179 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07002180 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2181 " attempting to bind set to index 1");
2182 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2183 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
2184 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002185 m_errorMonitor->VerifyFound();
2186
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002187 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002188 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
2189 // descriptors
2190 m_errorMonitor->SetDesiredFailureMsg(
2191 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2192 ", but corresponding set being bound has 5 descriptors.");
2193 vkCmdBindDescriptorSets(
2194 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2195 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002196 m_errorMonitor->VerifyFound();
2197
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002198 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
2199 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07002200 m_errorMonitor->SetDesiredFailureMsg(
2201 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2202 " descriptor from pipelineLayout is type 'VK_DESCRIPTOR_TYPE_SAMPLER'");
2203 vkCmdBindDescriptorSets(
2204 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2205 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002206 m_errorMonitor->VerifyFound();
2207
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002208 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
2209 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07002210 m_errorMonitor->SetDesiredFailureMsg(
2211 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2212 " descriptor from pipelineLayout has stageFlags ");
2213 vkCmdBindDescriptorSets(
2214 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2215 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002216 m_errorMonitor->VerifyFound();
2217
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002218 // Cause INFO messages due to disturbing previously bound Sets
2219 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07002220 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2221 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2222 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002223 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07002224 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002225 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002226 " previously bound as set #0 was disturbed ");
2227 vkCmdBindDescriptorSets(
2228 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2229 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002230 m_errorMonitor->VerifyFound();
2231
Karl Schultz6addd812016-02-02 17:17:23 -07002232 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2233 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2234 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002235 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002237 " newly bound as set #0 so set #1 and "
2238 "any subsequent sets were disturbed ");
2239 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2240 VK_PIPELINE_BIND_POINT_GRAPHICS,
2241 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002242 m_errorMonitor->VerifyFound();
2243
Tobin Ehlis88452832015-12-03 09:40:56 -07002244 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07002245 // 1. Error due to not binding required set (we actually use same code as
2246 // above to disturb set0)
2247 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2248 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2249 2, &descriptorSet[0], 0, NULL);
2250 vkCmdBindDescriptorSets(
2251 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2252 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
2253 m_errorMonitor->SetDesiredFailureMsg(
2254 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2255 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07002256 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002257 m_errorMonitor->VerifyFound();
2258
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002259 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002260 // 2. Error due to bound set not being compatible with PSO's
2261 // VkPipelineLayout (diff stageFlags in this case)
2262 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2263 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2264 2, &descriptorSet[0], 0, NULL);
2265 m_errorMonitor->SetDesiredFailureMsg(
2266 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2267 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07002268 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002269 m_errorMonitor->VerifyFound();
2270
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002271 // Remaining clean-up
2272 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002273 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002274 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
2275 }
2276 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
2277 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
2278 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002279 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2280 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2281}
Tobin Ehlis559c6382015-11-05 09:52:49 -07002282
Karl Schultz6addd812016-02-02 17:17:23 -07002283TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002284
Karl Schultz6addd812016-02-02 17:17:23 -07002285 m_errorMonitor->SetDesiredFailureMsg(
2286 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002287 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002288
2289 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002290 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002291 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002292 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002293
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002294 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002295}
2296
Karl Schultz6addd812016-02-02 17:17:23 -07002297TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
2298 VkResult err;
2299 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002300
Karl Schultz6addd812016-02-02 17:17:23 -07002301 m_errorMonitor->SetDesiredFailureMsg(
2302 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07002303 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002304
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002305 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002306
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002307 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002308 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06002309 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002310 cmd.commandPool = m_commandPool;
2311 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002312 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06002313
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002314 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06002315 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002316
2317 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002318 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002319 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002320 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06002321 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002322 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
2323 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002324 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002325
2326 // The error should be caught by validation of the BeginCommandBuffer call
2327 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
2328
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002329 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002330 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002331}
2332
Karl Schultz6addd812016-02-02 17:17:23 -07002333TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002334 // Cause error due to Begin while recording CB
2335 // Then cause 2 errors for attempting to reset CB w/o having
2336 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
2337 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002339 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002340
2341 ASSERT_NO_FATAL_FAILURE(InitState());
2342
2343 // Calls AllocateCommandBuffers
2344 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
2345
Karl Schultz6addd812016-02-02 17:17:23 -07002346 // Force the failure by setting the Renderpass and Framebuffer fields with
2347 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002348 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002349 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002350 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2351 cmd_buf_info.pNext = NULL;
2352 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002353 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002354
2355 // Begin CB to transition to recording state
2356 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
2357 // Can't re-begin. This should trigger error
2358 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002359 m_errorMonitor->VerifyFound();
2360
Karl Schultz6addd812016-02-02 17:17:23 -07002361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2362 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002363 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
2364 // Reset attempt will trigger error due to incorrect CommandPool state
2365 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002366 m_errorMonitor->VerifyFound();
2367
Karl Schultz6addd812016-02-02 17:17:23 -07002368 m_errorMonitor->SetDesiredFailureMsg(
2369 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2370 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002371 // Transition CB to RECORDED state
2372 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
2373 // Now attempting to Begin will implicitly reset, which triggers error
2374 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002375 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002376}
2377
Karl Schultz6addd812016-02-02 17:17:23 -07002378TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002379 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07002380 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002381
Karl Schultz6addd812016-02-02 17:17:23 -07002382 m_errorMonitor->SetDesiredFailureMsg(
2383 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002384 "Invalid Pipeline CreateInfo State: Vtx Shader required");
2385
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002386 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002387 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002388
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002389 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002390 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2391 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002392
2393 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002394 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2395 ds_pool_ci.pNext = NULL;
2396 ds_pool_ci.maxSets = 1;
2397 ds_pool_ci.poolSizeCount = 1;
2398 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002399
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002400 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002401 err =
2402 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002403 ASSERT_VK_SUCCESS(err);
2404
Tony Barboureb254902015-07-15 12:50:33 -06002405 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002406 dsl_binding.binding = 0;
2407 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2408 dsl_binding.descriptorCount = 1;
2409 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2410 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002411
Tony Barboureb254902015-07-15 12:50:33 -06002412 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002413 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2414 ds_layout_ci.pNext = NULL;
2415 ds_layout_ci.bindingCount = 1;
2416 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06002417
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002418 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002419 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2420 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002421 ASSERT_VK_SUCCESS(err);
2422
2423 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002424 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002425 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002426 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002427 alloc_info.descriptorPool = ds_pool;
2428 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002429 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2430 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002431 ASSERT_VK_SUCCESS(err);
2432
Tony Barboureb254902015-07-15 12:50:33 -06002433 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002434 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2435 pipeline_layout_ci.setLayoutCount = 1;
2436 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002437
2438 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002439 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2440 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002441 ASSERT_VK_SUCCESS(err);
2442
Tobin Ehlise68360f2015-10-01 11:15:13 -06002443 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07002444 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06002445
2446 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002447 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2448 vp_state_ci.scissorCount = 1;
2449 vp_state_ci.pScissors = &sc;
2450 vp_state_ci.viewportCount = 1;
2451 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002452
Karl Schultzdfdb8d42016-03-08 10:30:21 -07002453 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
2454 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
2455 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
2456 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
2457 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
2458 rs_state_ci.depthClampEnable = VK_FALSE;
2459 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
2460 rs_state_ci.depthBiasEnable = VK_FALSE;
2461
Tony Barboureb254902015-07-15 12:50:33 -06002462 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002463 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2464 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07002465 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07002466 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2467 gp_ci.layout = pipeline_layout;
2468 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06002469
2470 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002471 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2472 pc_ci.initialDataSize = 0;
2473 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002474
2475 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06002476 VkPipelineCache pipelineCache;
2477
Karl Schultz6addd812016-02-02 17:17:23 -07002478 err =
2479 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06002480 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002481 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2482 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002483
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002484 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002485
Chia-I Wuf7458c52015-10-26 21:10:41 +08002486 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2487 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2488 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2489 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002490}
Tobin Ehlis912df022015-09-17 08:46:18 -06002491/*// TODO : This test should be good, but needs Tess support in compiler to run
2492TEST_F(VkLayerTest, InvalidPatchControlPoints)
2493{
2494 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06002495 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002496
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002498 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
2499primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002500
Tobin Ehlis912df022015-09-17 08:46:18 -06002501 ASSERT_NO_FATAL_FAILURE(InitState());
2502 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06002503
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002504 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06002505 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002506 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002507
2508 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2509 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2510 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002511 ds_pool_ci.poolSizeCount = 1;
2512 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06002513
2514 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002515 err = vkCreateDescriptorPool(m_device->device(),
2516VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06002517 ASSERT_VK_SUCCESS(err);
2518
2519 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08002520 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06002521 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08002522 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002523 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2524 dsl_binding.pImmutableSamplers = NULL;
2525
2526 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002527 ds_layout_ci.sType =
2528VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06002529 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002530 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002531 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06002532
2533 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002534 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2535&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06002536 ASSERT_VK_SUCCESS(err);
2537
2538 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07002539 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
2540VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06002541 ASSERT_VK_SUCCESS(err);
2542
2543 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002544 pipeline_layout_ci.sType =
2545VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06002546 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002547 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002548 pipeline_layout_ci.pSetLayouts = &ds_layout;
2549
2550 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002551 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2552&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06002553 ASSERT_VK_SUCCESS(err);
2554
2555 VkPipelineShaderStageCreateInfo shaderStages[3];
2556 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
2557
Karl Schultz6addd812016-02-02 17:17:23 -07002558 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
2559this);
Tobin Ehlis912df022015-09-17 08:46:18 -06002560 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07002561 VkShaderObj
2562tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
2563this);
2564 VkShaderObj
2565te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
2566this);
Tobin Ehlis912df022015-09-17 08:46:18 -06002567
Karl Schultz6addd812016-02-02 17:17:23 -07002568 shaderStages[0].sType =
2569VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002570 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002571 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07002572 shaderStages[1].sType =
2573VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002574 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002575 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07002576 shaderStages[2].sType =
2577VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002578 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002579 shaderStages[2].shader = te.handle();
2580
2581 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002582 iaCI.sType =
2583VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08002584 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06002585
2586 VkPipelineTessellationStateCreateInfo tsCI = {};
2587 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
2588 tsCI.patchControlPoints = 0; // This will cause an error
2589
2590 VkGraphicsPipelineCreateInfo gp_ci = {};
2591 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2592 gp_ci.pNext = NULL;
2593 gp_ci.stageCount = 3;
2594 gp_ci.pStages = shaderStages;
2595 gp_ci.pVertexInputState = NULL;
2596 gp_ci.pInputAssemblyState = &iaCI;
2597 gp_ci.pTessellationState = &tsCI;
2598 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002599 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06002600 gp_ci.pMultisampleState = NULL;
2601 gp_ci.pDepthStencilState = NULL;
2602 gp_ci.pColorBlendState = NULL;
2603 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2604 gp_ci.layout = pipeline_layout;
2605 gp_ci.renderPass = renderPass();
2606
2607 VkPipelineCacheCreateInfo pc_ci = {};
2608 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2609 pc_ci.pNext = NULL;
2610 pc_ci.initialSize = 0;
2611 pc_ci.initialData = 0;
2612 pc_ci.maxSize = 0;
2613
2614 VkPipeline pipeline;
2615 VkPipelineCache pipelineCache;
2616
Karl Schultz6addd812016-02-02 17:17:23 -07002617 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
2618&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06002619 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002620 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2621&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06002622
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002623 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002624
Chia-I Wuf7458c52015-10-26 21:10:41 +08002625 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2626 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2627 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2628 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06002629}
2630*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06002631// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07002632TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07002633 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002634
Karl Schultz6addd812016-02-02 17:17:23 -07002635 m_errorMonitor->SetDesiredFailureMsg(
2636 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002637 "Gfx Pipeline viewport count (1) must match scissor count (0).");
2638
Tobin Ehlise68360f2015-10-01 11:15:13 -06002639 ASSERT_NO_FATAL_FAILURE(InitState());
2640 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06002641
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002642 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002643 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2644 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002645
2646 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002647 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2648 ds_pool_ci.maxSets = 1;
2649 ds_pool_ci.poolSizeCount = 1;
2650 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002651
2652 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002653 err =
2654 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002655 ASSERT_VK_SUCCESS(err);
2656
2657 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002658 dsl_binding.binding = 0;
2659 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2660 dsl_binding.descriptorCount = 1;
2661 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002662
2663 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002664 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2665 ds_layout_ci.bindingCount = 1;
2666 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002667
2668 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002669 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2670 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002671 ASSERT_VK_SUCCESS(err);
2672
2673 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002674 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002675 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002676 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002677 alloc_info.descriptorPool = ds_pool;
2678 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002679 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2680 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002681 ASSERT_VK_SUCCESS(err);
2682
2683 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002684 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2685 pipeline_layout_ci.setLayoutCount = 1;
2686 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002687
2688 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002689 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2690 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002691 ASSERT_VK_SUCCESS(err);
2692
2693 VkViewport vp = {}; // Just need dummy vp to point to
2694
2695 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002696 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2697 vp_state_ci.scissorCount = 0;
2698 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
2699 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002700
Karl Schultzdfdb8d42016-03-08 10:30:21 -07002701 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
2702 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
2703 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
2704 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
2705 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
2706 rs_state_ci.depthClampEnable = VK_FALSE;
2707 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
2708 rs_state_ci.depthBiasEnable = VK_FALSE;
2709
Cody Northropeb3a6c12015-10-05 14:44:45 -06002710 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07002711 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06002712
Karl Schultz6addd812016-02-02 17:17:23 -07002713 VkShaderObj vs(m_device, bindStateVertShaderText,
2714 VK_SHADER_STAGE_VERTEX_BIT, this);
2715 VkShaderObj fs(m_device, bindStateFragShaderText,
2716 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06002717 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07002718 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08002719 shaderStages[0] = vs.GetStageCreateInfo();
2720 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002721
2722 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002723 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2724 gp_ci.stageCount = 2;
2725 gp_ci.pStages = shaderStages;
2726 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07002727 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07002728 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2729 gp_ci.layout = pipeline_layout;
2730 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002731
2732 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002733 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002734
2735 VkPipeline pipeline;
2736 VkPipelineCache pipelineCache;
2737
Karl Schultz6addd812016-02-02 17:17:23 -07002738 err =
2739 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002740 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002741 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2742 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002743
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002744 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002745
Chia-I Wuf7458c52015-10-26 21:10:41 +08002746 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2747 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2748 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2749 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002750}
Karl Schultz6addd812016-02-02 17:17:23 -07002751// Don't set viewport state in PSO. This is an error b/c we always need this
2752// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06002753// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07002754TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06002755 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07002756 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002757
Karl Schultz6addd812016-02-02 17:17:23 -07002758 m_errorMonitor->SetDesiredFailureMsg(
2759 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002760 "Gfx Pipeline pViewportState is null. Even if ");
2761
Tobin Ehlise68360f2015-10-01 11:15:13 -06002762 ASSERT_NO_FATAL_FAILURE(InitState());
2763 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06002764
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002765 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002766 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2767 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002768
2769 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002770 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2771 ds_pool_ci.maxSets = 1;
2772 ds_pool_ci.poolSizeCount = 1;
2773 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002774
2775 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002776 err =
2777 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002778 ASSERT_VK_SUCCESS(err);
2779
2780 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002781 dsl_binding.binding = 0;
2782 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2783 dsl_binding.descriptorCount = 1;
2784 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002785
2786 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002787 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2788 ds_layout_ci.bindingCount = 1;
2789 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002790
2791 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002792 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2793 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002794 ASSERT_VK_SUCCESS(err);
2795
2796 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002797 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002798 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002799 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002800 alloc_info.descriptorPool = ds_pool;
2801 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002802 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2803 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002804 ASSERT_VK_SUCCESS(err);
2805
2806 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002807 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2808 pipeline_layout_ci.setLayoutCount = 1;
2809 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002810
2811 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002812 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2813 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002814 ASSERT_VK_SUCCESS(err);
2815
2816 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
2817 // Set scissor as dynamic to avoid second error
2818 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002819 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
2820 dyn_state_ci.dynamicStateCount = 1;
2821 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002822
Cody Northropeb3a6c12015-10-05 14:44:45 -06002823 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07002824 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06002825
Karl Schultz6addd812016-02-02 17:17:23 -07002826 VkShaderObj vs(m_device, bindStateVertShaderText,
2827 VK_SHADER_STAGE_VERTEX_BIT, this);
2828 VkShaderObj fs(m_device, bindStateFragShaderText,
2829 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06002830 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07002831 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08002832 shaderStages[0] = vs.GetStageCreateInfo();
2833 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002834
Karl Schultzdfdb8d42016-03-08 10:30:21 -07002835
2836 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
2837 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
2838 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
2839 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
2840 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
2841 rs_state_ci.depthClampEnable = VK_FALSE;
2842 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
2843 rs_state_ci.depthBiasEnable = VK_FALSE;
2844
Tobin Ehlise68360f2015-10-01 11:15:13 -06002845 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002846 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2847 gp_ci.stageCount = 2;
2848 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07002849 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07002850 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
2851 // should cause validation error
2852 gp_ci.pDynamicState = &dyn_state_ci;
2853 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2854 gp_ci.layout = pipeline_layout;
2855 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002856
2857 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002858 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002859
2860 VkPipeline pipeline;
2861 VkPipelineCache pipelineCache;
2862
Karl Schultz6addd812016-02-02 17:17:23 -07002863 err =
2864 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002865 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002866 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2867 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002868
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002869 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002870
Chia-I Wuf7458c52015-10-26 21:10:41 +08002871 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2872 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2873 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2874 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002875}
2876// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07002877// Then run second test where dynamic scissor count doesn't match PSO scissor
2878// count
2879TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
2880 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002881
Karl Schultz6addd812016-02-02 17:17:23 -07002882 m_errorMonitor->SetDesiredFailureMsg(
2883 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002884 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
2885
Tobin Ehlise68360f2015-10-01 11:15:13 -06002886 ASSERT_NO_FATAL_FAILURE(InitState());
2887 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06002888
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002889 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002890 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2891 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002892
2893 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002894 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2895 ds_pool_ci.maxSets = 1;
2896 ds_pool_ci.poolSizeCount = 1;
2897 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002898
2899 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002900 err =
2901 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002902 ASSERT_VK_SUCCESS(err);
2903
2904 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002905 dsl_binding.binding = 0;
2906 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2907 dsl_binding.descriptorCount = 1;
2908 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002909
2910 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002911 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2912 ds_layout_ci.bindingCount = 1;
2913 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002914
2915 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002916 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2917 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002918 ASSERT_VK_SUCCESS(err);
2919
2920 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002921 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002922 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002923 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002924 alloc_info.descriptorPool = ds_pool;
2925 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002926 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2927 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002928 ASSERT_VK_SUCCESS(err);
2929
2930 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002931 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2932 pipeline_layout_ci.setLayoutCount = 1;
2933 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002934
2935 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002936 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2937 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002938 ASSERT_VK_SUCCESS(err);
2939
2940 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002941 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2942 vp_state_ci.viewportCount = 1;
2943 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
2944 vp_state_ci.scissorCount = 1;
2945 vp_state_ci.pScissors =
2946 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06002947
2948 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
2949 // Set scissor as dynamic to avoid that error
2950 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002951 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
2952 dyn_state_ci.dynamicStateCount = 1;
2953 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002954
Cody Northropeb3a6c12015-10-05 14:44:45 -06002955 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07002956 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06002957
Karl Schultz6addd812016-02-02 17:17:23 -07002958 VkShaderObj vs(m_device, bindStateVertShaderText,
2959 VK_SHADER_STAGE_VERTEX_BIT, this);
2960 VkShaderObj fs(m_device, bindStateFragShaderText,
2961 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06002962 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07002963 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08002964 shaderStages[0] = vs.GetStageCreateInfo();
2965 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002966
Cody Northropf6622dc2015-10-06 10:33:21 -06002967 VkPipelineVertexInputStateCreateInfo vi_ci = {};
2968 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
2969 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002970 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06002971 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002972 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06002973 vi_ci.pVertexAttributeDescriptions = nullptr;
2974
2975 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
2976 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
2977 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
2978
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002979 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002980 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06002981 rs_ci.pNext = nullptr;
2982
Mark Youngc89c6312016-03-31 16:03:20 -06002983 VkPipelineColorBlendAttachmentState att = {};
2984 att.blendEnable = VK_FALSE;
2985 att.colorWriteMask = 0xf;
2986
Cody Northropf6622dc2015-10-06 10:33:21 -06002987 VkPipelineColorBlendStateCreateInfo cb_ci = {};
2988 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
2989 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06002990 cb_ci.attachmentCount = 1;
2991 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06002992
Tobin Ehlise68360f2015-10-01 11:15:13 -06002993 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002994 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2995 gp_ci.stageCount = 2;
2996 gp_ci.pStages = shaderStages;
2997 gp_ci.pVertexInputState = &vi_ci;
2998 gp_ci.pInputAssemblyState = &ia_ci;
2999 gp_ci.pViewportState = &vp_state_ci;
3000 gp_ci.pRasterizationState = &rs_ci;
3001 gp_ci.pColorBlendState = &cb_ci;
3002 gp_ci.pDynamicState = &dyn_state_ci;
3003 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3004 gp_ci.layout = pipeline_layout;
3005 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003006
3007 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003008 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003009
3010 VkPipeline pipeline;
3011 VkPipelineCache pipelineCache;
3012
Karl Schultz6addd812016-02-02 17:17:23 -07003013 err =
3014 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003015 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003016 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3017 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003018
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003019 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003020
Tobin Ehlisd332f282015-10-02 11:00:56 -06003021 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07003022 // First need to successfully create the PSO from above by setting
3023 // pViewports
3024 m_errorMonitor->SetDesiredFailureMsg(
3025 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3026 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
3027 "scissorCount is 1. These counts must match.");
3028
3029 VkViewport vp = {}; // Just need dummy vp to point to
3030 vp_state_ci.pViewports = &vp;
3031 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3032 &gp_ci, NULL, &pipeline);
3033 ASSERT_VK_SUCCESS(err);
3034 BeginCommandBuffer();
3035 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3036 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3037 VkRect2D scissors[2] = {}; // don't care about data
3038 // Count of 2 doesn't match PSO count of 1
3039 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
3040 Draw(1, 0, 0, 0);
3041
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003042 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07003043
3044 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3045 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3046 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3047 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3048}
3049// Create PSO w/o non-zero scissorCount but no scissor data
3050// Then run second test where dynamic viewportCount doesn't match PSO
3051// viewportCount
3052TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
3053 VkResult err;
3054
3055 m_errorMonitor->SetDesiredFailureMsg(
3056 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3057 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
3058
3059 ASSERT_NO_FATAL_FAILURE(InitState());
3060 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3061
3062 VkDescriptorPoolSize ds_type_count = {};
3063 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3064 ds_type_count.descriptorCount = 1;
3065
3066 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3067 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3068 ds_pool_ci.maxSets = 1;
3069 ds_pool_ci.poolSizeCount = 1;
3070 ds_pool_ci.pPoolSizes = &ds_type_count;
3071
3072 VkDescriptorPool ds_pool;
3073 err =
3074 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
3075 ASSERT_VK_SUCCESS(err);
3076
3077 VkDescriptorSetLayoutBinding dsl_binding = {};
3078 dsl_binding.binding = 0;
3079 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3080 dsl_binding.descriptorCount = 1;
3081 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3082
3083 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3084 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3085 ds_layout_ci.bindingCount = 1;
3086 ds_layout_ci.pBindings = &dsl_binding;
3087
3088 VkDescriptorSetLayout ds_layout;
3089 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3090 &ds_layout);
3091 ASSERT_VK_SUCCESS(err);
3092
3093 VkDescriptorSet descriptorSet;
3094 VkDescriptorSetAllocateInfo alloc_info = {};
3095 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3096 alloc_info.descriptorSetCount = 1;
3097 alloc_info.descriptorPool = ds_pool;
3098 alloc_info.pSetLayouts = &ds_layout;
3099 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3100 &descriptorSet);
3101 ASSERT_VK_SUCCESS(err);
3102
3103 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3104 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3105 pipeline_layout_ci.setLayoutCount = 1;
3106 pipeline_layout_ci.pSetLayouts = &ds_layout;
3107
3108 VkPipelineLayout pipeline_layout;
3109 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3110 &pipeline_layout);
3111 ASSERT_VK_SUCCESS(err);
3112
3113 VkPipelineViewportStateCreateInfo vp_state_ci = {};
3114 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3115 vp_state_ci.scissorCount = 1;
3116 vp_state_ci.pScissors =
3117 NULL; // Null scissor w/ count of 1 should cause error
3118 vp_state_ci.viewportCount = 1;
3119 vp_state_ci.pViewports =
3120 NULL; // vp is dynamic (below) so this won't cause error
3121
3122 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
3123 // Set scissor as dynamic to avoid that error
3124 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
3125 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3126 dyn_state_ci.dynamicStateCount = 1;
3127 dyn_state_ci.pDynamicStates = &vp_state;
3128
3129 VkPipelineShaderStageCreateInfo shaderStages[2];
3130 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
3131
3132 VkShaderObj vs(m_device, bindStateVertShaderText,
3133 VK_SHADER_STAGE_VERTEX_BIT, this);
3134 VkShaderObj fs(m_device, bindStateFragShaderText,
3135 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003136 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003137 // but add it to be able to run on more devices
3138 shaderStages[0] = vs.GetStageCreateInfo();
3139 shaderStages[1] = fs.GetStageCreateInfo();
3140
3141 VkPipelineVertexInputStateCreateInfo vi_ci = {};
3142 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3143 vi_ci.pNext = nullptr;
3144 vi_ci.vertexBindingDescriptionCount = 0;
3145 vi_ci.pVertexBindingDescriptions = nullptr;
3146 vi_ci.vertexAttributeDescriptionCount = 0;
3147 vi_ci.pVertexAttributeDescriptions = nullptr;
3148
3149 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
3150 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
3151 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3152
3153 VkPipelineRasterizationStateCreateInfo rs_ci = {};
3154 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3155 rs_ci.pNext = nullptr;
3156
Mark Youngc89c6312016-03-31 16:03:20 -06003157 VkPipelineColorBlendAttachmentState att = {};
3158 att.blendEnable = VK_FALSE;
3159 att.colorWriteMask = 0xf;
3160
Karl Schultz6addd812016-02-02 17:17:23 -07003161 VkPipelineColorBlendStateCreateInfo cb_ci = {};
3162 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
3163 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06003164 cb_ci.attachmentCount = 1;
3165 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07003166
3167 VkGraphicsPipelineCreateInfo gp_ci = {};
3168 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3169 gp_ci.stageCount = 2;
3170 gp_ci.pStages = shaderStages;
3171 gp_ci.pVertexInputState = &vi_ci;
3172 gp_ci.pInputAssemblyState = &ia_ci;
3173 gp_ci.pViewportState = &vp_state_ci;
3174 gp_ci.pRasterizationState = &rs_ci;
3175 gp_ci.pColorBlendState = &cb_ci;
3176 gp_ci.pDynamicState = &dyn_state_ci;
3177 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3178 gp_ci.layout = pipeline_layout;
3179 gp_ci.renderPass = renderPass();
3180
3181 VkPipelineCacheCreateInfo pc_ci = {};
3182 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3183
3184 VkPipeline pipeline;
3185 VkPipelineCache pipelineCache;
3186
3187 err =
3188 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
3189 ASSERT_VK_SUCCESS(err);
3190 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3191 &gp_ci, NULL, &pipeline);
3192
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003193 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07003194
3195 // Now hit second fail case where we set scissor w/ different count than PSO
3196 // First need to successfully create the PSO from above by setting
3197 // pViewports
3198 m_errorMonitor->SetDesiredFailureMsg(
3199 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3200 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
3201 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003202
Tobin Ehlisd332f282015-10-02 11:00:56 -06003203 VkRect2D sc = {}; // Just need dummy vp to point to
3204 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07003205 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3206 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003207 ASSERT_VK_SUCCESS(err);
3208 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003209 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3210 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003211 VkViewport viewports[2] = {}; // don't care about data
3212 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07003213 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003214 Draw(1, 0, 0, 0);
3215
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003216 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003217
Chia-I Wuf7458c52015-10-26 21:10:41 +08003218 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3219 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3220 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3221 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003222}
3223
Karl Schultz6addd812016-02-02 17:17:23 -07003224TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003225 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003226 m_errorMonitor->SetDesiredFailureMsg(
3227 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003228 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003229
3230 ASSERT_NO_FATAL_FAILURE(InitState());
3231 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003232
Tony Barbourfe3351b2015-07-28 10:17:20 -06003233 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003234 // Don't care about RenderPass handle b/c error should be flagged before
3235 // that
3236 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
3237 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003238
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003239 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003240}
3241
Karl Schultz6addd812016-02-02 17:17:23 -07003242TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003243 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003244 m_errorMonitor->SetDesiredFailureMsg(
3245 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003246 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003247
3248 ASSERT_NO_FATAL_FAILURE(InitState());
3249 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003250
Tony Barbourfe3351b2015-07-28 10:17:20 -06003251 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003252 // Just create a dummy Renderpass that's non-NULL so we can get to the
3253 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06003254 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003255 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
3256 rp_begin.pNext = NULL;
3257 rp_begin.renderPass = renderPass();
3258 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003259
Karl Schultz6addd812016-02-02 17:17:23 -07003260 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
3261 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003262
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003263 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003264}
3265
Karl Schultz6addd812016-02-02 17:17:23 -07003266TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003267 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07003268 m_errorMonitor->SetDesiredFailureMsg(
3269 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003270 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003271
3272 ASSERT_NO_FATAL_FAILURE(InitState());
3273 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003274
3275 // Renderpass is started here
3276 BeginCommandBuffer();
3277
3278 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003279 vk_testing::Buffer dstBuffer;
3280 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003281
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003282 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003283
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003284 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003285}
3286
Karl Schultz6addd812016-02-02 17:17:23 -07003287TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003288 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07003289 m_errorMonitor->SetDesiredFailureMsg(
3290 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003291 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003292
3293 ASSERT_NO_FATAL_FAILURE(InitState());
3294 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003295
3296 // Renderpass is started here
3297 BeginCommandBuffer();
3298
3299 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003300 vk_testing::Buffer dstBuffer;
3301 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003302
Karl Schultz6addd812016-02-02 17:17:23 -07003303 VkDeviceSize dstOffset = 0;
3304 VkDeviceSize dataSize = 1024;
3305 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003306
Karl Schultz6addd812016-02-02 17:17:23 -07003307 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
3308 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003309
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003310 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003311}
3312
Karl Schultz6addd812016-02-02 17:17:23 -07003313TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003314 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003315 m_errorMonitor->SetDesiredFailureMsg(
3316 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003317 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003318
3319 ASSERT_NO_FATAL_FAILURE(InitState());
3320 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003321
3322 // Renderpass is started here
3323 BeginCommandBuffer();
3324
Michael Lentine0a369f62016-02-03 16:51:46 -06003325 VkClearColorValue clear_color;
3326 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07003327 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
3328 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3329 const int32_t tex_width = 32;
3330 const int32_t tex_height = 32;
3331 VkImageCreateInfo image_create_info = {};
3332 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3333 image_create_info.pNext = NULL;
3334 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3335 image_create_info.format = tex_format;
3336 image_create_info.extent.width = tex_width;
3337 image_create_info.extent.height = tex_height;
3338 image_create_info.extent.depth = 1;
3339 image_create_info.mipLevels = 1;
3340 image_create_info.arrayLayers = 1;
3341 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3342 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3343 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003344
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003345 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07003346 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
3347 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003348
Karl Schultz6addd812016-02-02 17:17:23 -07003349 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
3350 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003351
Karl Schultz6addd812016-02-02 17:17:23 -07003352 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
3353 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003354
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003355 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003356}
3357
Karl Schultz6addd812016-02-02 17:17:23 -07003358TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003359 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003360 m_errorMonitor->SetDesiredFailureMsg(
3361 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003362 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003363
3364 ASSERT_NO_FATAL_FAILURE(InitState());
3365 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003366
3367 // Renderpass is started here
3368 BeginCommandBuffer();
3369
3370 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07003371 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07003372 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
3373 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3374 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
3375 image_create_info.extent.width = 64;
3376 image_create_info.extent.height = 64;
3377 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3378 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003379
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003380 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07003381 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
3382 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003383
Karl Schultz6addd812016-02-02 17:17:23 -07003384 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
3385 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003386
Karl Schultz6addd812016-02-02 17:17:23 -07003387 vkCmdClearDepthStencilImage(
3388 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
3389 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
3390 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003391
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003392 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003393}
3394
Karl Schultz6addd812016-02-02 17:17:23 -07003395TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06003396 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003397 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003398
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003400 "vkCmdClearAttachments: This call "
3401 "must be issued inside an active "
3402 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003403
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003404 ASSERT_NO_FATAL_FAILURE(InitState());
3405 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003406
3407 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003408 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003409 ASSERT_VK_SUCCESS(err);
3410
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06003411 VkClearAttachment color_attachment;
3412 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3413 color_attachment.clearValue.color.float32[0] = 0;
3414 color_attachment.clearValue.color.float32[1] = 0;
3415 color_attachment.clearValue.color.float32[2] = 0;
3416 color_attachment.clearValue.color.float32[3] = 0;
3417 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07003418 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
3419 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
3420 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003421
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003422 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003423}
3424
Karl Schultz6addd812016-02-02 17:17:23 -07003425TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003426 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003427 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003428
Karl Schultz6addd812016-02-02 17:17:23 -07003429 m_errorMonitor->SetDesiredFailureMsg(
3430 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003431 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
3432
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003433 ASSERT_NO_FATAL_FAILURE(InitState());
3434 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003435 uint32_t qfi = 0;
3436 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003437 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3438 buffCI.size = 1024;
3439 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
3440 buffCI.queueFamilyIndexCount = 1;
3441 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003442
3443 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003444 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003445 ASSERT_VK_SUCCESS(err);
3446
3447 BeginCommandBuffer();
3448 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003449 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3450 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003451 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07003452 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
3453 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003454
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003455 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003456
Chia-I Wuf7458c52015-10-26 21:10:41 +08003457 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003458}
3459
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07003460TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
3461 // Create an out-of-range queueFamilyIndex
3462 m_errorMonitor->SetDesiredFailureMsg(
3463 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06003464 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07003465
3466 ASSERT_NO_FATAL_FAILURE(InitState());
3467 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3468 VkBufferCreateInfo buffCI = {};
3469 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3470 buffCI.size = 1024;
3471 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
3472 buffCI.queueFamilyIndexCount = 1;
3473 // Introduce failure by specifying invalid queue_family_index
3474 uint32_t qfi = 777;
3475 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06003476 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07003477
3478 VkBuffer ib;
3479 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
3480
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003481 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07003482}
3483
Karl Schultz6addd812016-02-02 17:17:23 -07003484TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
3485 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
3486 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003487
Karl Schultz6addd812016-02-02 17:17:23 -07003488 m_errorMonitor->SetDesiredFailureMsg(
3489 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003490 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003491
3492 ASSERT_NO_FATAL_FAILURE(InitState());
3493 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003494
3495 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003496 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003497 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
3498 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003499
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003500 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003501}
3502
Karl Schultz6addd812016-02-02 17:17:23 -07003503TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003504 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07003505 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003506
Karl Schultz6addd812016-02-02 17:17:23 -07003507 m_errorMonitor->SetDesiredFailureMsg(
3508 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
3509 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
3510 "does not match ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003511
Tobin Ehlis3b780662015-05-28 12:11:26 -06003512 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003513 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003514 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003515 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3516 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003517
3518 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003519 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3520 ds_pool_ci.pNext = NULL;
3521 ds_pool_ci.maxSets = 1;
3522 ds_pool_ci.poolSizeCount = 1;
3523 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06003524
Tobin Ehlis3b780662015-05-28 12:11:26 -06003525 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003526 err =
3527 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003528 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06003529 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003530 dsl_binding.binding = 0;
3531 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3532 dsl_binding.descriptorCount = 1;
3533 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3534 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003535
Tony Barboureb254902015-07-15 12:50:33 -06003536 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003537 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3538 ds_layout_ci.pNext = NULL;
3539 ds_layout_ci.bindingCount = 1;
3540 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003541
Tobin Ehlis3b780662015-05-28 12:11:26 -06003542 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003543 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3544 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003545 ASSERT_VK_SUCCESS(err);
3546
3547 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003548 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003549 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003550 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003551 alloc_info.descriptorPool = ds_pool;
3552 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003553 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3554 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003555 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003556
Tony Barboureb254902015-07-15 12:50:33 -06003557 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003558 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3559 sampler_ci.pNext = NULL;
3560 sampler_ci.magFilter = VK_FILTER_NEAREST;
3561 sampler_ci.minFilter = VK_FILTER_NEAREST;
3562 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3563 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3564 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3565 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3566 sampler_ci.mipLodBias = 1.0;
3567 sampler_ci.anisotropyEnable = VK_FALSE;
3568 sampler_ci.maxAnisotropy = 1;
3569 sampler_ci.compareEnable = VK_FALSE;
3570 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3571 sampler_ci.minLod = 1.0;
3572 sampler_ci.maxLod = 1.0;
3573 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3574 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski52ac6582015-09-01 15:42:56 -06003575
Tobin Ehlis3b780662015-05-28 12:11:26 -06003576 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003577 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003578 ASSERT_VK_SUCCESS(err);
3579
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003580 VkDescriptorImageInfo info = {};
3581 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003582
3583 VkWriteDescriptorSet descriptor_write;
3584 memset(&descriptor_write, 0, sizeof(descriptor_write));
3585 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003586 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003587 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003588 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003589 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003590 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003591
3592 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3593
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003594 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003595
Chia-I Wuf7458c52015-10-26 21:10:41 +08003596 vkDestroySampler(m_device->device(), sampler, NULL);
3597 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3598 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003599}
3600
Karl Schultz6addd812016-02-02 17:17:23 -07003601TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003602 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07003603 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003604
Karl Schultz6addd812016-02-02 17:17:23 -07003605 m_errorMonitor->SetDesiredFailureMsg(
3606 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
3607 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
3608 "is out of bounds for matching binding");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003609
Tobin Ehlis3b780662015-05-28 12:11:26 -06003610 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003611 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003612 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003613 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3614 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003615
3616 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003617 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3618 ds_pool_ci.pNext = NULL;
3619 ds_pool_ci.maxSets = 1;
3620 ds_pool_ci.poolSizeCount = 1;
3621 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06003622
Tobin Ehlis3b780662015-05-28 12:11:26 -06003623 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003624 err =
3625 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003626 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003627
Tony Barboureb254902015-07-15 12:50:33 -06003628 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003629 dsl_binding.binding = 0;
3630 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3631 dsl_binding.descriptorCount = 1;
3632 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3633 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06003634
3635 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003636 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3637 ds_layout_ci.pNext = NULL;
3638 ds_layout_ci.bindingCount = 1;
3639 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003640
Tobin Ehlis3b780662015-05-28 12:11:26 -06003641 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003642 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3643 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003644 ASSERT_VK_SUCCESS(err);
3645
3646 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003647 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003648 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003649 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003650 alloc_info.descriptorPool = ds_pool;
3651 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003652 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3653 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003654 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003655
Tony Barboureb254902015-07-15 12:50:33 -06003656 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003657 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3658 sampler_ci.pNext = NULL;
3659 sampler_ci.magFilter = VK_FILTER_NEAREST;
3660 sampler_ci.minFilter = VK_FILTER_NEAREST;
3661 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3662 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3663 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3664 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3665 sampler_ci.mipLodBias = 1.0;
3666 sampler_ci.anisotropyEnable = VK_FALSE;
3667 sampler_ci.maxAnisotropy = 1;
3668 sampler_ci.compareEnable = VK_FALSE;
3669 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3670 sampler_ci.minLod = 1.0;
3671 sampler_ci.maxLod = 1.0;
3672 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3673 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06003674
Tobin Ehlis3b780662015-05-28 12:11:26 -06003675 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003676 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003677 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003678
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003679 VkDescriptorImageInfo info = {};
3680 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003681
3682 VkWriteDescriptorSet descriptor_write;
3683 memset(&descriptor_write, 0, sizeof(descriptor_write));
3684 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003685 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003686 descriptor_write.dstArrayElement =
3687 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08003688 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003689 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003690 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003691 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003692
3693 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3694
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003695 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003696
Chia-I Wuf7458c52015-10-26 21:10:41 +08003697 vkDestroySampler(m_device->device(), sampler, NULL);
3698 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3699 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003700}
3701
Karl Schultz6addd812016-02-02 17:17:23 -07003702TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
3703 // Create layout w/ count of 1 and attempt update to that layout w/ binding
3704 // index 2
3705 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003706
Karl Schultz6addd812016-02-02 17:17:23 -07003707 m_errorMonitor->SetDesiredFailureMsg(
3708 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003709 " does not have binding to match update binding ");
3710
Tobin Ehlis3b780662015-05-28 12:11:26 -06003711 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003712 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003713 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003714 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3715 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003716
3717 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003718 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3719 ds_pool_ci.pNext = NULL;
3720 ds_pool_ci.maxSets = 1;
3721 ds_pool_ci.poolSizeCount = 1;
3722 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06003723
Tobin Ehlis3b780662015-05-28 12:11:26 -06003724 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003725 err =
3726 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003727 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003728
Tony Barboureb254902015-07-15 12:50:33 -06003729 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003730 dsl_binding.binding = 0;
3731 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3732 dsl_binding.descriptorCount = 1;
3733 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3734 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06003735
3736 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003737 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3738 ds_layout_ci.pNext = NULL;
3739 ds_layout_ci.bindingCount = 1;
3740 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003741 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003742 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3743 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003744 ASSERT_VK_SUCCESS(err);
3745
3746 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003747 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003748 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003749 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003750 alloc_info.descriptorPool = ds_pool;
3751 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003752 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3753 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003754 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003755
Tony Barboureb254902015-07-15 12:50:33 -06003756 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003757 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3758 sampler_ci.pNext = NULL;
3759 sampler_ci.magFilter = VK_FILTER_NEAREST;
3760 sampler_ci.minFilter = VK_FILTER_NEAREST;
3761 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3762 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3763 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3764 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3765 sampler_ci.mipLodBias = 1.0;
3766 sampler_ci.anisotropyEnable = VK_FALSE;
3767 sampler_ci.maxAnisotropy = 1;
3768 sampler_ci.compareEnable = VK_FALSE;
3769 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3770 sampler_ci.minLod = 1.0;
3771 sampler_ci.maxLod = 1.0;
3772 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3773 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06003774
Tobin Ehlis3b780662015-05-28 12:11:26 -06003775 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003776 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003777 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003778
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003779 VkDescriptorImageInfo info = {};
3780 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003781
3782 VkWriteDescriptorSet descriptor_write;
3783 memset(&descriptor_write, 0, sizeof(descriptor_write));
3784 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003785 descriptor_write.dstSet = descriptorSet;
3786 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003787 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003788 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003789 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003790 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003791
3792 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3793
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003794 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003795
Chia-I Wuf7458c52015-10-26 21:10:41 +08003796 vkDestroySampler(m_device->device(), sampler, NULL);
3797 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3798 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003799}
3800
Karl Schultz6addd812016-02-02 17:17:23 -07003801TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
3802 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
3803 // types
3804 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003805
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003807 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003808
Tobin Ehlis3b780662015-05-28 12:11:26 -06003809 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003810
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003811 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003812 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3813 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003814
3815 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003816 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3817 ds_pool_ci.pNext = NULL;
3818 ds_pool_ci.maxSets = 1;
3819 ds_pool_ci.poolSizeCount = 1;
3820 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06003821
Tobin Ehlis3b780662015-05-28 12:11:26 -06003822 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003823 err =
3824 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003825 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06003826 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003827 dsl_binding.binding = 0;
3828 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3829 dsl_binding.descriptorCount = 1;
3830 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3831 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003832
Tony Barboureb254902015-07-15 12:50:33 -06003833 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003834 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3835 ds_layout_ci.pNext = NULL;
3836 ds_layout_ci.bindingCount = 1;
3837 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003838
Tobin Ehlis3b780662015-05-28 12:11:26 -06003839 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003840 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3841 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003842 ASSERT_VK_SUCCESS(err);
3843
3844 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003845 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003846 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003847 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003848 alloc_info.descriptorPool = ds_pool;
3849 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003850 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3851 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003852 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003853
Tony Barboureb254902015-07-15 12:50:33 -06003854 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003855 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3856 sampler_ci.pNext = NULL;
3857 sampler_ci.magFilter = VK_FILTER_NEAREST;
3858 sampler_ci.minFilter = VK_FILTER_NEAREST;
3859 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3860 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3861 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3862 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3863 sampler_ci.mipLodBias = 1.0;
3864 sampler_ci.anisotropyEnable = VK_FALSE;
3865 sampler_ci.maxAnisotropy = 1;
3866 sampler_ci.compareEnable = VK_FALSE;
3867 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3868 sampler_ci.minLod = 1.0;
3869 sampler_ci.maxLod = 1.0;
3870 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3871 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003872 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003873 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003874 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003875
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003876 VkDescriptorImageInfo info = {};
3877 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003878
3879 VkWriteDescriptorSet descriptor_write;
3880 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07003881 descriptor_write.sType =
3882 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003883 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003884 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003885 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003886 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003887 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003888
3889 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3890
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003891 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003892
Chia-I Wuf7458c52015-10-26 21:10:41 +08003893 vkDestroySampler(m_device->device(), sampler, NULL);
3894 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3895 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003896}
3897
Karl Schultz6addd812016-02-02 17:17:23 -07003898TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003899 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07003900 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003901
Karl Schultz6addd812016-02-02 17:17:23 -07003902 m_errorMonitor->SetDesiredFailureMsg(
3903 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003904 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
3905
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003906 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003907 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
3908 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003909 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003910 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3911 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003912
3913 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003914 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3915 ds_pool_ci.pNext = NULL;
3916 ds_pool_ci.maxSets = 1;
3917 ds_pool_ci.poolSizeCount = 1;
3918 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003919
3920 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003921 err =
3922 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003923 ASSERT_VK_SUCCESS(err);
3924
3925 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003926 dsl_binding.binding = 0;
3927 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3928 dsl_binding.descriptorCount = 1;
3929 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3930 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003931
3932 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003933 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3934 ds_layout_ci.pNext = NULL;
3935 ds_layout_ci.bindingCount = 1;
3936 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003937 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003938 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3939 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003940 ASSERT_VK_SUCCESS(err);
3941
3942 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003943 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003944 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003945 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003946 alloc_info.descriptorPool = ds_pool;
3947 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003948 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3949 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003950 ASSERT_VK_SUCCESS(err);
3951
Karl Schultz6addd812016-02-02 17:17:23 -07003952 VkSampler sampler =
3953 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003954
3955 VkDescriptorImageInfo descriptor_info;
3956 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
3957 descriptor_info.sampler = sampler;
3958
3959 VkWriteDescriptorSet descriptor_write;
3960 memset(&descriptor_write, 0, sizeof(descriptor_write));
3961 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003962 descriptor_write.dstSet = descriptorSet;
3963 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003964 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003965 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3966 descriptor_write.pImageInfo = &descriptor_info;
3967
3968 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3969
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003970 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003971
Chia-I Wuf7458c52015-10-26 21:10:41 +08003972 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3973 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003974}
3975
Karl Schultz6addd812016-02-02 17:17:23 -07003976TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
3977 // Create a single combined Image/Sampler descriptor and send it an invalid
3978 // imageView
3979 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003980
Karl Schultz6addd812016-02-02 17:17:23 -07003981 m_errorMonitor->SetDesiredFailureMsg(
3982 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003983 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
3984
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003985 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003986 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003987 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
3988 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003989
3990 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003991 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3992 ds_pool_ci.pNext = NULL;
3993 ds_pool_ci.maxSets = 1;
3994 ds_pool_ci.poolSizeCount = 1;
3995 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003996
3997 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003998 err =
3999 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004000 ASSERT_VK_SUCCESS(err);
4001
4002 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004003 dsl_binding.binding = 0;
4004 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4005 dsl_binding.descriptorCount = 1;
4006 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4007 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004008
4009 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004010 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4011 ds_layout_ci.pNext = NULL;
4012 ds_layout_ci.bindingCount = 1;
4013 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004014 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004015 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4016 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004017 ASSERT_VK_SUCCESS(err);
4018
4019 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004020 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004021 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004022 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004023 alloc_info.descriptorPool = ds_pool;
4024 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004025 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4026 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004027 ASSERT_VK_SUCCESS(err);
4028
4029 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004030 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4031 sampler_ci.pNext = NULL;
4032 sampler_ci.magFilter = VK_FILTER_NEAREST;
4033 sampler_ci.minFilter = VK_FILTER_NEAREST;
4034 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4035 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4036 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4037 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4038 sampler_ci.mipLodBias = 1.0;
4039 sampler_ci.anisotropyEnable = VK_FALSE;
4040 sampler_ci.maxAnisotropy = 1;
4041 sampler_ci.compareEnable = VK_FALSE;
4042 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4043 sampler_ci.minLod = 1.0;
4044 sampler_ci.maxLod = 1.0;
4045 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4046 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004047
4048 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004049 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004050 ASSERT_VK_SUCCESS(err);
4051
Karl Schultz6addd812016-02-02 17:17:23 -07004052 VkImageView view =
4053 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004054
4055 VkDescriptorImageInfo descriptor_info;
4056 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
4057 descriptor_info.sampler = sampler;
4058 descriptor_info.imageView = view;
4059
4060 VkWriteDescriptorSet descriptor_write;
4061 memset(&descriptor_write, 0, sizeof(descriptor_write));
4062 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004063 descriptor_write.dstSet = descriptorSet;
4064 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004065 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004066 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4067 descriptor_write.pImageInfo = &descriptor_info;
4068
4069 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4070
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004071 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004072
Chia-I Wuf7458c52015-10-26 21:10:41 +08004073 vkDestroySampler(m_device->device(), sampler, NULL);
4074 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4075 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004076}
4077
Karl Schultz6addd812016-02-02 17:17:23 -07004078TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
4079 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
4080 // into the other
4081 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004082
Karl Schultz6addd812016-02-02 17:17:23 -07004083 m_errorMonitor->SetDesiredFailureMsg(
4084 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Copy descriptor update index 0, update "
4085 "count #1, has src update descriptor "
4086 "type VK_DESCRIPTOR_TYPE_SAMPLER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004087
Tobin Ehlis04356f92015-10-27 16:35:27 -06004088 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004089 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004090 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004091 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4092 ds_type_count[0].descriptorCount = 1;
4093 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
4094 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004095
4096 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004097 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4098 ds_pool_ci.pNext = NULL;
4099 ds_pool_ci.maxSets = 1;
4100 ds_pool_ci.poolSizeCount = 2;
4101 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004102
4103 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004104 err =
4105 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004106 ASSERT_VK_SUCCESS(err);
4107 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004108 dsl_binding[0].binding = 0;
4109 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4110 dsl_binding[0].descriptorCount = 1;
4111 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4112 dsl_binding[0].pImmutableSamplers = NULL;
4113 dsl_binding[1].binding = 1;
4114 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4115 dsl_binding[1].descriptorCount = 1;
4116 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
4117 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004118
4119 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004120 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4121 ds_layout_ci.pNext = NULL;
4122 ds_layout_ci.bindingCount = 2;
4123 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004124
4125 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004126 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4127 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004128 ASSERT_VK_SUCCESS(err);
4129
4130 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004131 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004132 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004133 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004134 alloc_info.descriptorPool = ds_pool;
4135 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004136 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4137 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004138 ASSERT_VK_SUCCESS(err);
4139
4140 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004141 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4142 sampler_ci.pNext = NULL;
4143 sampler_ci.magFilter = VK_FILTER_NEAREST;
4144 sampler_ci.minFilter = VK_FILTER_NEAREST;
4145 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4146 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4147 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4148 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4149 sampler_ci.mipLodBias = 1.0;
4150 sampler_ci.anisotropyEnable = VK_FALSE;
4151 sampler_ci.maxAnisotropy = 1;
4152 sampler_ci.compareEnable = VK_FALSE;
4153 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4154 sampler_ci.minLod = 1.0;
4155 sampler_ci.maxLod = 1.0;
4156 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4157 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004158
4159 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004160 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004161 ASSERT_VK_SUCCESS(err);
4162
4163 VkDescriptorImageInfo info = {};
4164 info.sampler = sampler;
4165
4166 VkWriteDescriptorSet descriptor_write;
4167 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
4168 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004169 descriptor_write.dstSet = descriptorSet;
4170 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08004171 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004172 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4173 descriptor_write.pImageInfo = &info;
4174 // This write update should succeed
4175 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4176 // Now perform a copy update that fails due to type mismatch
4177 VkCopyDescriptorSet copy_ds_update;
4178 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4179 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4180 copy_ds_update.srcSet = descriptorSet;
4181 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004182 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004183 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08004184 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06004185 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4186
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004187 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06004188 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07004189 m_errorMonitor->SetDesiredFailureMsg(
4190 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004191 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis04356f92015-10-27 16:35:27 -06004192 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4193 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4194 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004195 copy_ds_update.srcBinding =
4196 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004197 copy_ds_update.dstSet = descriptorSet;
4198 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004199 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06004200 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4201
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004202 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004203
Tobin Ehlis04356f92015-10-27 16:35:27 -06004204 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07004205 m_errorMonitor->SetDesiredFailureMsg(
4206 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004207 "Copy descriptor src update is out of bounds for matching binding 1 ");
4208
Tobin Ehlis04356f92015-10-27 16:35:27 -06004209 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4210 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4211 copy_ds_update.srcSet = descriptorSet;
4212 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004213 copy_ds_update.dstSet = descriptorSet;
4214 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004215 copy_ds_update.descriptorCount =
4216 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06004217 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4218
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004219 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06004220
Chia-I Wuf7458c52015-10-26 21:10:41 +08004221 vkDestroySampler(m_device->device(), sampler, NULL);
4222 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4223 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004224}
4225
Karl Schultz6addd812016-02-02 17:17:23 -07004226TEST_F(VkLayerTest, NumSamplesMismatch) {
4227 // Create CommandBuffer where MSAA samples doesn't match RenderPass
4228 // sampleCount
4229 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004230
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004232 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004233
Tobin Ehlis3b780662015-05-28 12:11:26 -06004234 ASSERT_NO_FATAL_FAILURE(InitState());
4235 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004236 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06004237 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004238 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004239
4240 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004241 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4242 ds_pool_ci.pNext = NULL;
4243 ds_pool_ci.maxSets = 1;
4244 ds_pool_ci.poolSizeCount = 1;
4245 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004246
Tobin Ehlis3b780662015-05-28 12:11:26 -06004247 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004248 err =
4249 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004250 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004251
Tony Barboureb254902015-07-15 12:50:33 -06004252 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08004253 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06004254 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08004255 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004256 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4257 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004258
Tony Barboureb254902015-07-15 12:50:33 -06004259 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4260 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4261 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004262 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004263 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004264
Tobin Ehlis3b780662015-05-28 12:11:26 -06004265 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004266 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4267 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004268 ASSERT_VK_SUCCESS(err);
4269
4270 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004271 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004272 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004273 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004274 alloc_info.descriptorPool = ds_pool;
4275 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004276 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4277 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004278 ASSERT_VK_SUCCESS(err);
4279
Tony Barboureb254902015-07-15 12:50:33 -06004280 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004281 pipe_ms_state_ci.sType =
4282 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4283 pipe_ms_state_ci.pNext = NULL;
4284 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
4285 pipe_ms_state_ci.sampleShadingEnable = 0;
4286 pipe_ms_state_ci.minSampleShading = 1.0;
4287 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004288
Tony Barboureb254902015-07-15 12:50:33 -06004289 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004290 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4291 pipeline_layout_ci.pNext = NULL;
4292 pipeline_layout_ci.setLayoutCount = 1;
4293 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004294
4295 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004296 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4297 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004298 ASSERT_VK_SUCCESS(err);
4299
Karl Schultz6addd812016-02-02 17:17:23 -07004300 VkShaderObj vs(m_device, bindStateVertShaderText,
4301 VK_SHADER_STAGE_VERTEX_BIT, this);
4302 VkShaderObj fs(m_device, bindStateFragShaderText,
4303 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004304 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004305 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004306 VkPipelineObj pipe(m_device);
4307 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004308 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06004309 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004310 pipe.SetMSAA(&pipe_ms_state_ci);
4311 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06004312
Tony Barbourfe3351b2015-07-28 10:17:20 -06004313 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004314 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4315 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06004316
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004317 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004318
Chia-I Wuf7458c52015-10-26 21:10:41 +08004319 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4320 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4321 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004322}
Tobin Ehlis0f10db52016-04-04 10:00:21 -06004323#ifdef ADD_BACK_IN_WHEN_CHECK_IS_BACK // TODO : Re-enable when GH256 fixed
Mark Youngc89c6312016-03-31 16:03:20 -06004324TEST_F(VkLayerTest, NumBlendAttachMismatch) {
4325 // Create Pipeline where the number of blend attachments doesn't match the
4326 // number of color attachments. In this case, we don't add any color
4327 // blend attachments even though we have a color attachment.
4328 VkResult err;
4329
4330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4331 "Mismatch between blend state attachment");
4332
4333 ASSERT_NO_FATAL_FAILURE(InitState());
4334 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4335 VkDescriptorPoolSize ds_type_count = {};
4336 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4337 ds_type_count.descriptorCount = 1;
4338
4339 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4340 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4341 ds_pool_ci.pNext = NULL;
4342 ds_pool_ci.maxSets = 1;
4343 ds_pool_ci.poolSizeCount = 1;
4344 ds_pool_ci.pPoolSizes = &ds_type_count;
4345
4346 VkDescriptorPool ds_pool;
4347 err =
4348 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4349 ASSERT_VK_SUCCESS(err);
4350
4351 VkDescriptorSetLayoutBinding dsl_binding = {};
4352 dsl_binding.binding = 0;
4353 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4354 dsl_binding.descriptorCount = 1;
4355 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4356 dsl_binding.pImmutableSamplers = NULL;
4357
4358 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4359 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4360 ds_layout_ci.pNext = NULL;
4361 ds_layout_ci.bindingCount = 1;
4362 ds_layout_ci.pBindings = &dsl_binding;
4363
4364 VkDescriptorSetLayout ds_layout;
4365 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4366 &ds_layout);
4367 ASSERT_VK_SUCCESS(err);
4368
4369 VkDescriptorSet descriptorSet;
4370 VkDescriptorSetAllocateInfo alloc_info = {};
4371 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4372 alloc_info.descriptorSetCount = 1;
4373 alloc_info.descriptorPool = ds_pool;
4374 alloc_info.pSetLayouts = &ds_layout;
4375 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4376 &descriptorSet);
4377 ASSERT_VK_SUCCESS(err);
4378
4379 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
4380 pipe_ms_state_ci.sType =
4381 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4382 pipe_ms_state_ci.pNext = NULL;
4383 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
4384 pipe_ms_state_ci.sampleShadingEnable = 0;
4385 pipe_ms_state_ci.minSampleShading = 1.0;
4386 pipe_ms_state_ci.pSampleMask = NULL;
4387
4388 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4389 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4390 pipeline_layout_ci.pNext = NULL;
4391 pipeline_layout_ci.setLayoutCount = 1;
4392 pipeline_layout_ci.pSetLayouts = &ds_layout;
4393
4394 VkPipelineLayout pipeline_layout;
4395 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4396 &pipeline_layout);
4397 ASSERT_VK_SUCCESS(err);
4398
4399 VkShaderObj vs(m_device, bindStateVertShaderText,
4400 VK_SHADER_STAGE_VERTEX_BIT, this);
4401 VkShaderObj fs(m_device, bindStateFragShaderText,
4402 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004403 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06004404 // but add it to be able to run on more devices
4405 VkPipelineObj pipe(m_device);
4406 pipe.AddShader(&vs);
4407 pipe.AddShader(&fs);
4408 pipe.SetMSAA(&pipe_ms_state_ci);
4409 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4410
4411 BeginCommandBuffer();
4412 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4413 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4414
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004415 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06004416
4417 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4418 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4419 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4420}
Tony Barbour4e81a202016-04-04 11:09:40 -06004421#endif //ADD_BACK_IN_WHEN_CHECK_IS_BACK
Karl Schultz6addd812016-02-02 17:17:23 -07004422TEST_F(VkLayerTest, ClearCmdNoDraw) {
4423 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
4424 // to issuing a Draw
4425 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004426
Karl Schultz6addd812016-02-02 17:17:23 -07004427 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07004428 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004429 "vkCmdClearAttachments() issued on CB object ");
4430
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004431 ASSERT_NO_FATAL_FAILURE(InitState());
4432 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06004433
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004434 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004435 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4436 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004437
4438 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004439 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4440 ds_pool_ci.pNext = NULL;
4441 ds_pool_ci.maxSets = 1;
4442 ds_pool_ci.poolSizeCount = 1;
4443 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004444
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004445 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004446 err =
4447 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004448 ASSERT_VK_SUCCESS(err);
4449
Tony Barboureb254902015-07-15 12:50:33 -06004450 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004451 dsl_binding.binding = 0;
4452 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4453 dsl_binding.descriptorCount = 1;
4454 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4455 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004456
Tony Barboureb254902015-07-15 12:50:33 -06004457 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004458 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4459 ds_layout_ci.pNext = NULL;
4460 ds_layout_ci.bindingCount = 1;
4461 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004462
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004463 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004464 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4465 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004466 ASSERT_VK_SUCCESS(err);
4467
4468 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004469 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004470 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004471 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004472 alloc_info.descriptorPool = ds_pool;
4473 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004474 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4475 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004476 ASSERT_VK_SUCCESS(err);
4477
Tony Barboureb254902015-07-15 12:50:33 -06004478 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004479 pipe_ms_state_ci.sType =
4480 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4481 pipe_ms_state_ci.pNext = NULL;
4482 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
4483 pipe_ms_state_ci.sampleShadingEnable = 0;
4484 pipe_ms_state_ci.minSampleShading = 1.0;
4485 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004486
Tony Barboureb254902015-07-15 12:50:33 -06004487 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004488 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4489 pipeline_layout_ci.pNext = NULL;
4490 pipeline_layout_ci.setLayoutCount = 1;
4491 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004492
4493 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004494 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4495 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004496 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004497
Karl Schultz6addd812016-02-02 17:17:23 -07004498 VkShaderObj vs(m_device, bindStateVertShaderText,
4499 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06004500 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07004501 // on more devices
4502 VkShaderObj fs(m_device, bindStateFragShaderText,
4503 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004504
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004505 VkPipelineObj pipe(m_device);
4506 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004507 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004508 pipe.SetMSAA(&pipe_ms_state_ci);
4509 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06004510
4511 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004512
Karl Schultz6addd812016-02-02 17:17:23 -07004513 // Main thing we care about for this test is that the VkImage obj we're
4514 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004515 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004516 VkClearAttachment color_attachment;
4517 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4518 color_attachment.clearValue.color.float32[0] = 1.0;
4519 color_attachment.clearValue.color.float32[1] = 1.0;
4520 color_attachment.clearValue.color.float32[2] = 1.0;
4521 color_attachment.clearValue.color.float32[3] = 1.0;
4522 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004523 VkClearRect clear_rect = {
4524 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004525
Karl Schultz6addd812016-02-02 17:17:23 -07004526 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4527 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004528
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004529 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004530
Chia-I Wuf7458c52015-10-26 21:10:41 +08004531 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4532 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4533 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004534}
4535
Karl Schultz6addd812016-02-02 17:17:23 -07004536TEST_F(VkLayerTest, VtxBufferBadIndex) {
4537 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004538
Karl Schultz6addd812016-02-02 17:17:23 -07004539 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004540 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07004541 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004542
Tobin Ehlis502480b2015-06-24 15:53:07 -06004543 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06004544 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06004545 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06004546
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004547 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004548 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4549 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004550
4551 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004552 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4553 ds_pool_ci.pNext = NULL;
4554 ds_pool_ci.maxSets = 1;
4555 ds_pool_ci.poolSizeCount = 1;
4556 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004557
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004558 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004559 err =
4560 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004561 ASSERT_VK_SUCCESS(err);
4562
Tony Barboureb254902015-07-15 12:50:33 -06004563 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004564 dsl_binding.binding = 0;
4565 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4566 dsl_binding.descriptorCount = 1;
4567 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4568 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004569
Tony Barboureb254902015-07-15 12:50:33 -06004570 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004571 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4572 ds_layout_ci.pNext = NULL;
4573 ds_layout_ci.bindingCount = 1;
4574 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004575
Tobin Ehlis502480b2015-06-24 15:53:07 -06004576 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004577 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4578 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004579 ASSERT_VK_SUCCESS(err);
4580
4581 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004582 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004583 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004584 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004585 alloc_info.descriptorPool = ds_pool;
4586 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004587 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4588 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004589 ASSERT_VK_SUCCESS(err);
4590
Tony Barboureb254902015-07-15 12:50:33 -06004591 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004592 pipe_ms_state_ci.sType =
4593 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4594 pipe_ms_state_ci.pNext = NULL;
4595 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
4596 pipe_ms_state_ci.sampleShadingEnable = 0;
4597 pipe_ms_state_ci.minSampleShading = 1.0;
4598 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004599
Tony Barboureb254902015-07-15 12:50:33 -06004600 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004601 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4602 pipeline_layout_ci.pNext = NULL;
4603 pipeline_layout_ci.setLayoutCount = 1;
4604 pipeline_layout_ci.pSetLayouts = &ds_layout;
4605 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004606
Karl Schultz6addd812016-02-02 17:17:23 -07004607 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4608 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004609 ASSERT_VK_SUCCESS(err);
4610
Karl Schultz6addd812016-02-02 17:17:23 -07004611 VkShaderObj vs(m_device, bindStateVertShaderText,
4612 VK_SHADER_STAGE_VERTEX_BIT, this);
4613 VkShaderObj fs(m_device, bindStateFragShaderText,
4614 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004615 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004616 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004617 VkPipelineObj pipe(m_device);
4618 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004619 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06004620 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004621 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004622 pipe.SetViewport(m_viewports);
4623 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004624 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06004625
4626 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004627 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4628 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06004629 // Don't care about actual data, just need to get to draw to flag error
4630 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07004631 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
4632 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06004633 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06004634 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004635
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004636 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004637
Chia-I Wuf7458c52015-10-26 21:10:41 +08004638 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4639 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4640 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004641}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004642#endif // DRAW_STATE_TESTS
4643
Tobin Ehlis0788f522015-05-26 16:11:58 -06004644#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06004645#if GTEST_IS_THREADSAFE
4646struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004647 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004648 VkEvent event;
4649 bool bailout;
4650};
4651
Karl Schultz6addd812016-02-02 17:17:23 -07004652extern "C" void *AddToCommandBuffer(void *arg) {
4653 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004654
Karl Schultz6addd812016-02-02 17:17:23 -07004655 for (int i = 0; i < 10000; i++) {
4656 vkCmdSetEvent(data->commandBuffer, data->event,
4657 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004658 if (data->bailout) {
4659 break;
4660 }
4661 }
4662 return NULL;
4663}
4664
Karl Schultz6addd812016-02-02 17:17:23 -07004665TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004666 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004667
Karl Schultz6addd812016-02-02 17:17:23 -07004668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4669 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004670
Mike Stroyanaccf7692015-05-12 16:00:45 -06004671 ASSERT_NO_FATAL_FAILURE(InitState());
4672 ASSERT_NO_FATAL_FAILURE(InitViewport());
4673 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4674
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004675 // Calls AllocateCommandBuffers
4676 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06004677
4678 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004679 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004680
4681 VkEventCreateInfo event_info;
4682 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004683 VkResult err;
4684
4685 memset(&event_info, 0, sizeof(event_info));
4686 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4687
Chia-I Wuf7458c52015-10-26 21:10:41 +08004688 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004689 ASSERT_VK_SUCCESS(err);
4690
Mike Stroyanaccf7692015-05-12 16:00:45 -06004691 err = vkResetEvent(device(), event);
4692 ASSERT_VK_SUCCESS(err);
4693
4694 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004695 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004696 data.event = event;
4697 data.bailout = false;
4698 m_errorMonitor->SetBailout(&data.bailout);
4699 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004700 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004701 // Add many entries to command buffer from this thread at the same time.
4702 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06004703
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004704 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004705 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004706
Mike Stroyan10b8cb72016-01-22 15:22:03 -07004707 m_errorMonitor->SetBailout(NULL);
4708
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004709 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004710
Chia-I Wuf7458c52015-10-26 21:10:41 +08004711 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004712}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004713#endif // GTEST_IS_THREADSAFE
4714#endif // THREADING_TESTS
4715
Chris Forbes9f7ff632015-05-25 11:13:08 +12004716#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07004717TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004719 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004720
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004721 ASSERT_NO_FATAL_FAILURE(InitState());
4722 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4723
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004724 VkShaderModule module;
4725 VkShaderModuleCreateInfo moduleCreateInfo;
4726 struct icd_spv_header spv;
4727
4728 spv.magic = ICD_SPV_MAGIC;
4729 spv.version = ICD_SPV_VERSION;
4730 spv.gen_magic = 0;
4731
4732 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4733 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07004734 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004735 moduleCreateInfo.codeSize = 4;
4736 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004737 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004738
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004739 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004740}
4741
Karl Schultz6addd812016-02-02 17:17:23 -07004742TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004744 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004745
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004746 ASSERT_NO_FATAL_FAILURE(InitState());
4747 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4748
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004749 VkShaderModule module;
4750 VkShaderModuleCreateInfo moduleCreateInfo;
4751 struct icd_spv_header spv;
4752
4753 spv.magic = ~ICD_SPV_MAGIC;
4754 spv.version = ICD_SPV_VERSION;
4755 spv.gen_magic = 0;
4756
4757 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4758 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07004759 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004760 moduleCreateInfo.codeSize = sizeof(spv) + 10;
4761 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004762 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004763
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004764 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004765}
4766
Karl Schultz6addd812016-02-02 17:17:23 -07004767TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004768 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004769 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004770
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004771 ASSERT_NO_FATAL_FAILURE(InitState());
4772 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4773
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004774 VkShaderModule module;
4775 VkShaderModuleCreateInfo moduleCreateInfo;
4776 struct icd_spv_header spv;
4777
4778 spv.magic = ICD_SPV_MAGIC;
4779 spv.version = ~ICD_SPV_VERSION;
4780 spv.gen_magic = 0;
4781
4782 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4783 moduleCreateInfo.pNext = NULL;
4784
Karl Schultz6addd812016-02-02 17:17:23 -07004785 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004786 moduleCreateInfo.codeSize = sizeof(spv) + 10;
4787 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004788 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004789
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004790 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004791}
4792
Karl Schultz6addd812016-02-02 17:17:23 -07004793TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004795 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004796
Chris Forbes9f7ff632015-05-25 11:13:08 +12004797 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06004798 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12004799
4800 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004801 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12004802 "\n"
4803 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07004804 "out gl_PerVertex {\n"
4805 " vec4 gl_Position;\n"
4806 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12004807 "void main(){\n"
4808 " gl_Position = vec4(1);\n"
4809 " x = 0;\n"
4810 "}\n";
4811 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004812 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12004813 "\n"
4814 "layout(location=0) out vec4 color;\n"
4815 "void main(){\n"
4816 " color = vec4(1);\n"
4817 "}\n";
4818
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004819 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4820 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12004821
4822 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08004823 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12004824 pipe.AddShader(&vs);
4825 pipe.AddShader(&fs);
4826
Chris Forbes9f7ff632015-05-25 11:13:08 +12004827 VkDescriptorSetObj descriptorSet(m_device);
4828 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004829 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12004830
Tony Barbour5781e8f2015-08-04 16:23:11 -06004831 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12004832
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004833 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12004834}
Chris Forbes9f7ff632015-05-25 11:13:08 +12004835
Karl Schultz6addd812016-02-02 17:17:23 -07004836TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004837 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004838 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004839
Chris Forbes59cb88d2015-05-25 11:13:13 +12004840 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06004841 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12004842
4843 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004844 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12004845 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07004846 "out gl_PerVertex {\n"
4847 " vec4 gl_Position;\n"
4848 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12004849 "void main(){\n"
4850 " gl_Position = vec4(1);\n"
4851 "}\n";
4852 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004853 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12004854 "\n"
4855 "layout(location=0) in float x;\n"
4856 "layout(location=0) out vec4 color;\n"
4857 "void main(){\n"
4858 " color = vec4(x);\n"
4859 "}\n";
4860
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004861 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4862 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12004863
4864 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08004865 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12004866 pipe.AddShader(&vs);
4867 pipe.AddShader(&fs);
4868
Chris Forbes59cb88d2015-05-25 11:13:13 +12004869 VkDescriptorSetObj descriptorSet(m_device);
4870 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004871 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12004872
Tony Barbour5781e8f2015-08-04 16:23:11 -06004873 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12004874
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004875 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12004876}
4877
Karl Schultz6addd812016-02-02 17:17:23 -07004878TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13004879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004880 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13004881
4882 ASSERT_NO_FATAL_FAILURE(InitState());
4883 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4884
4885 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004886 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13004887 "\n"
4888 "out gl_PerVertex {\n"
4889 " vec4 gl_Position;\n"
4890 "};\n"
4891 "void main(){\n"
4892 " gl_Position = vec4(1);\n"
4893 "}\n";
4894 char const *fsSource =
4895 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13004896 "\n"
4897 "in block { layout(location=0) float x; } ins;\n"
4898 "layout(location=0) out vec4 color;\n"
4899 "void main(){\n"
4900 " color = vec4(ins.x);\n"
4901 "}\n";
4902
4903 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4904 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4905
4906 VkPipelineObj pipe(m_device);
4907 pipe.AddColorAttachment();
4908 pipe.AddShader(&vs);
4909 pipe.AddShader(&fs);
4910
4911 VkDescriptorSetObj descriptorSet(m_device);
4912 descriptorSet.AppendDummy();
4913 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
4914
4915 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
4916
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004917 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13004918}
4919
Karl Schultz6addd812016-02-02 17:17:23 -07004920TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13004921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13004922 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07004923 "output arr[2] of float32' vs 'ptr to "
4924 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13004925
4926 ASSERT_NO_FATAL_FAILURE(InitState());
4927 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4928
4929 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004930 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13004931 "\n"
4932 "layout(location=0) out float x[2];\n"
4933 "out gl_PerVertex {\n"
4934 " vec4 gl_Position;\n"
4935 "};\n"
4936 "void main(){\n"
4937 " x[0] = 0; x[1] = 0;\n"
4938 " gl_Position = vec4(1);\n"
4939 "}\n";
4940 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004941 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13004942 "\n"
4943 "layout(location=0) in float x[3];\n"
4944 "layout(location=0) out vec4 color;\n"
4945 "void main(){\n"
4946 " color = vec4(x[0] + x[1] + x[2]);\n"
4947 "}\n";
4948
4949 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4950 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4951
4952 VkPipelineObj pipe(m_device);
4953 pipe.AddColorAttachment();
4954 pipe.AddShader(&vs);
4955 pipe.AddShader(&fs);
4956
4957 VkDescriptorSetObj descriptorSet(m_device);
4958 descriptorSet.AppendDummy();
4959 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
4960
4961 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
4962
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004963 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13004964}
4965
Karl Schultz6addd812016-02-02 17:17:23 -07004966TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004968 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004969
Chris Forbesb56af562015-05-25 11:13:17 +12004970 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06004971 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12004972
4973 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004974 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12004975 "\n"
4976 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07004977 "out gl_PerVertex {\n"
4978 " vec4 gl_Position;\n"
4979 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12004980 "void main(){\n"
4981 " x = 0;\n"
4982 " gl_Position = vec4(1);\n"
4983 "}\n";
4984 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12004985 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12004986 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07004987 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12004988 "layout(location=0) out vec4 color;\n"
4989 "void main(){\n"
4990 " color = vec4(x);\n"
4991 "}\n";
4992
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004993 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4994 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12004995
4996 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08004997 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12004998 pipe.AddShader(&vs);
4999 pipe.AddShader(&fs);
5000
Chris Forbesb56af562015-05-25 11:13:17 +12005001 VkDescriptorSetObj descriptorSet(m_device);
5002 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005003 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12005004
Tony Barbour5781e8f2015-08-04 16:23:11 -06005005 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12005006
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005007 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12005008}
5009
Karl Schultz6addd812016-02-02 17:17:23 -07005010TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13005011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005012 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13005013
5014 ASSERT_NO_FATAL_FAILURE(InitState());
5015 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5016
5017 char const *vsSource =
5018 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13005019 "\n"
5020 "out block { layout(location=0) int x; } outs;\n"
5021 "out gl_PerVertex {\n"
5022 " vec4 gl_Position;\n"
5023 "};\n"
5024 "void main(){\n"
5025 " outs.x = 0;\n"
5026 " gl_Position = vec4(1);\n"
5027 "}\n";
5028 char const *fsSource =
5029 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13005030 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005031 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13005032 "layout(location=0) out vec4 color;\n"
5033 "void main(){\n"
5034 " color = vec4(ins.x);\n"
5035 "}\n";
5036
5037 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5038 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5039
5040 VkPipelineObj pipe(m_device);
5041 pipe.AddColorAttachment();
5042 pipe.AddShader(&vs);
5043 pipe.AddShader(&fs);
5044
5045 VkDescriptorSetObj descriptorSet(m_device);
5046 descriptorSet.AppendDummy();
5047 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5048
5049 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5050
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005051 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13005052}
5053
5054TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
5055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5056 "location 0.0 which is not written by vertex shader");
5057
5058 ASSERT_NO_FATAL_FAILURE(InitState());
5059 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5060
5061 char const *vsSource =
5062 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13005063 "\n"
5064 "out block { layout(location=1) float x; } outs;\n"
5065 "out gl_PerVertex {\n"
5066 " vec4 gl_Position;\n"
5067 "};\n"
5068 "void main(){\n"
5069 " outs.x = 0;\n"
5070 " gl_Position = vec4(1);\n"
5071 "}\n";
5072 char const *fsSource =
5073 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13005074 "\n"
5075 "in block { layout(location=0) float x; } ins;\n"
5076 "layout(location=0) out vec4 color;\n"
5077 "void main(){\n"
5078 " color = vec4(ins.x);\n"
5079 "}\n";
5080
5081 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5082 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5083
5084 VkPipelineObj pipe(m_device);
5085 pipe.AddColorAttachment();
5086 pipe.AddShader(&vs);
5087 pipe.AddShader(&fs);
5088
5089 VkDescriptorSetObj descriptorSet(m_device);
5090 descriptorSet.AppendDummy();
5091 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5092
5093 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5094
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005095 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13005096}
5097
5098TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
5099 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5100 "location 0.1 which is not written by vertex shader");
5101
5102 ASSERT_NO_FATAL_FAILURE(InitState());
5103 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5104
5105 char const *vsSource =
5106 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13005107 "\n"
5108 "out block { layout(location=0, component=0) float x; } outs;\n"
5109 "out gl_PerVertex {\n"
5110 " vec4 gl_Position;\n"
5111 "};\n"
5112 "void main(){\n"
5113 " outs.x = 0;\n"
5114 " gl_Position = vec4(1);\n"
5115 "}\n";
5116 char const *fsSource =
5117 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13005118 "\n"
5119 "in block { layout(location=0, component=1) float x; } ins;\n"
5120 "layout(location=0) out vec4 color;\n"
5121 "void main(){\n"
5122 " color = vec4(ins.x);\n"
5123 "}\n";
5124
5125 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5126 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5127
5128 VkPipelineObj pipe(m_device);
5129 pipe.AddColorAttachment();
5130 pipe.AddShader(&vs);
5131 pipe.AddShader(&fs);
5132
5133 VkDescriptorSetObj descriptorSet(m_device);
5134 descriptorSet.AppendDummy();
5135 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5136
5137 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5138
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005139 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13005140}
5141
Karl Schultz6addd812016-02-02 17:17:23 -07005142TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005144 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005145
Chris Forbesde136e02015-05-25 11:13:28 +12005146 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005147 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12005148
5149 VkVertexInputBindingDescription input_binding;
5150 memset(&input_binding, 0, sizeof(input_binding));
5151
5152 VkVertexInputAttributeDescription input_attrib;
5153 memset(&input_attrib, 0, sizeof(input_attrib));
5154 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5155
5156 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005157 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005158 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005159 "out gl_PerVertex {\n"
5160 " vec4 gl_Position;\n"
5161 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005162 "void main(){\n"
5163 " gl_Position = vec4(1);\n"
5164 "}\n";
5165 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005166 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005167 "\n"
5168 "layout(location=0) out vec4 color;\n"
5169 "void main(){\n"
5170 " color = vec4(1);\n"
5171 "}\n";
5172
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005173 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5174 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12005175
5176 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005177 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12005178 pipe.AddShader(&vs);
5179 pipe.AddShader(&fs);
5180
5181 pipe.AddVertexInputBindings(&input_binding, 1);
5182 pipe.AddVertexInputAttribs(&input_attrib, 1);
5183
Chris Forbesde136e02015-05-25 11:13:28 +12005184 VkDescriptorSetObj descriptorSet(m_device);
5185 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005186 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12005187
Tony Barbour5781e8f2015-08-04 16:23:11 -06005188 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12005189
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005190 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12005191}
5192
Karl Schultz6addd812016-02-02 17:17:23 -07005193TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005194 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005195 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13005196
5197 ASSERT_NO_FATAL_FAILURE(InitState());
5198 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5199
5200 VkVertexInputBindingDescription input_binding;
5201 memset(&input_binding, 0, sizeof(input_binding));
5202
5203 VkVertexInputAttributeDescription input_attrib;
5204 memset(&input_attrib, 0, sizeof(input_attrib));
5205 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5206
5207 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005208 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13005209 "\n"
5210 "layout(location=1) in float x;\n"
5211 "out gl_PerVertex {\n"
5212 " vec4 gl_Position;\n"
5213 "};\n"
5214 "void main(){\n"
5215 " gl_Position = vec4(x);\n"
5216 "}\n";
5217 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005218 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13005219 "\n"
5220 "layout(location=0) out vec4 color;\n"
5221 "void main(){\n"
5222 " color = vec4(1);\n"
5223 "}\n";
5224
5225 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5226 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5227
5228 VkPipelineObj pipe(m_device);
5229 pipe.AddColorAttachment();
5230 pipe.AddShader(&vs);
5231 pipe.AddShader(&fs);
5232
5233 pipe.AddVertexInputBindings(&input_binding, 1);
5234 pipe.AddVertexInputAttribs(&input_attrib, 1);
5235
5236 VkDescriptorSetObj descriptorSet(m_device);
5237 descriptorSet.AppendDummy();
5238 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5239
5240 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5241
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005242 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13005243}
5244
Karl Schultz6addd812016-02-02 17:17:23 -07005245TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
5246 m_errorMonitor->SetDesiredFailureMsg(
5247 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005248 "VS consumes input at location 0 but not provided");
5249
Chris Forbes62e8e502015-05-25 11:13:29 +12005250 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005251 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12005252
5253 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005254 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005255 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005256 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07005257 "out gl_PerVertex {\n"
5258 " vec4 gl_Position;\n"
5259 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005260 "void main(){\n"
5261 " gl_Position = x;\n"
5262 "}\n";
5263 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005264 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005265 "\n"
5266 "layout(location=0) out vec4 color;\n"
5267 "void main(){\n"
5268 " color = vec4(1);\n"
5269 "}\n";
5270
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005271 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5272 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12005273
5274 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005275 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12005276 pipe.AddShader(&vs);
5277 pipe.AddShader(&fs);
5278
Chris Forbes62e8e502015-05-25 11:13:29 +12005279 VkDescriptorSetObj descriptorSet(m_device);
5280 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005281 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12005282
Tony Barbour5781e8f2015-08-04 16:23:11 -06005283 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12005284
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005285 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12005286}
5287
Karl Schultz6addd812016-02-02 17:17:23 -07005288TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
5289 m_errorMonitor->SetDesiredFailureMsg(
5290 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005291 "location 0 does not match VS input type");
5292
Chris Forbesc97d98e2015-05-25 11:13:31 +12005293 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005294 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12005295
5296 VkVertexInputBindingDescription input_binding;
5297 memset(&input_binding, 0, sizeof(input_binding));
5298
5299 VkVertexInputAttributeDescription input_attrib;
5300 memset(&input_attrib, 0, sizeof(input_attrib));
5301 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5302
5303 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005304 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005305 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005306 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07005307 "out gl_PerVertex {\n"
5308 " vec4 gl_Position;\n"
5309 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005310 "void main(){\n"
5311 " gl_Position = vec4(x);\n"
5312 "}\n";
5313 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005314 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005315 "\n"
5316 "layout(location=0) out vec4 color;\n"
5317 "void main(){\n"
5318 " color = vec4(1);\n"
5319 "}\n";
5320
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005321 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5322 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12005323
5324 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005325 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12005326 pipe.AddShader(&vs);
5327 pipe.AddShader(&fs);
5328
5329 pipe.AddVertexInputBindings(&input_binding, 1);
5330 pipe.AddVertexInputAttribs(&input_attrib, 1);
5331
Chris Forbesc97d98e2015-05-25 11:13:31 +12005332 VkDescriptorSetObj descriptorSet(m_device);
5333 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005334 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12005335
Tony Barbour5781e8f2015-08-04 16:23:11 -06005336 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12005337
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005338 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12005339}
5340
Chris Forbesc68b43c2016-04-06 11:18:47 +12005341TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
5342 m_errorMonitor->SetDesiredFailureMsg(
5343 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5344 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
5345
5346 ASSERT_NO_FATAL_FAILURE(InitState());
5347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5348
5349 char const *vsSource =
5350 "#version 450\n"
5351 "\n"
5352 "out gl_PerVertex {\n"
5353 " vec4 gl_Position;\n"
5354 "};\n"
5355 "void main(){\n"
5356 " gl_Position = vec4(1);\n"
5357 "}\n";
5358 char const *fsSource =
5359 "#version 450\n"
5360 "\n"
5361 "layout(location=0) out vec4 color;\n"
5362 "void main(){\n"
5363 " color = vec4(1);\n"
5364 "}\n";
5365
5366 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5367 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5368
5369 VkPipelineObj pipe(m_device);
5370 pipe.AddColorAttachment();
5371 pipe.AddShader(&vs);
5372 pipe.AddShader(&vs);
5373 pipe.AddShader(&fs);
5374
5375 VkDescriptorSetObj descriptorSet(m_device);
5376 descriptorSet.AppendDummy();
5377 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5378
5379 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5380
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005381 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12005382}
5383
Karl Schultz6addd812016-02-02 17:17:23 -07005384TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005385 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13005386
5387 ASSERT_NO_FATAL_FAILURE(InitState());
5388 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5389
5390 VkVertexInputBindingDescription input_binding;
5391 memset(&input_binding, 0, sizeof(input_binding));
5392
5393 VkVertexInputAttributeDescription input_attribs[2];
5394 memset(input_attribs, 0, sizeof(input_attribs));
5395
5396 for (int i = 0; i < 2; i++) {
5397 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
5398 input_attribs[i].location = i;
5399 }
5400
5401 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005402 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005403 "\n"
5404 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005405 "out gl_PerVertex {\n"
5406 " vec4 gl_Position;\n"
5407 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005408 "void main(){\n"
5409 " gl_Position = x[0] + x[1];\n"
5410 "}\n";
5411 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005412 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005413 "\n"
5414 "layout(location=0) out vec4 color;\n"
5415 "void main(){\n"
5416 " color = vec4(1);\n"
5417 "}\n";
5418
5419 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5420 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5421
5422 VkPipelineObj pipe(m_device);
5423 pipe.AddColorAttachment();
5424 pipe.AddShader(&vs);
5425 pipe.AddShader(&fs);
5426
5427 pipe.AddVertexInputBindings(&input_binding, 1);
5428 pipe.AddVertexInputAttribs(input_attribs, 2);
5429
5430 VkDescriptorSetObj descriptorSet(m_device);
5431 descriptorSet.AppendDummy();
5432 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5433
5434 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5435
5436 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005437 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13005438}
5439
Chris Forbes2682b242015-11-24 11:13:14 +13005440TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
5441{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005442 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13005443
5444 ASSERT_NO_FATAL_FAILURE(InitState());
5445 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5446
5447 VkVertexInputBindingDescription input_binding;
5448 memset(&input_binding, 0, sizeof(input_binding));
5449
5450 VkVertexInputAttributeDescription input_attribs[2];
5451 memset(input_attribs, 0, sizeof(input_attribs));
5452
5453 for (int i = 0; i < 2; i++) {
5454 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
5455 input_attribs[i].location = i;
5456 }
5457
5458 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005459 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005460 "\n"
5461 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07005462 "out gl_PerVertex {\n"
5463 " vec4 gl_Position;\n"
5464 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005465 "void main(){\n"
5466 " gl_Position = x[0] + x[1];\n"
5467 "}\n";
5468 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005469 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005470 "\n"
5471 "layout(location=0) out vec4 color;\n"
5472 "void main(){\n"
5473 " color = vec4(1);\n"
5474 "}\n";
5475
5476 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5477 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5478
5479 VkPipelineObj pipe(m_device);
5480 pipe.AddColorAttachment();
5481 pipe.AddShader(&vs);
5482 pipe.AddShader(&fs);
5483
5484 pipe.AddVertexInputBindings(&input_binding, 1);
5485 pipe.AddVertexInputAttribs(input_attribs, 2);
5486
5487 VkDescriptorSetObj descriptorSet(m_device);
5488 descriptorSet.AppendDummy();
5489 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5490
5491 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5492
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005493 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13005494}
Chris Forbes2682b242015-11-24 11:13:14 +13005495
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005496TEST_F(VkLayerTest, CreatePipelineSimplePositive)
5497{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005498 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005499
5500 ASSERT_NO_FATAL_FAILURE(InitState());
5501 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5502
5503 char const *vsSource =
5504 "#version 450\n"
5505 "out gl_PerVertex {\n"
5506 " vec4 gl_Position;\n"
5507 "};\n"
5508 "void main(){\n"
5509 " gl_Position = vec4(0);\n"
5510 "}\n";
5511 char const *fsSource =
5512 "#version 450\n"
5513 "\n"
5514 "layout(location=0) out vec4 color;\n"
5515 "void main(){\n"
5516 " color = vec4(1);\n"
5517 "}\n";
5518
5519 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5520 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5521
5522 VkPipelineObj pipe(m_device);
5523 pipe.AddColorAttachment();
5524 pipe.AddShader(&vs);
5525 pipe.AddShader(&fs);
5526
5527 VkDescriptorSetObj descriptorSet(m_device);
5528 descriptorSet.AppendDummy();
5529 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5530
5531 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5532
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005533 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005534}
5535
Chris Forbes912c9192016-04-05 17:50:35 +12005536TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
5537{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005538 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12005539
5540 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
5541
5542 ASSERT_NO_FATAL_FAILURE(InitState());
5543 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5544
5545 char const *vsSource =
5546 "#version 450\n"
5547 "out gl_PerVertex {\n"
5548 " vec4 gl_Position;\n"
5549 "};\n"
5550 "layout(location=0) out vec3 x;\n"
5551 "layout(location=1) out ivec3 y;\n"
5552 "layout(location=2) out vec3 z;\n"
5553 "void main(){\n"
5554 " gl_Position = vec4(0);\n"
5555 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
5556 "}\n";
5557 char const *fsSource =
5558 "#version 450\n"
5559 "\n"
5560 "layout(location=0) out vec4 color;\n"
5561 "layout(location=0) in float x;\n"
5562 "layout(location=1) flat in int y;\n"
5563 "layout(location=2) in vec2 z;\n"
5564 "void main(){\n"
5565 " color = vec4(1 + x + y + z.x);\n"
5566 "}\n";
5567
5568 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5569 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5570
5571 VkPipelineObj pipe(m_device);
5572 pipe.AddColorAttachment();
5573 pipe.AddShader(&vs);
5574 pipe.AddShader(&fs);
5575
5576 VkDescriptorSetObj descriptorSet(m_device);
5577 descriptorSet.AppendDummy();
5578 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5579
5580 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5581
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005582 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12005583}
5584
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005585TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
5586{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005587 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005588
5589 ASSERT_NO_FATAL_FAILURE(InitState());
5590 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5591
Chris Forbesc1e852d2016-04-04 19:26:42 +12005592 if (!m_device->phy().features().tessellationShader) {
5593 printf("Device does not support tessellation shaders; skipped.\n");
5594 return;
5595 }
5596
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005597 char const *vsSource =
5598 "#version 450\n"
5599 "void main(){}\n";
5600 char const *tcsSource =
5601 "#version 450\n"
5602 "layout(location=0) out int x[];\n"
5603 "layout(vertices=3) out;\n"
5604 "void main(){\n"
5605 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
5606 " gl_TessLevelInner[0] = 1;\n"
5607 " x[gl_InvocationID] = gl_InvocationID;\n"
5608 "}\n";
5609 char const *tesSource =
5610 "#version 450\n"
5611 "layout(triangles, equal_spacing, cw) in;\n"
5612 "layout(location=0) in int x[];\n"
5613 "out gl_PerVertex { vec4 gl_Position; };\n"
5614 "void main(){\n"
5615 " gl_Position.xyz = gl_TessCoord;\n"
5616 " gl_Position.w = x[0] + x[1] + x[2];\n"
5617 "}\n";
5618 char const *fsSource =
5619 "#version 450\n"
5620 "layout(location=0) out vec4 color;\n"
5621 "void main(){\n"
5622 " color = vec4(1);\n"
5623 "}\n";
5624
5625 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5626 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
5627 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
5628 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5629
5630 VkPipelineInputAssemblyStateCreateInfo iasci{
5631 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
5632 nullptr,
5633 0,
5634 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
5635 VK_FALSE};
5636
Chris Forbesb4cacb62016-04-04 19:15:00 +12005637 VkPipelineTessellationStateCreateInfo tsci{
5638 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
5639 nullptr,
5640 0,
5641 3};
5642
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005643 VkPipelineObj pipe(m_device);
5644 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12005645 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005646 pipe.AddColorAttachment();
5647 pipe.AddShader(&vs);
5648 pipe.AddShader(&tcs);
5649 pipe.AddShader(&tes);
5650 pipe.AddShader(&fs);
5651
5652 VkDescriptorSetObj descriptorSet(m_device);
5653 descriptorSet.AppendDummy();
5654 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5655
5656 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5657
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005658 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12005659}
5660
Chris Forbesa0ab8152016-04-20 13:34:27 +12005661TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
5662{
5663 m_errorMonitor->ExpectSuccess();
5664
5665 ASSERT_NO_FATAL_FAILURE(InitState());
5666 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5667
5668 if (!m_device->phy().features().geometryShader) {
5669 printf("Device does not support geometry shaders; skipped.\n");
5670 return;
5671 }
5672
5673 char const *vsSource =
5674 "#version 450\n"
5675 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
5676 "void main(){\n"
5677 " vs_out.x = vec4(1);\n"
5678 "}\n";
5679 char const *gsSource =
5680 "#version 450\n"
5681 "layout(triangles) in;\n"
5682 "layout(triangle_strip, max_vertices=3) out;\n"
5683 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
5684 "out gl_PerVertex { vec4 gl_Position; };\n"
5685 "void main() {\n"
5686 " gl_Position = gs_in[0].x;\n"
5687 " EmitVertex();\n"
5688 "}\n";
5689 char const *fsSource =
5690 "#version 450\n"
5691 "layout(location=0) out vec4 color;\n"
5692 "void main(){\n"
5693 " color = vec4(1);\n"
5694 "}\n";
5695
5696 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5697 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
5698 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5699
5700 VkPipelineObj pipe(m_device);
5701 pipe.AddColorAttachment();
5702 pipe.AddShader(&vs);
5703 pipe.AddShader(&gs);
5704 pipe.AddShader(&fs);
5705
5706 VkDescriptorSetObj descriptorSet(m_device);
5707 descriptorSet.AppendDummy();
5708 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5709
5710 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5711
5712 m_errorMonitor->VerifyNotFound();
5713}
5714
Chris Forbesa0193bc2016-04-04 19:19:47 +12005715TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
5716{
5717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5718 "is per-vertex in tessellation control shader stage "
5719 "but per-patch in tessellation evaluation shader stage");
5720
5721 ASSERT_NO_FATAL_FAILURE(InitState());
5722 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5723
Chris Forbesc1e852d2016-04-04 19:26:42 +12005724 if (!m_device->phy().features().tessellationShader) {
5725 printf("Device does not support tessellation shaders; skipped.\n");
5726 return;
5727 }
5728
Chris Forbesa0193bc2016-04-04 19:19:47 +12005729 char const *vsSource =
5730 "#version 450\n"
5731 "void main(){}\n";
5732 char const *tcsSource =
5733 "#version 450\n"
5734 "layout(location=0) out int x[];\n"
5735 "layout(vertices=3) out;\n"
5736 "void main(){\n"
5737 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
5738 " gl_TessLevelInner[0] = 1;\n"
5739 " x[gl_InvocationID] = gl_InvocationID;\n"
5740 "}\n";
5741 char const *tesSource =
5742 "#version 450\n"
5743 "layout(triangles, equal_spacing, cw) in;\n"
5744 "layout(location=0) patch in int x;\n"
5745 "out gl_PerVertex { vec4 gl_Position; };\n"
5746 "void main(){\n"
5747 " gl_Position.xyz = gl_TessCoord;\n"
5748 " gl_Position.w = x;\n"
5749 "}\n";
5750 char const *fsSource =
5751 "#version 450\n"
5752 "layout(location=0) out vec4 color;\n"
5753 "void main(){\n"
5754 " color = vec4(1);\n"
5755 "}\n";
5756
5757 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5758 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
5759 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
5760 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5761
5762 VkPipelineInputAssemblyStateCreateInfo iasci{
5763 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
5764 nullptr,
5765 0,
5766 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
5767 VK_FALSE};
5768
5769 VkPipelineTessellationStateCreateInfo tsci{
5770 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
5771 nullptr,
5772 0,
5773 3};
5774
5775 VkPipelineObj pipe(m_device);
5776 pipe.SetInputAssembly(&iasci);
5777 pipe.SetTessellation(&tsci);
5778 pipe.AddColorAttachment();
5779 pipe.AddShader(&vs);
5780 pipe.AddShader(&tcs);
5781 pipe.AddShader(&tes);
5782 pipe.AddShader(&fs);
5783
5784 VkDescriptorSetObj descriptorSet(m_device);
5785 descriptorSet.AppendDummy();
5786 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5787
5788 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5789
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005790 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12005791}
5792
Karl Schultz6addd812016-02-02 17:17:23 -07005793TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
5794 m_errorMonitor->SetDesiredFailureMsg(
5795 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005796 "Duplicate vertex input binding descriptions for binding 0");
5797
Chris Forbes280ba2c2015-06-12 11:16:41 +12005798 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005799 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12005800
5801 /* Two binding descriptions for binding 0 */
5802 VkVertexInputBindingDescription input_bindings[2];
5803 memset(input_bindings, 0, sizeof(input_bindings));
5804
5805 VkVertexInputAttributeDescription input_attrib;
5806 memset(&input_attrib, 0, sizeof(input_attrib));
5807 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5808
5809 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005810 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005811 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005812 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07005813 "out gl_PerVertex {\n"
5814 " vec4 gl_Position;\n"
5815 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005816 "void main(){\n"
5817 " gl_Position = vec4(x);\n"
5818 "}\n";
5819 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005820 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005821 "\n"
5822 "layout(location=0) out vec4 color;\n"
5823 "void main(){\n"
5824 " color = vec4(1);\n"
5825 "}\n";
5826
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005827 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5828 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12005829
5830 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005831 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12005832 pipe.AddShader(&vs);
5833 pipe.AddShader(&fs);
5834
5835 pipe.AddVertexInputBindings(input_bindings, 2);
5836 pipe.AddVertexInputAttribs(&input_attrib, 1);
5837
Chris Forbes280ba2c2015-06-12 11:16:41 +12005838 VkDescriptorSetObj descriptorSet(m_device);
5839 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005840 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12005841
Tony Barbour5781e8f2015-08-04 16:23:11 -06005842 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12005843
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005844 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12005845}
Chris Forbes8f68b562015-05-25 11:13:32 +12005846
Karl Schultz6addd812016-02-02 17:17:23 -07005847TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005849 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005850
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005851 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005852
5853 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005854 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005855 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005856 "out gl_PerVertex {\n"
5857 " vec4 gl_Position;\n"
5858 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005859 "void main(){\n"
5860 " gl_Position = vec4(1);\n"
5861 "}\n";
5862 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005863 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005864 "\n"
5865 "void main(){\n"
5866 "}\n";
5867
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005868 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5869 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005870
5871 VkPipelineObj pipe(m_device);
5872 pipe.AddShader(&vs);
5873 pipe.AddShader(&fs);
5874
Chia-I Wu08accc62015-07-07 11:50:03 +08005875 /* set up CB 0, not written */
5876 pipe.AddColorAttachment();
5877 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005878
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005879 VkDescriptorSetObj descriptorSet(m_device);
5880 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005881 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005882
Tony Barbour5781e8f2015-08-04 16:23:11 -06005883 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005884
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005885 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005886}
5887
Karl Schultz6addd812016-02-02 17:17:23 -07005888TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07005889 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005890 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005891 "FS writes to output location 1 with no matching attachment");
5892
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005893 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005894
5895 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005896 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005897 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005898 "out gl_PerVertex {\n"
5899 " vec4 gl_Position;\n"
5900 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005901 "void main(){\n"
5902 " gl_Position = vec4(1);\n"
5903 "}\n";
5904 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005905 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005906 "\n"
5907 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005908 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005909 "void main(){\n"
5910 " x = vec4(1);\n"
5911 " y = vec4(1);\n"
5912 "}\n";
5913
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005914 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5915 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005916
5917 VkPipelineObj pipe(m_device);
5918 pipe.AddShader(&vs);
5919 pipe.AddShader(&fs);
5920
Chia-I Wu08accc62015-07-07 11:50:03 +08005921 /* set up CB 0, not written */
5922 pipe.AddColorAttachment();
5923 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005924 /* FS writes CB 1, but we don't configure it */
5925
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005926 VkDescriptorSetObj descriptorSet(m_device);
5927 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005928 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005929
Tony Barbour5781e8f2015-08-04 16:23:11 -06005930 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005931
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005932 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005933}
5934
Karl Schultz6addd812016-02-02 17:17:23 -07005935TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005936 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005937 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005938
Chris Forbesa36d69e2015-05-25 11:13:44 +12005939 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12005940
5941 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005942 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005943 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005944 "out gl_PerVertex {\n"
5945 " vec4 gl_Position;\n"
5946 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005947 "void main(){\n"
5948 " gl_Position = vec4(1);\n"
5949 "}\n";
5950 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005951 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005952 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005953 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12005954 "void main(){\n"
5955 " x = ivec4(1);\n"
5956 "}\n";
5957
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005958 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5959 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12005960
5961 VkPipelineObj pipe(m_device);
5962 pipe.AddShader(&vs);
5963 pipe.AddShader(&fs);
5964
Chia-I Wu08accc62015-07-07 11:50:03 +08005965 /* set up CB 0; type is UNORM by default */
5966 pipe.AddColorAttachment();
5967 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12005968
Chris Forbesa36d69e2015-05-25 11:13:44 +12005969 VkDescriptorSetObj descriptorSet(m_device);
5970 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005971 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12005972
Tony Barbour5781e8f2015-08-04 16:23:11 -06005973 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12005974
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005975 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12005976}
Chris Forbes7b1b8932015-06-05 14:43:36 +12005977
Karl Schultz6addd812016-02-02 17:17:23 -07005978TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005979 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005980 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005981
Chris Forbes556c76c2015-08-14 12:04:59 +12005982 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12005983
5984 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005985 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12005986 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005987 "out gl_PerVertex {\n"
5988 " vec4 gl_Position;\n"
5989 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12005990 "void main(){\n"
5991 " gl_Position = vec4(1);\n"
5992 "}\n";
5993 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005994 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12005995 "\n"
5996 "layout(location=0) out vec4 x;\n"
5997 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5998 "void main(){\n"
5999 " x = vec4(bar.y);\n"
6000 "}\n";
6001
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006002 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6003 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12006004
Chris Forbes556c76c2015-08-14 12:04:59 +12006005 VkPipelineObj pipe(m_device);
6006 pipe.AddShader(&vs);
6007 pipe.AddShader(&fs);
6008
6009 /* set up CB 0; type is UNORM by default */
6010 pipe.AddColorAttachment();
6011 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6012
6013 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006014 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12006015
6016 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6017
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006018 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12006019}
6020
Chris Forbes5c59e902016-02-26 16:56:09 +13006021TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
6022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6023 "not declared in layout");
6024
6025 ASSERT_NO_FATAL_FAILURE(InitState());
6026
6027 char const *vsSource =
6028 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13006029 "\n"
6030 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
6031 "out gl_PerVertex {\n"
6032 " vec4 gl_Position;\n"
6033 "};\n"
6034 "void main(){\n"
6035 " gl_Position = vec4(consts.x);\n"
6036 "}\n";
6037 char const *fsSource =
6038 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13006039 "\n"
6040 "layout(location=0) out vec4 x;\n"
6041 "void main(){\n"
6042 " x = vec4(1);\n"
6043 "}\n";
6044
6045 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6046 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6047
6048 VkPipelineObj pipe(m_device);
6049 pipe.AddShader(&vs);
6050 pipe.AddShader(&fs);
6051
6052 /* set up CB 0; type is UNORM by default */
6053 pipe.AddColorAttachment();
6054 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6055
6056 VkDescriptorSetObj descriptorSet(m_device);
6057 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6058
6059 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6060
6061 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006062 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13006063}
6064
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006065#endif // SHADER_CHECKER_TESTS
6066
6067#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06006068TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07006069 m_errorMonitor->SetDesiredFailureMsg(
6070 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006071 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006072
6073 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006074
6075 // Create an image
6076 VkImage image;
6077
Karl Schultz6addd812016-02-02 17:17:23 -07006078 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6079 const int32_t tex_width = 32;
6080 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006081
6082 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006083 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6084 image_create_info.pNext = NULL;
6085 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6086 image_create_info.format = tex_format;
6087 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006088 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07006089 image_create_info.extent.depth = 1;
6090 image_create_info.mipLevels = 1;
6091 image_create_info.arrayLayers = 1;
6092 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6093 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6094 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6095 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006096
6097 // Introduce error by sending down a bogus width extent
6098 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006099 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006100
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006101 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006102}
6103
Mark Youngc48c4c12016-04-11 14:26:49 -06006104TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
6105 m_errorMonitor->SetDesiredFailureMsg(
6106 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6107 "CreateImage extents is 0 for at least one required dimension");
6108
6109 ASSERT_NO_FATAL_FAILURE(InitState());
6110
6111 // Create an image
6112 VkImage image;
6113
6114 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6115 const int32_t tex_width = 32;
6116 const int32_t tex_height = 32;
6117
6118 VkImageCreateInfo image_create_info = {};
6119 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6120 image_create_info.pNext = NULL;
6121 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6122 image_create_info.format = tex_format;
6123 image_create_info.extent.width = tex_width;
6124 image_create_info.extent.height = tex_height;
6125 image_create_info.extent.depth = 1;
6126 image_create_info.mipLevels = 1;
6127 image_create_info.arrayLayers = 1;
6128 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6129 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6130 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6131 image_create_info.flags = 0;
6132
6133 // Introduce error by sending down a bogus width extent
6134 image_create_info.extent.width = 0;
6135 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6136
6137 m_errorMonitor->VerifyFound();
6138}
6139
Karl Schultz6addd812016-02-02 17:17:23 -07006140TEST_F(VkLayerTest, UpdateBufferAlignment) {
6141 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06006142
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006144 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006145
Mike Stroyana3082432015-09-25 13:39:21 -06006146 ASSERT_NO_FATAL_FAILURE(InitState());
6147
6148 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
6149 vk_testing::Buffer buffer;
6150 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
6151
6152 BeginCommandBuffer();
6153 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006154 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006155 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006156
Mike Stroyana3082432015-09-25 13:39:21 -06006157 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006158 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006159 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006160
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006161 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006162 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006163 EndCommandBuffer();
6164}
6165
Karl Schultz6addd812016-02-02 17:17:23 -07006166TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006168 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06006169
6170 ASSERT_NO_FATAL_FAILURE(InitState());
6171
6172 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
6173 vk_testing::Buffer buffer;
6174 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
6175
6176 BeginCommandBuffer();
6177 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006178 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006179 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006180
Mike Stroyana3082432015-09-25 13:39:21 -06006181 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006182 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006183 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006184
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006185 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006186
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006187 m_errorMonitor->VerifyFound();
6188
Mike Stroyana3082432015-09-25 13:39:21 -06006189 EndCommandBuffer();
6190}
6191
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006192#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12006193
Tobin Ehliscde08892015-09-22 10:11:37 -06006194#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006195TEST_F(VkLayerTest, InvalidImageView) {
6196 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06006197
Karl Schultz6addd812016-02-02 17:17:23 -07006198 m_errorMonitor->SetDesiredFailureMsg(
6199 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006200 "vkCreateImageView called with baseMipLevel 10 ");
6201
Tobin Ehliscde08892015-09-22 10:11:37 -06006202 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06006203
Mike Stroyana3082432015-09-25 13:39:21 -06006204 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07006205 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06006206
Karl Schultz6addd812016-02-02 17:17:23 -07006207 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6208 const int32_t tex_width = 32;
6209 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06006210
6211 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006212 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6213 image_create_info.pNext = NULL;
6214 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6215 image_create_info.format = tex_format;
6216 image_create_info.extent.width = tex_width;
6217 image_create_info.extent.height = tex_height;
6218 image_create_info.extent.depth = 1;
6219 image_create_info.mipLevels = 1;
6220 image_create_info.arrayLayers = 1;
6221 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6222 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6223 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6224 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06006225
Chia-I Wuf7458c52015-10-26 21:10:41 +08006226 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06006227 ASSERT_VK_SUCCESS(err);
6228
6229 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006230 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6231 image_view_create_info.image = image;
6232 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6233 image_view_create_info.format = tex_format;
6234 image_view_create_info.subresourceRange.layerCount = 1;
6235 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
6236 image_view_create_info.subresourceRange.levelCount = 1;
6237 image_view_create_info.subresourceRange.aspectMask =
6238 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06006239
6240 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07006241 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6242 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06006243
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006244 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06006245}
Mike Stroyana3082432015-09-25 13:39:21 -06006246
Karl Schultz6addd812016-02-02 17:17:23 -07006247TEST_F(VkLayerTest, InvalidImageViewAspect) {
6248 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006249
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006250 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006251 "vkCreateImageView: Color image "
6252 "formats must have ONLY the "
6253 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006254
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006255 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006256
6257 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07006258 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006259
Karl Schultz6addd812016-02-02 17:17:23 -07006260 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6261 const int32_t tex_width = 32;
6262 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006263
6264 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006265 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6266 image_create_info.pNext = NULL;
6267 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6268 image_create_info.format = tex_format;
6269 image_create_info.extent.width = tex_width;
6270 image_create_info.extent.height = tex_height;
6271 image_create_info.extent.depth = 1;
6272 image_create_info.mipLevels = 1;
6273 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6274 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6275 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6276 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006277
Chia-I Wuf7458c52015-10-26 21:10:41 +08006278 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006279 ASSERT_VK_SUCCESS(err);
6280
6281 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006282 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6283 image_view_create_info.image = image;
6284 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6285 image_view_create_info.format = tex_format;
6286 image_view_create_info.subresourceRange.baseMipLevel = 0;
6287 image_view_create_info.subresourceRange.levelCount = 1;
6288 // Cause an error by setting an invalid image aspect
6289 image_view_create_info.subresourceRange.aspectMask =
6290 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006291
6292 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07006293 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6294 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006295
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006296 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006297}
6298
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006299TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07006300 VkResult err;
6301 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006302
Karl Schultz6addd812016-02-02 17:17:23 -07006303 m_errorMonitor->SetDesiredFailureMsg(
6304 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006305 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006306
Mike Stroyana3082432015-09-25 13:39:21 -06006307 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006308
6309 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006310 VkImage srcImage;
6311 VkImage dstImage;
6312 VkDeviceMemory srcMem;
6313 VkDeviceMemory destMem;
6314 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006315
6316 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006317 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6318 image_create_info.pNext = NULL;
6319 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6320 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6321 image_create_info.extent.width = 32;
6322 image_create_info.extent.height = 32;
6323 image_create_info.extent.depth = 1;
6324 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006325 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07006326 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6327 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6328 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6329 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006330
Karl Schultz6addd812016-02-02 17:17:23 -07006331 err =
6332 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006333 ASSERT_VK_SUCCESS(err);
6334
Karl Schultz6addd812016-02-02 17:17:23 -07006335 err =
6336 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006337 ASSERT_VK_SUCCESS(err);
6338
6339 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006340 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006341 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6342 memAlloc.pNext = NULL;
6343 memAlloc.allocationSize = 0;
6344 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006345
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006346 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006347 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006348 pass =
6349 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006350 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006351 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006352 ASSERT_VK_SUCCESS(err);
6353
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006354 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006355 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006356 pass =
6357 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006358 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006359 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006360 ASSERT_VK_SUCCESS(err);
6361
6362 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6363 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006364 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006365 ASSERT_VK_SUCCESS(err);
6366
6367 BeginCommandBuffer();
6368 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006369 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006370 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006371 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006372 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06006373 copyRegion.srcOffset.x = 0;
6374 copyRegion.srcOffset.y = 0;
6375 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006376 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006377 copyRegion.dstSubresource.mipLevel = 0;
6378 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006379 // Introduce failure by forcing the dst layerCount to differ from src
6380 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006381 copyRegion.dstOffset.x = 0;
6382 copyRegion.dstOffset.y = 0;
6383 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006384 copyRegion.extent.width = 1;
6385 copyRegion.extent.height = 1;
6386 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006387 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6388 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006389 EndCommandBuffer();
6390
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006391 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006392
Chia-I Wuf7458c52015-10-26 21:10:41 +08006393 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006394 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006395 vkFreeMemory(m_device->device(), srcMem, NULL);
6396 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006397}
6398
Karl Schultz6addd812016-02-02 17:17:23 -07006399TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006400 VkResult err;
6401 bool pass;
6402
6403 // Create color images with different format sizes and try to copy between them
6404 m_errorMonitor->SetDesiredFailureMsg(
6405 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6406 "vkCmdCopyImage called with unmatched source and dest image format sizes");
6407
6408 ASSERT_NO_FATAL_FAILURE(InitState());
6409
6410 // Create two images of different types and try to copy between them
6411 VkImage srcImage;
6412 VkImage dstImage;
6413 VkDeviceMemory srcMem;
6414 VkDeviceMemory destMem;
6415 VkMemoryRequirements memReqs;
6416
6417 VkImageCreateInfo image_create_info = {};
6418 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6419 image_create_info.pNext = NULL;
6420 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6421 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6422 image_create_info.extent.width = 32;
6423 image_create_info.extent.height = 32;
6424 image_create_info.extent.depth = 1;
6425 image_create_info.mipLevels = 1;
6426 image_create_info.arrayLayers = 1;
6427 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6428 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6429 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6430 image_create_info.flags = 0;
6431
6432 err =
6433 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
6434 ASSERT_VK_SUCCESS(err);
6435
6436 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6437 // Introduce failure by creating second image with a different-sized format.
6438 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
6439
6440 err =
6441 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
6442 ASSERT_VK_SUCCESS(err);
6443
6444 // Allocate memory
6445 VkMemoryAllocateInfo memAlloc = {};
6446 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6447 memAlloc.pNext = NULL;
6448 memAlloc.allocationSize = 0;
6449 memAlloc.memoryTypeIndex = 0;
6450
6451 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
6452 memAlloc.allocationSize = memReqs.size;
6453 pass =
6454 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
6455 ASSERT_TRUE(pass);
6456 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
6457 ASSERT_VK_SUCCESS(err);
6458
6459 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
6460 memAlloc.allocationSize = memReqs.size;
6461 pass =
6462 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
6463 ASSERT_TRUE(pass);
6464 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
6465 ASSERT_VK_SUCCESS(err);
6466
6467 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6468 ASSERT_VK_SUCCESS(err);
6469 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
6470 ASSERT_VK_SUCCESS(err);
6471
6472 BeginCommandBuffer();
6473 VkImageCopy copyRegion;
6474 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6475 copyRegion.srcSubresource.mipLevel = 0;
6476 copyRegion.srcSubresource.baseArrayLayer = 0;
6477 copyRegion.srcSubresource.layerCount = 0;
6478 copyRegion.srcOffset.x = 0;
6479 copyRegion.srcOffset.y = 0;
6480 copyRegion.srcOffset.z = 0;
6481 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6482 copyRegion.dstSubresource.mipLevel = 0;
6483 copyRegion.dstSubresource.baseArrayLayer = 0;
6484 copyRegion.dstSubresource.layerCount = 0;
6485 copyRegion.dstOffset.x = 0;
6486 copyRegion.dstOffset.y = 0;
6487 copyRegion.dstOffset.z = 0;
6488 copyRegion.extent.width = 1;
6489 copyRegion.extent.height = 1;
6490 copyRegion.extent.depth = 1;
6491 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6492 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6493 EndCommandBuffer();
6494
6495 m_errorMonitor->VerifyFound();
6496
6497 vkDestroyImage(m_device->device(), srcImage, NULL);
6498 vkDestroyImage(m_device->device(), dstImage, NULL);
6499 vkFreeMemory(m_device->device(), srcMem, NULL);
6500 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006501}
6502
Karl Schultz6addd812016-02-02 17:17:23 -07006503TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
6504 VkResult err;
6505 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006506
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006507 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006508 m_errorMonitor->SetDesiredFailureMsg(
6509 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006510 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006511
Mike Stroyana3082432015-09-25 13:39:21 -06006512 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006513
6514 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006515 VkImage srcImage;
6516 VkImage dstImage;
6517 VkDeviceMemory srcMem;
6518 VkDeviceMemory destMem;
6519 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006520
6521 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006522 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6523 image_create_info.pNext = NULL;
6524 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6525 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6526 image_create_info.extent.width = 32;
6527 image_create_info.extent.height = 32;
6528 image_create_info.extent.depth = 1;
6529 image_create_info.mipLevels = 1;
6530 image_create_info.arrayLayers = 1;
6531 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6532 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6533 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6534 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006535
Karl Schultz6addd812016-02-02 17:17:23 -07006536 err =
6537 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006538 ASSERT_VK_SUCCESS(err);
6539
Karl Schultzbdb75952016-04-19 11:36:49 -06006540 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6541
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006542 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07006543 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006544 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
6545 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006546
Karl Schultz6addd812016-02-02 17:17:23 -07006547 err =
6548 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006549 ASSERT_VK_SUCCESS(err);
6550
6551 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006552 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006553 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6554 memAlloc.pNext = NULL;
6555 memAlloc.allocationSize = 0;
6556 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006557
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006558 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006559 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006560 pass =
6561 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006562 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006563 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006564 ASSERT_VK_SUCCESS(err);
6565
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006566 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006567 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006568 pass =
6569 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006570 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006571 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006572 ASSERT_VK_SUCCESS(err);
6573
6574 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6575 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006576 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006577 ASSERT_VK_SUCCESS(err);
6578
6579 BeginCommandBuffer();
6580 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006581 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006582 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006583 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006584 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006585 copyRegion.srcOffset.x = 0;
6586 copyRegion.srcOffset.y = 0;
6587 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006588 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006589 copyRegion.dstSubresource.mipLevel = 0;
6590 copyRegion.dstSubresource.baseArrayLayer = 0;
6591 copyRegion.dstSubresource.layerCount = 0;
6592 copyRegion.dstOffset.x = 0;
6593 copyRegion.dstOffset.y = 0;
6594 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006595 copyRegion.extent.width = 1;
6596 copyRegion.extent.height = 1;
6597 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006598 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6599 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006600 EndCommandBuffer();
6601
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006602 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006603
Chia-I Wuf7458c52015-10-26 21:10:41 +08006604 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006605 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006606 vkFreeMemory(m_device->device(), srcMem, NULL);
6607 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006608}
6609
Karl Schultz6addd812016-02-02 17:17:23 -07006610TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
6611 VkResult err;
6612 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006613
Karl Schultz6addd812016-02-02 17:17:23 -07006614 m_errorMonitor->SetDesiredFailureMsg(
6615 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006616 "vkCmdResolveImage called with source sample count less than 2.");
6617
Mike Stroyana3082432015-09-25 13:39:21 -06006618 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006619
6620 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07006621 VkImage srcImage;
6622 VkImage dstImage;
6623 VkDeviceMemory srcMem;
6624 VkDeviceMemory destMem;
6625 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006626
6627 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006628 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6629 image_create_info.pNext = NULL;
6630 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6631 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6632 image_create_info.extent.width = 32;
6633 image_create_info.extent.height = 1;
6634 image_create_info.extent.depth = 1;
6635 image_create_info.mipLevels = 1;
6636 image_create_info.arrayLayers = 1;
6637 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6638 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6639 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6640 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006641
Karl Schultz6addd812016-02-02 17:17:23 -07006642 err =
6643 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006644 ASSERT_VK_SUCCESS(err);
6645
Karl Schultz6addd812016-02-02 17:17:23 -07006646 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6647 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006648
Karl Schultz6addd812016-02-02 17:17:23 -07006649 err =
6650 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006651 ASSERT_VK_SUCCESS(err);
6652
6653 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006654 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006655 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6656 memAlloc.pNext = NULL;
6657 memAlloc.allocationSize = 0;
6658 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006659
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006660 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006661 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006662 pass =
6663 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006664 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006665 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006666 ASSERT_VK_SUCCESS(err);
6667
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006668 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006669 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006670 pass =
6671 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006672 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006673 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006674 ASSERT_VK_SUCCESS(err);
6675
6676 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6677 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006678 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006679 ASSERT_VK_SUCCESS(err);
6680
6681 BeginCommandBuffer();
6682 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006683 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6684 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006685 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006686 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006687 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006688 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006689 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006690 resolveRegion.srcOffset.x = 0;
6691 resolveRegion.srcOffset.y = 0;
6692 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006693 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006694 resolveRegion.dstSubresource.mipLevel = 0;
6695 resolveRegion.dstSubresource.baseArrayLayer = 0;
6696 resolveRegion.dstSubresource.layerCount = 0;
6697 resolveRegion.dstOffset.x = 0;
6698 resolveRegion.dstOffset.y = 0;
6699 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006700 resolveRegion.extent.width = 1;
6701 resolveRegion.extent.height = 1;
6702 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006703 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6704 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006705 EndCommandBuffer();
6706
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006707 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006708
Chia-I Wuf7458c52015-10-26 21:10:41 +08006709 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006710 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006711 vkFreeMemory(m_device->device(), srcMem, NULL);
6712 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006713}
6714
Karl Schultz6addd812016-02-02 17:17:23 -07006715TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
6716 VkResult err;
6717 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006718
Karl Schultz6addd812016-02-02 17:17:23 -07006719 m_errorMonitor->SetDesiredFailureMsg(
6720 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006721 "vkCmdResolveImage called with dest sample count greater than 1.");
6722
Mike Stroyana3082432015-09-25 13:39:21 -06006723 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006724
6725 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07006726 VkImage srcImage;
6727 VkImage dstImage;
6728 VkDeviceMemory srcMem;
6729 VkDeviceMemory destMem;
6730 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006731
6732 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006733 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6734 image_create_info.pNext = NULL;
6735 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6736 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6737 image_create_info.extent.width = 32;
6738 image_create_info.extent.height = 1;
6739 image_create_info.extent.depth = 1;
6740 image_create_info.mipLevels = 1;
6741 image_create_info.arrayLayers = 1;
6742 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6743 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6744 // Note: Some implementations expect color attachment usage for any
6745 // multisample surface
6746 image_create_info.usage =
6747 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6748 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006749
Karl Schultz6addd812016-02-02 17:17:23 -07006750 err =
6751 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006752 ASSERT_VK_SUCCESS(err);
6753
Karl Schultz6addd812016-02-02 17:17:23 -07006754 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6755 // Note: Some implementations expect color attachment usage for any
6756 // multisample surface
6757 image_create_info.usage =
6758 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006759
Karl Schultz6addd812016-02-02 17:17:23 -07006760 err =
6761 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006762 ASSERT_VK_SUCCESS(err);
6763
6764 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006765 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006766 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6767 memAlloc.pNext = NULL;
6768 memAlloc.allocationSize = 0;
6769 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006770
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006771 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006772 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006773 pass =
6774 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006775 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006776 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006777 ASSERT_VK_SUCCESS(err);
6778
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006779 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006780 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006781 pass =
6782 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006783 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006784 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006785 ASSERT_VK_SUCCESS(err);
6786
6787 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6788 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006789 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006790 ASSERT_VK_SUCCESS(err);
6791
6792 BeginCommandBuffer();
6793 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006794 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6795 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006796 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006797 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006798 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006799 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006800 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006801 resolveRegion.srcOffset.x = 0;
6802 resolveRegion.srcOffset.y = 0;
6803 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006804 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006805 resolveRegion.dstSubresource.mipLevel = 0;
6806 resolveRegion.dstSubresource.baseArrayLayer = 0;
6807 resolveRegion.dstSubresource.layerCount = 0;
6808 resolveRegion.dstOffset.x = 0;
6809 resolveRegion.dstOffset.y = 0;
6810 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006811 resolveRegion.extent.width = 1;
6812 resolveRegion.extent.height = 1;
6813 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006814 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6815 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006816 EndCommandBuffer();
6817
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006818 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006819
Chia-I Wuf7458c52015-10-26 21:10:41 +08006820 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006821 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006822 vkFreeMemory(m_device->device(), srcMem, NULL);
6823 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006824}
6825
Karl Schultz6addd812016-02-02 17:17:23 -07006826TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
6827 VkResult err;
6828 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006829
Karl Schultz6addd812016-02-02 17:17:23 -07006830 m_errorMonitor->SetDesiredFailureMsg(
6831 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006832 "vkCmdResolveImage called with unmatched source and dest formats.");
6833
Mike Stroyana3082432015-09-25 13:39:21 -06006834 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006835
6836 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006837 VkImage srcImage;
6838 VkImage dstImage;
6839 VkDeviceMemory srcMem;
6840 VkDeviceMemory destMem;
6841 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006842
6843 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006844 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6845 image_create_info.pNext = NULL;
6846 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6847 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6848 image_create_info.extent.width = 32;
6849 image_create_info.extent.height = 1;
6850 image_create_info.extent.depth = 1;
6851 image_create_info.mipLevels = 1;
6852 image_create_info.arrayLayers = 1;
6853 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6854 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6855 // Note: Some implementations expect color attachment usage for any
6856 // multisample surface
6857 image_create_info.usage =
6858 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6859 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006860
Karl Schultz6addd812016-02-02 17:17:23 -07006861 err =
6862 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006863 ASSERT_VK_SUCCESS(err);
6864
Karl Schultz6addd812016-02-02 17:17:23 -07006865 // Set format to something other than source image
6866 image_create_info.format = VK_FORMAT_R32_SFLOAT;
6867 // Note: Some implementations expect color attachment usage for any
6868 // multisample surface
6869 image_create_info.usage =
6870 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6871 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006872
Karl Schultz6addd812016-02-02 17:17:23 -07006873 err =
6874 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006875 ASSERT_VK_SUCCESS(err);
6876
6877 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006878 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006879 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6880 memAlloc.pNext = NULL;
6881 memAlloc.allocationSize = 0;
6882 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006883
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006884 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006885 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006886 pass =
6887 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006888 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006889 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006890 ASSERT_VK_SUCCESS(err);
6891
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006892 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006893 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006894 pass =
6895 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006896 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006897 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006898 ASSERT_VK_SUCCESS(err);
6899
6900 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6901 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006902 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006903 ASSERT_VK_SUCCESS(err);
6904
6905 BeginCommandBuffer();
6906 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006907 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6908 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006909 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006910 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006911 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006912 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006913 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006914 resolveRegion.srcOffset.x = 0;
6915 resolveRegion.srcOffset.y = 0;
6916 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006917 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006918 resolveRegion.dstSubresource.mipLevel = 0;
6919 resolveRegion.dstSubresource.baseArrayLayer = 0;
6920 resolveRegion.dstSubresource.layerCount = 0;
6921 resolveRegion.dstOffset.x = 0;
6922 resolveRegion.dstOffset.y = 0;
6923 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006924 resolveRegion.extent.width = 1;
6925 resolveRegion.extent.height = 1;
6926 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006927 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6928 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006929 EndCommandBuffer();
6930
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006931 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006932
Chia-I Wuf7458c52015-10-26 21:10:41 +08006933 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006934 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006935 vkFreeMemory(m_device->device(), srcMem, NULL);
6936 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006937}
6938
Karl Schultz6addd812016-02-02 17:17:23 -07006939TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
6940 VkResult err;
6941 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006942
Karl Schultz6addd812016-02-02 17:17:23 -07006943 m_errorMonitor->SetDesiredFailureMsg(
6944 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006945 "vkCmdResolveImage called with unmatched source and dest image types.");
6946
Mike Stroyana3082432015-09-25 13:39:21 -06006947 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006948
6949 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006950 VkImage srcImage;
6951 VkImage dstImage;
6952 VkDeviceMemory srcMem;
6953 VkDeviceMemory destMem;
6954 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006955
6956 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006957 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6958 image_create_info.pNext = NULL;
6959 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6960 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6961 image_create_info.extent.width = 32;
6962 image_create_info.extent.height = 1;
6963 image_create_info.extent.depth = 1;
6964 image_create_info.mipLevels = 1;
6965 image_create_info.arrayLayers = 1;
6966 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6967 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6968 // Note: Some implementations expect color attachment usage for any
6969 // multisample surface
6970 image_create_info.usage =
6971 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6972 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006973
Karl Schultz6addd812016-02-02 17:17:23 -07006974 err =
6975 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006976 ASSERT_VK_SUCCESS(err);
6977
Karl Schultz6addd812016-02-02 17:17:23 -07006978 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6979 // Note: Some implementations expect color attachment usage for any
6980 // multisample surface
6981 image_create_info.usage =
6982 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6983 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006984
Karl Schultz6addd812016-02-02 17:17:23 -07006985 err =
6986 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006987 ASSERT_VK_SUCCESS(err);
6988
6989 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006990 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006991 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6992 memAlloc.pNext = NULL;
6993 memAlloc.allocationSize = 0;
6994 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006995
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006996 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006997 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006998 pass =
6999 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007000 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007001 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007002 ASSERT_VK_SUCCESS(err);
7003
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007004 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007005 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007006 pass =
7007 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007008 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007009 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007010 ASSERT_VK_SUCCESS(err);
7011
7012 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7013 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007014 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007015 ASSERT_VK_SUCCESS(err);
7016
7017 BeginCommandBuffer();
7018 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07007019 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
7020 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06007021 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007022 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007023 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007024 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007025 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007026 resolveRegion.srcOffset.x = 0;
7027 resolveRegion.srcOffset.y = 0;
7028 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007029 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007030 resolveRegion.dstSubresource.mipLevel = 0;
7031 resolveRegion.dstSubresource.baseArrayLayer = 0;
7032 resolveRegion.dstSubresource.layerCount = 0;
7033 resolveRegion.dstOffset.x = 0;
7034 resolveRegion.dstOffset.y = 0;
7035 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007036 resolveRegion.extent.width = 1;
7037 resolveRegion.extent.height = 1;
7038 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007039 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7040 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007041 EndCommandBuffer();
7042
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007043 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007044
Chia-I Wuf7458c52015-10-26 21:10:41 +08007045 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007046 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007047 vkFreeMemory(m_device->device(), srcMem, NULL);
7048 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007049}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007050
Karl Schultz6addd812016-02-02 17:17:23 -07007051TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007052 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07007053 // to using a DS format, then cause it to hit error due to COLOR_BIT not
7054 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007055 // The image format check comes 2nd in validation so we trigger it first,
7056 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07007057 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007058
Karl Schultz6addd812016-02-02 17:17:23 -07007059 m_errorMonitor->SetDesiredFailureMsg(
7060 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007061 "Combination depth/stencil image formats can have only the ");
7062
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007063 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007064
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007065 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007066 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7067 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007068
7069 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007070 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7071 ds_pool_ci.pNext = NULL;
7072 ds_pool_ci.maxSets = 1;
7073 ds_pool_ci.poolSizeCount = 1;
7074 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007075
7076 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007077 err =
7078 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007079 ASSERT_VK_SUCCESS(err);
7080
7081 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007082 dsl_binding.binding = 0;
7083 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7084 dsl_binding.descriptorCount = 1;
7085 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7086 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007087
7088 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007089 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7090 ds_layout_ci.pNext = NULL;
7091 ds_layout_ci.bindingCount = 1;
7092 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007093 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007094 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7095 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007096 ASSERT_VK_SUCCESS(err);
7097
7098 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007099 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007100 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007101 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007102 alloc_info.descriptorPool = ds_pool;
7103 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007104 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7105 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007106 ASSERT_VK_SUCCESS(err);
7107
Karl Schultz6addd812016-02-02 17:17:23 -07007108 VkImage image_bad;
7109 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007110 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07007111 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007112 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07007113 const int32_t tex_width = 32;
7114 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007115
7116 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007117 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7118 image_create_info.pNext = NULL;
7119 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7120 image_create_info.format = tex_format_bad;
7121 image_create_info.extent.width = tex_width;
7122 image_create_info.extent.height = tex_height;
7123 image_create_info.extent.depth = 1;
7124 image_create_info.mipLevels = 1;
7125 image_create_info.arrayLayers = 1;
7126 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7127 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7128 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
7129 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
7130 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007131
Karl Schultz6addd812016-02-02 17:17:23 -07007132 err =
7133 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007134 ASSERT_VK_SUCCESS(err);
7135 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07007136 image_create_info.usage =
7137 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7138 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
7139 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007140 ASSERT_VK_SUCCESS(err);
7141
7142 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007143 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7144 image_view_create_info.image = image_bad;
7145 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7146 image_view_create_info.format = tex_format_bad;
7147 image_view_create_info.subresourceRange.baseArrayLayer = 0;
7148 image_view_create_info.subresourceRange.baseMipLevel = 0;
7149 image_view_create_info.subresourceRange.layerCount = 1;
7150 image_view_create_info.subresourceRange.levelCount = 1;
7151 image_view_create_info.subresourceRange.aspectMask =
7152 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007153
7154 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007155 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7156 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007157
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007158 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007159
Chia-I Wuf7458c52015-10-26 21:10:41 +08007160 vkDestroyImage(m_device->device(), image_bad, NULL);
7161 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007162 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7163 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007164}
Tobin Ehliscde08892015-09-22 10:11:37 -06007165#endif // IMAGE_TESTS
7166
Tony Barbour300a6082015-04-07 13:44:53 -06007167int main(int argc, char **argv) {
7168 int result;
7169
Cody Northrop8e54a402016-03-08 22:25:52 -07007170#ifdef ANDROID
7171 int vulkanSupport = InitVulkan();
7172 if (vulkanSupport == 0)
7173 return 1;
7174#endif
7175
Tony Barbour300a6082015-04-07 13:44:53 -06007176 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06007177 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06007178
7179 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
7180
7181 result = RUN_ALL_TESTS();
7182
Tony Barbour6918cd52015-04-09 12:58:51 -06007183 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06007184 return result;
7185}