blob: 0bad845384cb5ec20837cee552c2d2d2b4f2c264 [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 Forbesa0193bc2016-04-04 19:19:47 +12005661TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
5662{
5663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5664 "is per-vertex in tessellation control shader stage "
5665 "but per-patch in tessellation evaluation shader stage");
5666
5667 ASSERT_NO_FATAL_FAILURE(InitState());
5668 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5669
Chris Forbesc1e852d2016-04-04 19:26:42 +12005670 if (!m_device->phy().features().tessellationShader) {
5671 printf("Device does not support tessellation shaders; skipped.\n");
5672 return;
5673 }
5674
Chris Forbesa0193bc2016-04-04 19:19:47 +12005675 char const *vsSource =
5676 "#version 450\n"
5677 "void main(){}\n";
5678 char const *tcsSource =
5679 "#version 450\n"
5680 "layout(location=0) out int x[];\n"
5681 "layout(vertices=3) out;\n"
5682 "void main(){\n"
5683 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
5684 " gl_TessLevelInner[0] = 1;\n"
5685 " x[gl_InvocationID] = gl_InvocationID;\n"
5686 "}\n";
5687 char const *tesSource =
5688 "#version 450\n"
5689 "layout(triangles, equal_spacing, cw) in;\n"
5690 "layout(location=0) patch in int x;\n"
5691 "out gl_PerVertex { vec4 gl_Position; };\n"
5692 "void main(){\n"
5693 " gl_Position.xyz = gl_TessCoord;\n"
5694 " gl_Position.w = x;\n"
5695 "}\n";
5696 char const *fsSource =
5697 "#version 450\n"
5698 "layout(location=0) out vec4 color;\n"
5699 "void main(){\n"
5700 " color = vec4(1);\n"
5701 "}\n";
5702
5703 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5704 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
5705 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
5706 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5707
5708 VkPipelineInputAssemblyStateCreateInfo iasci{
5709 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
5710 nullptr,
5711 0,
5712 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
5713 VK_FALSE};
5714
5715 VkPipelineTessellationStateCreateInfo tsci{
5716 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
5717 nullptr,
5718 0,
5719 3};
5720
5721 VkPipelineObj pipe(m_device);
5722 pipe.SetInputAssembly(&iasci);
5723 pipe.SetTessellation(&tsci);
5724 pipe.AddColorAttachment();
5725 pipe.AddShader(&vs);
5726 pipe.AddShader(&tcs);
5727 pipe.AddShader(&tes);
5728 pipe.AddShader(&fs);
5729
5730 VkDescriptorSetObj descriptorSet(m_device);
5731 descriptorSet.AppendDummy();
5732 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5733
5734 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5735
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005736 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12005737}
5738
Karl Schultz6addd812016-02-02 17:17:23 -07005739TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
5740 m_errorMonitor->SetDesiredFailureMsg(
5741 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005742 "Duplicate vertex input binding descriptions for binding 0");
5743
Chris Forbes280ba2c2015-06-12 11:16:41 +12005744 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005745 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12005746
5747 /* Two binding descriptions for binding 0 */
5748 VkVertexInputBindingDescription input_bindings[2];
5749 memset(input_bindings, 0, sizeof(input_bindings));
5750
5751 VkVertexInputAttributeDescription input_attrib;
5752 memset(&input_attrib, 0, sizeof(input_attrib));
5753 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5754
5755 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005756 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005757 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005758 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07005759 "out gl_PerVertex {\n"
5760 " vec4 gl_Position;\n"
5761 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005762 "void main(){\n"
5763 " gl_Position = vec4(x);\n"
5764 "}\n";
5765 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005766 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005767 "\n"
5768 "layout(location=0) out vec4 color;\n"
5769 "void main(){\n"
5770 " color = vec4(1);\n"
5771 "}\n";
5772
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005773 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5774 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12005775
5776 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005777 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12005778 pipe.AddShader(&vs);
5779 pipe.AddShader(&fs);
5780
5781 pipe.AddVertexInputBindings(input_bindings, 2);
5782 pipe.AddVertexInputAttribs(&input_attrib, 1);
5783
Chris Forbes280ba2c2015-06-12 11:16:41 +12005784 VkDescriptorSetObj descriptorSet(m_device);
5785 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005786 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12005787
Tony Barbour5781e8f2015-08-04 16:23:11 -06005788 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12005789
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005790 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12005791}
Chris Forbes8f68b562015-05-25 11:13:32 +12005792
Karl Schultz6addd812016-02-02 17:17:23 -07005793TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005795 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005796
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005797 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005798
5799 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005800 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005801 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005802 "out gl_PerVertex {\n"
5803 " vec4 gl_Position;\n"
5804 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005805 "void main(){\n"
5806 " gl_Position = vec4(1);\n"
5807 "}\n";
5808 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005809 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005810 "\n"
5811 "void main(){\n"
5812 "}\n";
5813
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005814 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5815 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005816
5817 VkPipelineObj pipe(m_device);
5818 pipe.AddShader(&vs);
5819 pipe.AddShader(&fs);
5820
Chia-I Wu08accc62015-07-07 11:50:03 +08005821 /* set up CB 0, not written */
5822 pipe.AddColorAttachment();
5823 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005824
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005825 VkDescriptorSetObj descriptorSet(m_device);
5826 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005827 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005828
Tony Barbour5781e8f2015-08-04 16:23:11 -06005829 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005830
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005831 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005832}
5833
Karl Schultz6addd812016-02-02 17:17:23 -07005834TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07005835 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005836 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005837 "FS writes to output location 1 with no matching attachment");
5838
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005839 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005840
5841 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005842 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005843 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005844 "out gl_PerVertex {\n"
5845 " vec4 gl_Position;\n"
5846 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005847 "void main(){\n"
5848 " gl_Position = vec4(1);\n"
5849 "}\n";
5850 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005851 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005852 "\n"
5853 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005854 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005855 "void main(){\n"
5856 " x = vec4(1);\n"
5857 " y = vec4(1);\n"
5858 "}\n";
5859
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005860 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5861 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005862
5863 VkPipelineObj pipe(m_device);
5864 pipe.AddShader(&vs);
5865 pipe.AddShader(&fs);
5866
Chia-I Wu08accc62015-07-07 11:50:03 +08005867 /* set up CB 0, not written */
5868 pipe.AddColorAttachment();
5869 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005870 /* FS writes CB 1, but we don't configure it */
5871
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005872 VkDescriptorSetObj descriptorSet(m_device);
5873 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005874 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005875
Tony Barbour5781e8f2015-08-04 16:23:11 -06005876 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005877
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005878 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005879}
5880
Karl Schultz6addd812016-02-02 17:17:23 -07005881TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005883 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005884
Chris Forbesa36d69e2015-05-25 11:13:44 +12005885 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12005886
5887 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005888 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005889 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005890 "out gl_PerVertex {\n"
5891 " vec4 gl_Position;\n"
5892 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005893 "void main(){\n"
5894 " gl_Position = vec4(1);\n"
5895 "}\n";
5896 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005897 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005898 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005899 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12005900 "void main(){\n"
5901 " x = ivec4(1);\n"
5902 "}\n";
5903
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005904 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5905 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12005906
5907 VkPipelineObj pipe(m_device);
5908 pipe.AddShader(&vs);
5909 pipe.AddShader(&fs);
5910
Chia-I Wu08accc62015-07-07 11:50:03 +08005911 /* set up CB 0; type is UNORM by default */
5912 pipe.AddColorAttachment();
5913 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12005914
Chris Forbesa36d69e2015-05-25 11:13:44 +12005915 VkDescriptorSetObj descriptorSet(m_device);
5916 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005917 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12005918
Tony Barbour5781e8f2015-08-04 16:23:11 -06005919 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12005920
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005921 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12005922}
Chris Forbes7b1b8932015-06-05 14:43:36 +12005923
Karl Schultz6addd812016-02-02 17:17:23 -07005924TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005926 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005927
Chris Forbes556c76c2015-08-14 12:04:59 +12005928 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12005929
5930 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005931 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12005932 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005933 "out gl_PerVertex {\n"
5934 " vec4 gl_Position;\n"
5935 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12005936 "void main(){\n"
5937 " gl_Position = vec4(1);\n"
5938 "}\n";
5939 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005940 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12005941 "\n"
5942 "layout(location=0) out vec4 x;\n"
5943 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5944 "void main(){\n"
5945 " x = vec4(bar.y);\n"
5946 "}\n";
5947
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005948 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5949 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12005950
Chris Forbes556c76c2015-08-14 12:04:59 +12005951 VkPipelineObj pipe(m_device);
5952 pipe.AddShader(&vs);
5953 pipe.AddShader(&fs);
5954
5955 /* set up CB 0; type is UNORM by default */
5956 pipe.AddColorAttachment();
5957 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5958
5959 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005960 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12005961
5962 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5963
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005964 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12005965}
5966
Chris Forbes5c59e902016-02-26 16:56:09 +13005967TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
5968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5969 "not declared in layout");
5970
5971 ASSERT_NO_FATAL_FAILURE(InitState());
5972
5973 char const *vsSource =
5974 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13005975 "\n"
5976 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
5977 "out gl_PerVertex {\n"
5978 " vec4 gl_Position;\n"
5979 "};\n"
5980 "void main(){\n"
5981 " gl_Position = vec4(consts.x);\n"
5982 "}\n";
5983 char const *fsSource =
5984 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13005985 "\n"
5986 "layout(location=0) out vec4 x;\n"
5987 "void main(){\n"
5988 " x = vec4(1);\n"
5989 "}\n";
5990
5991 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5992 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5993
5994 VkPipelineObj pipe(m_device);
5995 pipe.AddShader(&vs);
5996 pipe.AddShader(&fs);
5997
5998 /* set up CB 0; type is UNORM by default */
5999 pipe.AddColorAttachment();
6000 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6001
6002 VkDescriptorSetObj descriptorSet(m_device);
6003 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6004
6005 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6006
6007 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006008 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13006009}
6010
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006011#endif // SHADER_CHECKER_TESTS
6012
6013#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06006014TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07006015 m_errorMonitor->SetDesiredFailureMsg(
6016 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006017 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006018
6019 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006020
6021 // Create an image
6022 VkImage image;
6023
Karl Schultz6addd812016-02-02 17:17:23 -07006024 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6025 const int32_t tex_width = 32;
6026 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006027
6028 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006029 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6030 image_create_info.pNext = NULL;
6031 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6032 image_create_info.format = tex_format;
6033 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006034 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07006035 image_create_info.extent.depth = 1;
6036 image_create_info.mipLevels = 1;
6037 image_create_info.arrayLayers = 1;
6038 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6039 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6040 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6041 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006042
6043 // Introduce error by sending down a bogus width extent
6044 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006045 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006046
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006047 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006048}
6049
Mark Youngc48c4c12016-04-11 14:26:49 -06006050TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
6051 m_errorMonitor->SetDesiredFailureMsg(
6052 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6053 "CreateImage extents is 0 for at least one required dimension");
6054
6055 ASSERT_NO_FATAL_FAILURE(InitState());
6056
6057 // Create an image
6058 VkImage image;
6059
6060 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6061 const int32_t tex_width = 32;
6062 const int32_t tex_height = 32;
6063
6064 VkImageCreateInfo image_create_info = {};
6065 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6066 image_create_info.pNext = NULL;
6067 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6068 image_create_info.format = tex_format;
6069 image_create_info.extent.width = tex_width;
6070 image_create_info.extent.height = tex_height;
6071 image_create_info.extent.depth = 1;
6072 image_create_info.mipLevels = 1;
6073 image_create_info.arrayLayers = 1;
6074 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6075 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6076 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6077 image_create_info.flags = 0;
6078
6079 // Introduce error by sending down a bogus width extent
6080 image_create_info.extent.width = 0;
6081 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6082
6083 m_errorMonitor->VerifyFound();
6084}
6085
Karl Schultz6addd812016-02-02 17:17:23 -07006086TEST_F(VkLayerTest, UpdateBufferAlignment) {
6087 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06006088
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006089 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006090 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006091
Mike Stroyana3082432015-09-25 13:39:21 -06006092 ASSERT_NO_FATAL_FAILURE(InitState());
6093
6094 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
6095 vk_testing::Buffer buffer;
6096 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
6097
6098 BeginCommandBuffer();
6099 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006100 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006101 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006102
Mike Stroyana3082432015-09-25 13:39:21 -06006103 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006105 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006106
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006107 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006108 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006109 EndCommandBuffer();
6110}
6111
Karl Schultz6addd812016-02-02 17:17:23 -07006112TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006114 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06006115
6116 ASSERT_NO_FATAL_FAILURE(InitState());
6117
6118 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
6119 vk_testing::Buffer buffer;
6120 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
6121
6122 BeginCommandBuffer();
6123 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006124 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006125 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006126
Mike Stroyana3082432015-09-25 13:39:21 -06006127 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006129 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006130
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006131 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006132
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006133 m_errorMonitor->VerifyFound();
6134
Mike Stroyana3082432015-09-25 13:39:21 -06006135 EndCommandBuffer();
6136}
6137
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006138#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12006139
Tobin Ehliscde08892015-09-22 10:11:37 -06006140#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006141TEST_F(VkLayerTest, InvalidImageView) {
6142 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06006143
Karl Schultz6addd812016-02-02 17:17:23 -07006144 m_errorMonitor->SetDesiredFailureMsg(
6145 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006146 "vkCreateImageView called with baseMipLevel 10 ");
6147
Tobin Ehliscde08892015-09-22 10:11:37 -06006148 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06006149
Mike Stroyana3082432015-09-25 13:39:21 -06006150 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07006151 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06006152
Karl Schultz6addd812016-02-02 17:17:23 -07006153 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6154 const int32_t tex_width = 32;
6155 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06006156
6157 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006158 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6159 image_create_info.pNext = NULL;
6160 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6161 image_create_info.format = tex_format;
6162 image_create_info.extent.width = tex_width;
6163 image_create_info.extent.height = tex_height;
6164 image_create_info.extent.depth = 1;
6165 image_create_info.mipLevels = 1;
6166 image_create_info.arrayLayers = 1;
6167 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6168 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6169 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6170 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06006171
Chia-I Wuf7458c52015-10-26 21:10:41 +08006172 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06006173 ASSERT_VK_SUCCESS(err);
6174
6175 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006176 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6177 image_view_create_info.image = image;
6178 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6179 image_view_create_info.format = tex_format;
6180 image_view_create_info.subresourceRange.layerCount = 1;
6181 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
6182 image_view_create_info.subresourceRange.levelCount = 1;
6183 image_view_create_info.subresourceRange.aspectMask =
6184 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06006185
6186 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07006187 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6188 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06006189
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006190 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06006191}
Mike Stroyana3082432015-09-25 13:39:21 -06006192
Karl Schultz6addd812016-02-02 17:17:23 -07006193TEST_F(VkLayerTest, InvalidImageViewAspect) {
6194 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006195
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006197 "vkCreateImageView: Color image "
6198 "formats must have ONLY the "
6199 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006200
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006201 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006202
6203 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07006204 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006205
Karl Schultz6addd812016-02-02 17:17:23 -07006206 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6207 const int32_t tex_width = 32;
6208 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006209
6210 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006211 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6212 image_create_info.pNext = NULL;
6213 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6214 image_create_info.format = tex_format;
6215 image_create_info.extent.width = tex_width;
6216 image_create_info.extent.height = tex_height;
6217 image_create_info.extent.depth = 1;
6218 image_create_info.mipLevels = 1;
6219 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6220 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6221 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6222 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006223
Chia-I Wuf7458c52015-10-26 21:10:41 +08006224 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006225 ASSERT_VK_SUCCESS(err);
6226
6227 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006228 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6229 image_view_create_info.image = image;
6230 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6231 image_view_create_info.format = tex_format;
6232 image_view_create_info.subresourceRange.baseMipLevel = 0;
6233 image_view_create_info.subresourceRange.levelCount = 1;
6234 // Cause an error by setting an invalid image aspect
6235 image_view_create_info.subresourceRange.aspectMask =
6236 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006237
6238 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07006239 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6240 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006241
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006242 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006243}
6244
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006245TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07006246 VkResult err;
6247 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006248
Karl Schultz6addd812016-02-02 17:17:23 -07006249 m_errorMonitor->SetDesiredFailureMsg(
6250 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006251 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006252
Mike Stroyana3082432015-09-25 13:39:21 -06006253 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006254
6255 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006256 VkImage srcImage;
6257 VkImage dstImage;
6258 VkDeviceMemory srcMem;
6259 VkDeviceMemory destMem;
6260 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006261
6262 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006263 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6264 image_create_info.pNext = NULL;
6265 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6266 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6267 image_create_info.extent.width = 32;
6268 image_create_info.extent.height = 32;
6269 image_create_info.extent.depth = 1;
6270 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006271 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07006272 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6273 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6274 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6275 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006276
Karl Schultz6addd812016-02-02 17:17:23 -07006277 err =
6278 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006279 ASSERT_VK_SUCCESS(err);
6280
Karl Schultz6addd812016-02-02 17:17:23 -07006281 err =
6282 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006283 ASSERT_VK_SUCCESS(err);
6284
6285 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006286 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006287 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6288 memAlloc.pNext = NULL;
6289 memAlloc.allocationSize = 0;
6290 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006291
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006292 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006293 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006294 pass =
6295 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006296 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006297 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006298 ASSERT_VK_SUCCESS(err);
6299
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006300 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006301 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006302 pass =
6303 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006304 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006305 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006306 ASSERT_VK_SUCCESS(err);
6307
6308 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6309 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006310 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006311 ASSERT_VK_SUCCESS(err);
6312
6313 BeginCommandBuffer();
6314 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006315 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006316 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006317 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006318 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06006319 copyRegion.srcOffset.x = 0;
6320 copyRegion.srcOffset.y = 0;
6321 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006322 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006323 copyRegion.dstSubresource.mipLevel = 0;
6324 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006325 // Introduce failure by forcing the dst layerCount to differ from src
6326 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006327 copyRegion.dstOffset.x = 0;
6328 copyRegion.dstOffset.y = 0;
6329 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006330 copyRegion.extent.width = 1;
6331 copyRegion.extent.height = 1;
6332 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006333 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6334 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006335 EndCommandBuffer();
6336
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006337 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006338
Chia-I Wuf7458c52015-10-26 21:10:41 +08006339 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006340 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006341 vkFreeMemory(m_device->device(), srcMem, NULL);
6342 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006343}
6344
Karl Schultz6addd812016-02-02 17:17:23 -07006345TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006346 VkResult err;
6347 bool pass;
6348
6349 // Create color images with different format sizes and try to copy between them
6350 m_errorMonitor->SetDesiredFailureMsg(
6351 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6352 "vkCmdCopyImage called with unmatched source and dest image format sizes");
6353
6354 ASSERT_NO_FATAL_FAILURE(InitState());
6355
6356 // Create two images of different types and try to copy between them
6357 VkImage srcImage;
6358 VkImage dstImage;
6359 VkDeviceMemory srcMem;
6360 VkDeviceMemory destMem;
6361 VkMemoryRequirements memReqs;
6362
6363 VkImageCreateInfo image_create_info = {};
6364 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6365 image_create_info.pNext = NULL;
6366 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6367 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6368 image_create_info.extent.width = 32;
6369 image_create_info.extent.height = 32;
6370 image_create_info.extent.depth = 1;
6371 image_create_info.mipLevels = 1;
6372 image_create_info.arrayLayers = 1;
6373 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6374 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6375 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6376 image_create_info.flags = 0;
6377
6378 err =
6379 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
6380 ASSERT_VK_SUCCESS(err);
6381
6382 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6383 // Introduce failure by creating second image with a different-sized format.
6384 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
6385
6386 err =
6387 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
6388 ASSERT_VK_SUCCESS(err);
6389
6390 // Allocate memory
6391 VkMemoryAllocateInfo memAlloc = {};
6392 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6393 memAlloc.pNext = NULL;
6394 memAlloc.allocationSize = 0;
6395 memAlloc.memoryTypeIndex = 0;
6396
6397 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
6398 memAlloc.allocationSize = memReqs.size;
6399 pass =
6400 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
6401 ASSERT_TRUE(pass);
6402 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
6403 ASSERT_VK_SUCCESS(err);
6404
6405 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
6406 memAlloc.allocationSize = memReqs.size;
6407 pass =
6408 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
6409 ASSERT_TRUE(pass);
6410 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
6411 ASSERT_VK_SUCCESS(err);
6412
6413 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6414 ASSERT_VK_SUCCESS(err);
6415 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
6416 ASSERT_VK_SUCCESS(err);
6417
6418 BeginCommandBuffer();
6419 VkImageCopy copyRegion;
6420 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6421 copyRegion.srcSubresource.mipLevel = 0;
6422 copyRegion.srcSubresource.baseArrayLayer = 0;
6423 copyRegion.srcSubresource.layerCount = 0;
6424 copyRegion.srcOffset.x = 0;
6425 copyRegion.srcOffset.y = 0;
6426 copyRegion.srcOffset.z = 0;
6427 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6428 copyRegion.dstSubresource.mipLevel = 0;
6429 copyRegion.dstSubresource.baseArrayLayer = 0;
6430 copyRegion.dstSubresource.layerCount = 0;
6431 copyRegion.dstOffset.x = 0;
6432 copyRegion.dstOffset.y = 0;
6433 copyRegion.dstOffset.z = 0;
6434 copyRegion.extent.width = 1;
6435 copyRegion.extent.height = 1;
6436 copyRegion.extent.depth = 1;
6437 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6438 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6439 EndCommandBuffer();
6440
6441 m_errorMonitor->VerifyFound();
6442
6443 vkDestroyImage(m_device->device(), srcImage, NULL);
6444 vkDestroyImage(m_device->device(), dstImage, NULL);
6445 vkFreeMemory(m_device->device(), srcMem, NULL);
6446 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006447}
6448
Karl Schultz6addd812016-02-02 17:17:23 -07006449TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
6450 VkResult err;
6451 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006452
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006453 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006454 m_errorMonitor->SetDesiredFailureMsg(
6455 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006456 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006457
Mike Stroyana3082432015-09-25 13:39:21 -06006458 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006459
6460 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006461 VkImage srcImage;
6462 VkImage dstImage;
6463 VkDeviceMemory srcMem;
6464 VkDeviceMemory destMem;
6465 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006466
6467 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006468 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6469 image_create_info.pNext = NULL;
6470 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6471 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6472 image_create_info.extent.width = 32;
6473 image_create_info.extent.height = 32;
6474 image_create_info.extent.depth = 1;
6475 image_create_info.mipLevels = 1;
6476 image_create_info.arrayLayers = 1;
6477 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6478 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6479 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6480 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006481
Karl Schultz6addd812016-02-02 17:17:23 -07006482 err =
6483 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006484 ASSERT_VK_SUCCESS(err);
6485
Karl Schultzbdb75952016-04-19 11:36:49 -06006486 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6487
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006488 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07006489 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06006490 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
6491 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006492
Karl Schultz6addd812016-02-02 17:17:23 -07006493 err =
6494 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006495 ASSERT_VK_SUCCESS(err);
6496
6497 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006498 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006499 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6500 memAlloc.pNext = NULL;
6501 memAlloc.allocationSize = 0;
6502 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006503
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006504 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006505 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006506 pass =
6507 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006508 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006509 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006510 ASSERT_VK_SUCCESS(err);
6511
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006512 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006513 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006514 pass =
6515 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006516 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006517 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006518 ASSERT_VK_SUCCESS(err);
6519
6520 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6521 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006522 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006523 ASSERT_VK_SUCCESS(err);
6524
6525 BeginCommandBuffer();
6526 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006527 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006528 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006529 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006530 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006531 copyRegion.srcOffset.x = 0;
6532 copyRegion.srcOffset.y = 0;
6533 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006534 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006535 copyRegion.dstSubresource.mipLevel = 0;
6536 copyRegion.dstSubresource.baseArrayLayer = 0;
6537 copyRegion.dstSubresource.layerCount = 0;
6538 copyRegion.dstOffset.x = 0;
6539 copyRegion.dstOffset.y = 0;
6540 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006541 copyRegion.extent.width = 1;
6542 copyRegion.extent.height = 1;
6543 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006544 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6545 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006546 EndCommandBuffer();
6547
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006548 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006549
Chia-I Wuf7458c52015-10-26 21:10:41 +08006550 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006551 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006552 vkFreeMemory(m_device->device(), srcMem, NULL);
6553 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006554}
6555
Karl Schultz6addd812016-02-02 17:17:23 -07006556TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
6557 VkResult err;
6558 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006559
Karl Schultz6addd812016-02-02 17:17:23 -07006560 m_errorMonitor->SetDesiredFailureMsg(
6561 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006562 "vkCmdResolveImage called with source sample count less than 2.");
6563
Mike Stroyana3082432015-09-25 13:39:21 -06006564 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006565
6566 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07006567 VkImage srcImage;
6568 VkImage dstImage;
6569 VkDeviceMemory srcMem;
6570 VkDeviceMemory destMem;
6571 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006572
6573 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006574 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6575 image_create_info.pNext = NULL;
6576 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6577 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6578 image_create_info.extent.width = 32;
6579 image_create_info.extent.height = 1;
6580 image_create_info.extent.depth = 1;
6581 image_create_info.mipLevels = 1;
6582 image_create_info.arrayLayers = 1;
6583 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6584 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6585 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6586 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006587
Karl Schultz6addd812016-02-02 17:17:23 -07006588 err =
6589 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006590 ASSERT_VK_SUCCESS(err);
6591
Karl Schultz6addd812016-02-02 17:17:23 -07006592 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6593 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006594
Karl Schultz6addd812016-02-02 17:17:23 -07006595 err =
6596 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006597 ASSERT_VK_SUCCESS(err);
6598
6599 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006600 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006601 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6602 memAlloc.pNext = NULL;
6603 memAlloc.allocationSize = 0;
6604 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006605
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006606 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006607 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006608 pass =
6609 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006610 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006611 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006612 ASSERT_VK_SUCCESS(err);
6613
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006614 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006615 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006616 pass =
6617 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006618 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006619 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006620 ASSERT_VK_SUCCESS(err);
6621
6622 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6623 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006624 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006625 ASSERT_VK_SUCCESS(err);
6626
6627 BeginCommandBuffer();
6628 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006629 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6630 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006631 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006632 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006633 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006634 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006635 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006636 resolveRegion.srcOffset.x = 0;
6637 resolveRegion.srcOffset.y = 0;
6638 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006639 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006640 resolveRegion.dstSubresource.mipLevel = 0;
6641 resolveRegion.dstSubresource.baseArrayLayer = 0;
6642 resolveRegion.dstSubresource.layerCount = 0;
6643 resolveRegion.dstOffset.x = 0;
6644 resolveRegion.dstOffset.y = 0;
6645 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006646 resolveRegion.extent.width = 1;
6647 resolveRegion.extent.height = 1;
6648 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006649 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6650 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006651 EndCommandBuffer();
6652
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006653 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006654
Chia-I Wuf7458c52015-10-26 21:10:41 +08006655 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006656 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006657 vkFreeMemory(m_device->device(), srcMem, NULL);
6658 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006659}
6660
Karl Schultz6addd812016-02-02 17:17:23 -07006661TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
6662 VkResult err;
6663 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006664
Karl Schultz6addd812016-02-02 17:17:23 -07006665 m_errorMonitor->SetDesiredFailureMsg(
6666 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006667 "vkCmdResolveImage called with dest sample count greater than 1.");
6668
Mike Stroyana3082432015-09-25 13:39:21 -06006669 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006670
6671 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07006672 VkImage srcImage;
6673 VkImage dstImage;
6674 VkDeviceMemory srcMem;
6675 VkDeviceMemory destMem;
6676 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006677
6678 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006679 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6680 image_create_info.pNext = NULL;
6681 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6682 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6683 image_create_info.extent.width = 32;
6684 image_create_info.extent.height = 1;
6685 image_create_info.extent.depth = 1;
6686 image_create_info.mipLevels = 1;
6687 image_create_info.arrayLayers = 1;
6688 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6689 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6690 // Note: Some implementations expect color attachment usage for any
6691 // multisample surface
6692 image_create_info.usage =
6693 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6694 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006695
Karl Schultz6addd812016-02-02 17:17:23 -07006696 err =
6697 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006698 ASSERT_VK_SUCCESS(err);
6699
Karl Schultz6addd812016-02-02 17:17:23 -07006700 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6701 // Note: Some implementations expect color attachment usage for any
6702 // multisample surface
6703 image_create_info.usage =
6704 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006705
Karl Schultz6addd812016-02-02 17:17:23 -07006706 err =
6707 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006708 ASSERT_VK_SUCCESS(err);
6709
6710 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006711 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006712 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6713 memAlloc.pNext = NULL;
6714 memAlloc.allocationSize = 0;
6715 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006716
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006717 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006718 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006719 pass =
6720 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006721 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006722 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006723 ASSERT_VK_SUCCESS(err);
6724
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006725 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006726 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006727 pass =
6728 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006729 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006730 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006731 ASSERT_VK_SUCCESS(err);
6732
6733 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6734 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006735 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006736 ASSERT_VK_SUCCESS(err);
6737
6738 BeginCommandBuffer();
6739 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006740 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6741 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006742 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006743 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006744 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006745 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006746 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006747 resolveRegion.srcOffset.x = 0;
6748 resolveRegion.srcOffset.y = 0;
6749 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006750 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006751 resolveRegion.dstSubresource.mipLevel = 0;
6752 resolveRegion.dstSubresource.baseArrayLayer = 0;
6753 resolveRegion.dstSubresource.layerCount = 0;
6754 resolveRegion.dstOffset.x = 0;
6755 resolveRegion.dstOffset.y = 0;
6756 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006757 resolveRegion.extent.width = 1;
6758 resolveRegion.extent.height = 1;
6759 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006760 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6761 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006762 EndCommandBuffer();
6763
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006764 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006765
Chia-I Wuf7458c52015-10-26 21:10:41 +08006766 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006767 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006768 vkFreeMemory(m_device->device(), srcMem, NULL);
6769 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006770}
6771
Karl Schultz6addd812016-02-02 17:17:23 -07006772TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
6773 VkResult err;
6774 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006775
Karl Schultz6addd812016-02-02 17:17:23 -07006776 m_errorMonitor->SetDesiredFailureMsg(
6777 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006778 "vkCmdResolveImage called with unmatched source and dest formats.");
6779
Mike Stroyana3082432015-09-25 13:39:21 -06006780 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006781
6782 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006783 VkImage srcImage;
6784 VkImage dstImage;
6785 VkDeviceMemory srcMem;
6786 VkDeviceMemory destMem;
6787 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006788
6789 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006790 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6791 image_create_info.pNext = NULL;
6792 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6793 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6794 image_create_info.extent.width = 32;
6795 image_create_info.extent.height = 1;
6796 image_create_info.extent.depth = 1;
6797 image_create_info.mipLevels = 1;
6798 image_create_info.arrayLayers = 1;
6799 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6800 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6801 // Note: Some implementations expect color attachment usage for any
6802 // multisample surface
6803 image_create_info.usage =
6804 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6805 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006806
Karl Schultz6addd812016-02-02 17:17:23 -07006807 err =
6808 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006809 ASSERT_VK_SUCCESS(err);
6810
Karl Schultz6addd812016-02-02 17:17:23 -07006811 // Set format to something other than source image
6812 image_create_info.format = VK_FORMAT_R32_SFLOAT;
6813 // Note: Some implementations expect color attachment usage for any
6814 // multisample surface
6815 image_create_info.usage =
6816 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6817 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006818
Karl Schultz6addd812016-02-02 17:17:23 -07006819 err =
6820 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006821 ASSERT_VK_SUCCESS(err);
6822
6823 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006824 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006825 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6826 memAlloc.pNext = NULL;
6827 memAlloc.allocationSize = 0;
6828 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006829
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006830 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006831 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006832 pass =
6833 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006834 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006835 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006836 ASSERT_VK_SUCCESS(err);
6837
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006838 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006839 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006840 pass =
6841 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006842 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006843 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006844 ASSERT_VK_SUCCESS(err);
6845
6846 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6847 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006848 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006849 ASSERT_VK_SUCCESS(err);
6850
6851 BeginCommandBuffer();
6852 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006853 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6854 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006855 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006856 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006857 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006858 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006859 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006860 resolveRegion.srcOffset.x = 0;
6861 resolveRegion.srcOffset.y = 0;
6862 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006863 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006864 resolveRegion.dstSubresource.mipLevel = 0;
6865 resolveRegion.dstSubresource.baseArrayLayer = 0;
6866 resolveRegion.dstSubresource.layerCount = 0;
6867 resolveRegion.dstOffset.x = 0;
6868 resolveRegion.dstOffset.y = 0;
6869 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006870 resolveRegion.extent.width = 1;
6871 resolveRegion.extent.height = 1;
6872 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006873 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6874 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006875 EndCommandBuffer();
6876
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006877 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006878
Chia-I Wuf7458c52015-10-26 21:10:41 +08006879 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006880 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006881 vkFreeMemory(m_device->device(), srcMem, NULL);
6882 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006883}
6884
Karl Schultz6addd812016-02-02 17:17:23 -07006885TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
6886 VkResult err;
6887 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006888
Karl Schultz6addd812016-02-02 17:17:23 -07006889 m_errorMonitor->SetDesiredFailureMsg(
6890 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006891 "vkCmdResolveImage called with unmatched source and dest image types.");
6892
Mike Stroyana3082432015-09-25 13:39:21 -06006893 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006894
6895 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006896 VkImage srcImage;
6897 VkImage dstImage;
6898 VkDeviceMemory srcMem;
6899 VkDeviceMemory destMem;
6900 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006901
6902 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006903 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6904 image_create_info.pNext = NULL;
6905 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6906 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6907 image_create_info.extent.width = 32;
6908 image_create_info.extent.height = 1;
6909 image_create_info.extent.depth = 1;
6910 image_create_info.mipLevels = 1;
6911 image_create_info.arrayLayers = 1;
6912 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6913 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6914 // Note: Some implementations expect color attachment usage for any
6915 // multisample surface
6916 image_create_info.usage =
6917 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6918 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006919
Karl Schultz6addd812016-02-02 17:17:23 -07006920 err =
6921 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006922 ASSERT_VK_SUCCESS(err);
6923
Karl Schultz6addd812016-02-02 17:17:23 -07006924 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6925 // Note: Some implementations expect color attachment usage for any
6926 // multisample surface
6927 image_create_info.usage =
6928 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6929 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006930
Karl Schultz6addd812016-02-02 17:17:23 -07006931 err =
6932 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006933 ASSERT_VK_SUCCESS(err);
6934
6935 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006936 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006937 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6938 memAlloc.pNext = NULL;
6939 memAlloc.allocationSize = 0;
6940 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006941
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006942 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006943 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006944 pass =
6945 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006946 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006947 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006948 ASSERT_VK_SUCCESS(err);
6949
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006950 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006951 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006952 pass =
6953 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006954 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006955 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006956 ASSERT_VK_SUCCESS(err);
6957
6958 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6959 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006960 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006961 ASSERT_VK_SUCCESS(err);
6962
6963 BeginCommandBuffer();
6964 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006965 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6966 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006967 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006968 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006969 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006970 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006971 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006972 resolveRegion.srcOffset.x = 0;
6973 resolveRegion.srcOffset.y = 0;
6974 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006975 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006976 resolveRegion.dstSubresource.mipLevel = 0;
6977 resolveRegion.dstSubresource.baseArrayLayer = 0;
6978 resolveRegion.dstSubresource.layerCount = 0;
6979 resolveRegion.dstOffset.x = 0;
6980 resolveRegion.dstOffset.y = 0;
6981 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006982 resolveRegion.extent.width = 1;
6983 resolveRegion.extent.height = 1;
6984 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006985 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6986 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006987 EndCommandBuffer();
6988
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006989 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06006990
Chia-I Wuf7458c52015-10-26 21:10:41 +08006991 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006992 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006993 vkFreeMemory(m_device->device(), srcMem, NULL);
6994 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006995}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006996
Karl Schultz6addd812016-02-02 17:17:23 -07006997TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006998 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07006999 // to using a DS format, then cause it to hit error due to COLOR_BIT not
7000 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007001 // The image format check comes 2nd in validation so we trigger it first,
7002 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07007003 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007004
Karl Schultz6addd812016-02-02 17:17:23 -07007005 m_errorMonitor->SetDesiredFailureMsg(
7006 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007007 "Combination depth/stencil image formats can have only the ");
7008
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007009 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007010
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007011 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007012 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7013 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007014
7015 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007016 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7017 ds_pool_ci.pNext = NULL;
7018 ds_pool_ci.maxSets = 1;
7019 ds_pool_ci.poolSizeCount = 1;
7020 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007021
7022 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007023 err =
7024 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007025 ASSERT_VK_SUCCESS(err);
7026
7027 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007028 dsl_binding.binding = 0;
7029 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7030 dsl_binding.descriptorCount = 1;
7031 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7032 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007033
7034 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007035 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7036 ds_layout_ci.pNext = NULL;
7037 ds_layout_ci.bindingCount = 1;
7038 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007039 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007040 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7041 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007042 ASSERT_VK_SUCCESS(err);
7043
7044 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007045 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007046 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007047 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007048 alloc_info.descriptorPool = ds_pool;
7049 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007050 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7051 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007052 ASSERT_VK_SUCCESS(err);
7053
Karl Schultz6addd812016-02-02 17:17:23 -07007054 VkImage image_bad;
7055 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007056 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07007057 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007058 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07007059 const int32_t tex_width = 32;
7060 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007061
7062 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007063 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7064 image_create_info.pNext = NULL;
7065 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7066 image_create_info.format = tex_format_bad;
7067 image_create_info.extent.width = tex_width;
7068 image_create_info.extent.height = tex_height;
7069 image_create_info.extent.depth = 1;
7070 image_create_info.mipLevels = 1;
7071 image_create_info.arrayLayers = 1;
7072 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7073 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7074 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
7075 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
7076 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007077
Karl Schultz6addd812016-02-02 17:17:23 -07007078 err =
7079 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007080 ASSERT_VK_SUCCESS(err);
7081 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07007082 image_create_info.usage =
7083 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7084 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
7085 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007086 ASSERT_VK_SUCCESS(err);
7087
7088 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007089 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7090 image_view_create_info.image = image_bad;
7091 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7092 image_view_create_info.format = tex_format_bad;
7093 image_view_create_info.subresourceRange.baseArrayLayer = 0;
7094 image_view_create_info.subresourceRange.baseMipLevel = 0;
7095 image_view_create_info.subresourceRange.layerCount = 1;
7096 image_view_create_info.subresourceRange.levelCount = 1;
7097 image_view_create_info.subresourceRange.aspectMask =
7098 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007099
7100 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007101 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7102 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007103
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007104 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007105
Chia-I Wuf7458c52015-10-26 21:10:41 +08007106 vkDestroyImage(m_device->device(), image_bad, NULL);
7107 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007108 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7109 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007110}
Tobin Ehliscde08892015-09-22 10:11:37 -06007111#endif // IMAGE_TESTS
7112
Tony Barbour300a6082015-04-07 13:44:53 -06007113int main(int argc, char **argv) {
7114 int result;
7115
Cody Northrop8e54a402016-03-08 22:25:52 -07007116#ifdef ANDROID
7117 int vulkanSupport = InitVulkan();
7118 if (vulkanSupport == 0)
7119 return 1;
7120#endif
7121
Tony Barbour300a6082015-04-07 13:44:53 -06007122 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06007123 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06007124
7125 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
7126
7127 result = RUN_ALL_TESTS();
7128
Tony Barbour6918cd52015-04-09 12:58:51 -06007129 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06007130 return result;
7131}