blob: bd8b106447070e1947267058b9f0b50d9c71b134 [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
Dustin Graves48458142016-04-29 16:11:55 -0600120 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
121
Karl Schultz6addd812016-02-02 17:17:23 -0700122 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200123 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600124 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600125 m_failureMsg.clear();
126 m_otherMsgs.clear();
127 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700128 m_msgFound = VK_FALSE;
129 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600130 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600131 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600132
Karl Schultz6addd812016-02-02 17:17:23 -0700133 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600134 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600135 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600136 if (m_bailout != NULL) {
137 *m_bailout = true;
138 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600139 string errorString(msgString);
140 if (msgFlags & m_msgFlags) {
141 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200142 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
143 m_otherMsgs.push_back(m_failureMsg);
144 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600145 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700146 m_msgFound = VK_TRUE;
147 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600148 } else {
149 m_otherMsgs.push_back(errorString);
150 }
151 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600152 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600153 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600154 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600155
Karl Schultz6addd812016-02-02 17:17:23 -0700156 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600157
Karl Schultz6addd812016-02-02 17:17:23 -0700158 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600159
Karl Schultz6addd812016-02-02 17:17:23 -0700160 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161
Karl Schultz6addd812016-02-02 17:17:23 -0700162 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600163
Karl Schultz6addd812016-02-02 17:17:23 -0700164 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165 vector<string> otherMsgs = GetOtherFailureMsgs();
166 cout << "Other error messages logged for this test were:" << endl;
167 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
168 cout << " " << *iter << endl;
169 }
170 }
171
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200172 /* helpers */
173
174 void ExpectSuccess() {
175 // match anything
176 SetDesiredFailureMsg(~0u, "");
177 }
178
179 void VerifyFound() {
180 // Not seeing the desired message is a failure. /Before/ throwing, dump
181 // any other messages.
182 if (!DesiredMsgFound()) {
183 DumpFailureMsgs();
184 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
185 }
186 }
187
188 void VerifyNotFound() {
189 // ExpectSuccess() configured us to match anything. Any error is a
190 // failure.
191 if (DesiredMsgFound()) {
192 DumpFailureMsgs();
193 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
194 }
195 }
196
Karl Schultz6addd812016-02-02 17:17:23 -0700197 private:
198 VkFlags m_msgFlags;
199 string m_desiredMsg;
200 string m_failureMsg;
201 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600202 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700203 bool *m_bailout;
204 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600205};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500206
Karl Schultz6addd812016-02-02 17:17:23 -0700207static VKAPI_ATTR VkBool32 VKAPI_CALL
208myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
209 uint64_t srcObject, size_t location, int32_t msgCode,
210 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
211 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700212 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700213 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600214 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600215 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600216 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600217 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600218}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500219
Karl Schultz6addd812016-02-02 17:17:23 -0700220class VkLayerTest : public VkRenderFramework {
221 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800222 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
223 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700224 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
225 BsoFailSelect failMask);
226 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
227 VkPipelineObj &pipelineobj,
228 VkDescriptorSetObj &descriptorSet,
229 BsoFailSelect failMask);
230 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
231 VkDescriptorSetObj &descriptorSet,
232 BsoFailSelect failMask) {
233 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
234 failMask);
235 }
Tony Barbour300a6082015-04-07 13:44:53 -0600236
Tony Barbourfe3351b2015-07-28 10:17:20 -0600237 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700238 VkResult BeginCommandBuffer() {
239 return BeginCommandBuffer(*m_commandBuffer);
240 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800241 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700242 void Draw(uint32_t vertexCount, uint32_t instanceCount,
243 uint32_t firstVertex, uint32_t firstInstance) {
244 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
245 firstInstance);
246 }
247 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
248 uint32_t firstIndex, int32_t vertexOffset,
249 uint32_t firstInstance) {
250 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
251 vertexOffset, firstInstance);
252 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800253 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700254 void QueueCommandBuffer(const VkFence &fence) {
255 m_commandBuffer->QueueCommandBuffer(fence);
256 }
257 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
258 VkDeviceSize offset, uint32_t binding) {
259 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
260 }
261 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
262 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
263 }
264
265 protected:
266 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600267
268 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600269 std::vector<const char *> instance_layer_names;
270 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600271 std::vector<const char *> instance_extension_names;
272 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600273
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700274 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600275 /*
276 * Since CreateDbgMsgCallback is an instance level extension call
277 * any extension / layer that utilizes that feature also needs
278 * to be enabled at create instance time.
279 */
Karl Schultz6addd812016-02-02 17:17:23 -0700280 // Use Threading layer first to protect others from
281 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700282 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600283 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800284 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700285 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800286 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
287 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600288 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700289 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600290
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700291 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600292 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800293 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700294 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800295 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
296 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600297 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700298 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600299
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600300 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600301 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800302 this->app_info.pApplicationName = "layer_tests";
303 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600304 this->app_info.pEngineName = "unittest";
305 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600306 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600307
Tony Barbour15524c32015-04-29 17:34:29 -0600308 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600309 InitFramework(instance_layer_names, device_layer_names,
310 instance_extension_names, device_extension_names,
311 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600312 }
313
314 virtual void TearDown() {
315 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600316 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600317 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600318 }
319};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500320
Karl Schultz6addd812016-02-02 17:17:23 -0700321VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600322 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600323
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800324 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600325
326 /*
327 * For render test all drawing happens in a single render pass
328 * on a single command buffer.
329 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200330 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800331 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600332 }
333
334 return result;
335}
336
Karl Schultz6addd812016-02-02 17:17:23 -0700337VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600338 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600339
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200340 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800341 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200342 }
Tony Barbour300a6082015-04-07 13:44:53 -0600343
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800344 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600345
346 return result;
347}
348
Karl Schultz6addd812016-02-02 17:17:23 -0700349void VkLayerTest::VKTriangleTest(const char *vertShaderText,
350 const char *fragShaderText,
351 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500352 // Create identity matrix
353 int i;
354 struct vktriangle_vs_uniform data;
355
356 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700357 glm::mat4 View = glm::mat4(1.0f);
358 glm::mat4 Model = glm::mat4(1.0f);
359 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500360 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700361 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500362
363 memcpy(&data.mvp, &MVP[0][0], matrixSize);
364
Karl Schultz6addd812016-02-02 17:17:23 -0700365 static const Vertex tri_data[] = {
366 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
367 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
368 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500369 };
370
Karl Schultz6addd812016-02-02 17:17:23 -0700371 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500372 data.position[i][0] = tri_data[i].posX;
373 data.position[i][1] = tri_data[i].posY;
374 data.position[i][2] = tri_data[i].posZ;
375 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700376 data.color[i][0] = tri_data[i].r;
377 data.color[i][1] = tri_data[i].g;
378 data.color[i][2] = tri_data[i].b;
379 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500380 }
381
382 ASSERT_NO_FATAL_FAILURE(InitState());
383 ASSERT_NO_FATAL_FAILURE(InitViewport());
384
Karl Schultz6addd812016-02-02 17:17:23 -0700385 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
386 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500387
Karl Schultz6addd812016-02-02 17:17:23 -0700388 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
389 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
390 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500391
392 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800393 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500394 pipelineobj.AddShader(&vs);
395 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600396 if (failMask & BsoFailLineWidth) {
397 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600398 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
399 ia_state.sType =
400 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
401 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
402 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600403 }
404 if (failMask & BsoFailDepthBias) {
405 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600406 VkPipelineRasterizationStateCreateInfo rs_state = {};
407 rs_state.sType =
408 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
409 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600410 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600411 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600412 }
Karl Schultz6addd812016-02-02 17:17:23 -0700413 // Viewport and scissors must stay in synch or other errors will occur than
414 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600415 if (failMask & BsoFailViewport) {
416 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600417 m_viewports.clear();
418 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600419 }
420 if (failMask & BsoFailScissor) {
421 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600422 m_scissors.clear();
423 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600424 }
425 if (failMask & BsoFailBlend) {
426 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600427 VkPipelineColorBlendAttachmentState att_state = {};
428 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
429 att_state.blendEnable = VK_TRUE;
430 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600431 }
432 if (failMask & BsoFailDepthBounds) {
433 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
434 }
435 if (failMask & BsoFailStencilReadMask) {
436 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
437 }
438 if (failMask & BsoFailStencilWriteMask) {
439 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
440 }
441 if (failMask & BsoFailStencilReference) {
442 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
443 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500444
445 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700446 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
447 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500448
449 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600450 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500451
Tony Barbourfe3351b2015-07-28 10:17:20 -0600452 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500453
454 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600455 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456
457 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600458 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500459
Tony Barbourfe3351b2015-07-28 10:17:20 -0600460 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500461}
462
Karl Schultz6addd812016-02-02 17:17:23 -0700463void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
464 VkPipelineObj &pipelineobj,
465 VkDescriptorSetObj &descriptorSet,
466 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500467 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700468 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
469 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500470 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700471 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
472 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500473 }
474
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800475 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700476 // Make sure depthWriteEnable is set so that Depth fail test will work
477 // correctly
478 // Make sure stencilTestEnable is set so that Stencil fail test will work
479 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600480 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800481 stencil.failOp = VK_STENCIL_OP_KEEP;
482 stencil.passOp = VK_STENCIL_OP_KEEP;
483 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
484 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600485
486 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
487 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600488 ds_ci.pNext = NULL;
489 ds_ci.depthTestEnable = VK_FALSE;
490 ds_ci.depthWriteEnable = VK_TRUE;
491 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
492 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 if (failMask & BsoFailDepthBounds) {
494 ds_ci.depthBoundsTestEnable = VK_TRUE;
495 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600496 ds_ci.stencilTestEnable = VK_TRUE;
497 ds_ci.front = stencil;
498 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600499
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600500 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600501 pipelineobj.SetViewport(m_viewports);
502 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800503 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700504 VkResult err = pipelineobj.CreateVKPipeline(
505 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600506 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800507 commandBuffer->BindPipeline(pipelineobj);
508 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500509}
510
511// ********************************************************************************************************************
512// ********************************************************************************************************************
513// ********************************************************************************************************************
514// ********************************************************************************************************************
Tobin Ehlis0788f522015-05-26 16:11:58 -0600515#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700516#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800517TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500518{
519 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500520 VkFenceCreateInfo fenceInfo = {};
521 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
522 fenceInfo.pNext = NULL;
523 fenceInfo.flags = 0;
524
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600526
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500527 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600528
529 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
530 vk_testing::Buffer buffer;
531 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500532
Tony Barbourfe3351b2015-07-28 10:17:20 -0600533 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800534 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600535 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500536
537 testFence.init(*m_device, fenceInfo);
538
539 // Bypass framework since it does the waits automatically
540 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600541 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800542 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
543 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800544 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600545 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700546 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800547 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800548 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800549 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600550 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600551
552 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500553 ASSERT_VK_SUCCESS( err );
554
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500555 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800556 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500557
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200558 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500559}
560
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800561TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500562{
563 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500564 VkFenceCreateInfo fenceInfo = {};
565 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
566 fenceInfo.pNext = NULL;
567 fenceInfo.flags = 0;
568
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600570
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500571 ASSERT_NO_FATAL_FAILURE(InitState());
572 ASSERT_NO_FATAL_FAILURE(InitViewport());
573 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
574
Tony Barbourfe3351b2015-07-28 10:17:20 -0600575 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800576 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600577 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500578
579 testFence.init(*m_device, fenceInfo);
580
581 // Bypass framework since it does the waits automatically
582 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600583 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800584 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
585 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800586 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600587 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700588 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800589 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800590 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800591 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600592 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600593
594 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500595 ASSERT_VK_SUCCESS( err );
596
Jon Ashburnf19916e2016-01-11 13:12:43 -0700597 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800598 VkCommandBufferBeginInfo info = {};
599 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
600 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600601 info.renderPass = VK_NULL_HANDLE;
602 info.subpass = 0;
603 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800604 info.occlusionQueryEnable = VK_FALSE;
605 info.queryFlags = 0;
606 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600607
608 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800609 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500610
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200611 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500612}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700613#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200614
Mark Lobodzinski152fe252016-05-03 16:49:15 -0600615// This is a positive test. No failures are expected.
616TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
617 VkResult err;
618 bool pass;
619
620 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
621 "the buffer, create an image, and bind the same memory to "
622 "it");
623
624 m_errorMonitor->ExpectSuccess();
625
626 ASSERT_NO_FATAL_FAILURE(InitState());
627
628 VkBuffer buffer;
629 VkImage image;
630 VkDeviceMemory mem;
631 VkMemoryRequirements mem_reqs;
632
633 VkBufferCreateInfo buf_info = {};
634 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
635 buf_info.pNext = NULL;
636 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
637 buf_info.size = 256;
638 buf_info.queueFamilyIndexCount = 0;
639 buf_info.pQueueFamilyIndices = NULL;
640 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
641 buf_info.flags = 0;
642 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
643 ASSERT_VK_SUCCESS(err);
644
645 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
646
647 VkMemoryAllocateInfo alloc_info = {};
648 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
649 alloc_info.pNext = NULL;
650 alloc_info.memoryTypeIndex = 0;
651
652 // Ensure memory is big enough for both bindings
653 alloc_info.allocationSize = 0x10000;
654
655 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
656 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
657 if (!pass) {
658 vkDestroyBuffer(m_device->device(), buffer, NULL);
659 return;
660 }
661
662 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
663 ASSERT_VK_SUCCESS(err);
664
665 uint8_t *pData;
666 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
667 (void **)&pData);
668 ASSERT_VK_SUCCESS(err);
669
670 memset(pData, 0xCADECADE, mem_reqs.size);
671
672 vkUnmapMemory(m_device->device(), mem);
673
674 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
675 ASSERT_VK_SUCCESS(err);
676
677 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
678 // memory. In fact, it was never used by the GPU.
679 // Just be be sure, wait for idle.
680 vkDestroyBuffer(m_device->device(), buffer, NULL);
681 vkDeviceWaitIdle(m_device->device());
682
683 VkImageCreateInfo image_create_info = {};
684 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
685 image_create_info.pNext = NULL;
686 image_create_info.imageType = VK_IMAGE_TYPE_2D;
687 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
688 image_create_info.extent.width = 64;
689 image_create_info.extent.height = 64;
690 image_create_info.extent.depth = 1;
691 image_create_info.mipLevels = 1;
692 image_create_info.arrayLayers = 1;
693 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
694 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
695 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
696 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
697 image_create_info.queueFamilyIndexCount = 0;
698 image_create_info.pQueueFamilyIndices = NULL;
699 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
700 image_create_info.flags = 0;
701
702 VkMemoryAllocateInfo mem_alloc = {};
703 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
704 mem_alloc.pNext = NULL;
705 mem_alloc.allocationSize = 0;
706 mem_alloc.memoryTypeIndex = 0;
707
708 /* Create a mappable image. It will be the texture if linear images are ok
709 * to be textures or it will be the staging image if they are not.
710 */
711 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
712 ASSERT_VK_SUCCESS(err);
713
714 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
715
716 mem_alloc.allocationSize = mem_reqs.size;
717
718 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
719 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
720 if (!pass) {
721 vkDestroyImage(m_device->device(), image, NULL);
722 return;
723 }
724
725 // VALDIATION FAILURE:
726 err = vkBindImageMemory(m_device->device(), image, mem, 0);
727 ASSERT_VK_SUCCESS(err);
728
729 m_errorMonitor->VerifyNotFound();
730
731 vkDestroyBuffer(m_device->device(), buffer, NULL);
732 vkDestroyImage(m_device->device(), image, NULL);
733}
734
Ian Elliott1c32c772016-04-28 14:47:13 -0600735TEST_F(VkLayerTest, EnableWsiBeforeUse) {
736 VkResult err;
737 bool pass;
738
Ian Elliott489eec02016-05-05 14:12:44 -0600739// FIXME: After we turn on this code for non-Linux platforms, uncomment the
740// following declaration (which is temporarily being moved below):
741// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -0600742 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
743 VkSwapchainCreateInfoKHR swapchain_create_info = {};
744 uint32_t swapchain_image_count = 0;
745// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
746 uint32_t image_index = 0;
747// VkPresentInfoKHR present_info = {};
748
749 ASSERT_NO_FATAL_FAILURE(InitState());
750
Ian Elliott3f06ce52016-04-29 14:46:21 -0600751#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
752#if defined(VK_USE_PLATFORM_ANDROID_KHR)
753 // Use the functions from the VK_KHR_android_surface extension without
754 // enabling that extension:
755
756 // Create a surface:
757 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
758#if 0
759#endif
760 m_errorMonitor->SetDesiredFailureMsg(
761 VK_DEBUG_REPORT_ERROR_BIT_EXT,
762 "extension was not enabled for this");
763 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
764 &surface);
765 pass = (err != VK_SUCCESS);
766 ASSERT_TRUE(pass);
767 m_errorMonitor->VerifyFound();
768#endif // VK_USE_PLATFORM_ANDROID_KHR
769
770
771#if defined(VK_USE_PLATFORM_MIR_KHR)
772 // Use the functions from the VK_KHR_mir_surface extension without enabling
773 // that extension:
774
775 // Create a surface:
776 VkMirSurfaceCreateInfoKHR mir_create_info = {};
777#if 0
778#endif
779 m_errorMonitor->SetDesiredFailureMsg(
780 VK_DEBUG_REPORT_ERROR_BIT_EXT,
781 "extension was not enabled for this");
782 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
783 pass = (err != VK_SUCCESS);
784 ASSERT_TRUE(pass);
785 m_errorMonitor->VerifyFound();
786
787 // Tell whether an mir_connection supports presentation:
788 MirConnection *mir_connection = NULL;
789 m_errorMonitor->SetDesiredFailureMsg(
790 VK_DEBUG_REPORT_ERROR_BIT_EXT,
791 "extension was not enabled for this");
792 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
793 visual_id);
794 m_errorMonitor->VerifyFound();
795#endif // VK_USE_PLATFORM_MIR_KHR
796
797
798#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
799 // Use the functions from the VK_KHR_wayland_surface extension without
800 // enabling that extension:
801
802 // Create a surface:
803 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
804#if 0
805#endif
806 m_errorMonitor->SetDesiredFailureMsg(
807 VK_DEBUG_REPORT_ERROR_BIT_EXT,
808 "extension was not enabled for this");
809 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
810 &surface);
811 pass = (err != VK_SUCCESS);
812 ASSERT_TRUE(pass);
813 m_errorMonitor->VerifyFound();
814
815 // Tell whether an wayland_display supports presentation:
816 struct wl_display wayland_display = {};
817 m_errorMonitor->SetDesiredFailureMsg(
818 VK_DEBUG_REPORT_ERROR_BIT_EXT,
819 "extension was not enabled for this");
820 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
821 &wayland_display);
822 m_errorMonitor->VerifyFound();
823#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -0600824#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -0600825
826
827#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -0600828// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
829// TO NON-LINUX PLATFORMS:
830VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -0600831 // Use the functions from the VK_KHR_win32_surface extension without
832 // enabling that extension:
833
834 // Create a surface:
835 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
836#if 0
837#endif
838 m_errorMonitor->SetDesiredFailureMsg(
839 VK_DEBUG_REPORT_ERROR_BIT_EXT,
840 "extension was not enabled for this");
841 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
842 &surface);
843 pass = (err != VK_SUCCESS);
844 ASSERT_TRUE(pass);
845 m_errorMonitor->VerifyFound();
846
847 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -0600848 m_errorMonitor->SetDesiredFailureMsg(
849 VK_DEBUG_REPORT_ERROR_BIT_EXT,
850 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -0600851 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -0600852 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -0600853// Set this (for now, until all platforms are supported and tested):
854#define NEED_TO_TEST_THIS_ON_PLATFORM
855#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -0600856
857
Ian Elliott1c32c772016-04-28 14:47:13 -0600858#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -0600859// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
860// TO NON-LINUX PLATFORMS:
861VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -0600862 // Use the functions from the VK_KHR_xcb_surface extension without enabling
863 // that extension:
864
865 // Create a surface:
866 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
867#if 0
868#endif
869 m_errorMonitor->SetDesiredFailureMsg(
870 VK_DEBUG_REPORT_ERROR_BIT_EXT,
871 "extension was not enabled for this");
872 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
873 pass = (err != VK_SUCCESS);
874 ASSERT_TRUE(pass);
875 m_errorMonitor->VerifyFound();
876
877 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -0600878 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -0600879 xcb_visualid_t visual_id = 0;
880 m_errorMonitor->SetDesiredFailureMsg(
881 VK_DEBUG_REPORT_ERROR_BIT_EXT,
882 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -0600883 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -0600884 visual_id);
885 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -0600886// Set this (for now, until all platforms are supported and tested):
887#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -0600888#endif // VK_USE_PLATFORM_XCB_KHR
889
890
Ian Elliott12630812016-04-29 14:35:43 -0600891#if defined(VK_USE_PLATFORM_XLIB_KHR)
892 // Use the functions from the VK_KHR_xlib_surface extension without enabling
893 // that extension:
894
895 // Create a surface:
896 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
897#if 0
898#endif
899 m_errorMonitor->SetDesiredFailureMsg(
900 VK_DEBUG_REPORT_ERROR_BIT_EXT,
901 "extension was not enabled for this");
902 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
903 pass = (err != VK_SUCCESS);
904 ASSERT_TRUE(pass);
905 m_errorMonitor->VerifyFound();
906
907 // Tell whether an Xlib VisualID supports presentation:
908 Display *dpy = NULL;
909 VisualID visual = 0;
910 m_errorMonitor->SetDesiredFailureMsg(
911 VK_DEBUG_REPORT_ERROR_BIT_EXT,
912 "extension was not enabled for this");
913 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
914 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -0600915// Set this (for now, until all platforms are supported and tested):
916#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -0600917#endif // VK_USE_PLATFORM_XLIB_KHR
918
919
Ian Elliott1c32c772016-04-28 14:47:13 -0600920 // Use the functions from the VK_KHR_surface extension without enabling
921 // that extension:
922
Ian Elliott489eec02016-05-05 14:12:44 -0600923#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -0600924 // Destroy a surface:
925 m_errorMonitor->SetDesiredFailureMsg(
926 VK_DEBUG_REPORT_ERROR_BIT_EXT,
927 "extension was not enabled for this");
928 vkDestroySurfaceKHR(instance(), surface, NULL);
929 m_errorMonitor->VerifyFound();
930
931 // Check if surface supports presentation:
932 VkBool32 supported = false;
933 m_errorMonitor->SetDesiredFailureMsg(
934 VK_DEBUG_REPORT_ERROR_BIT_EXT,
935 "extension was not enabled for this");
936 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
937 pass = (err != VK_SUCCESS);
938 ASSERT_TRUE(pass);
939 m_errorMonitor->VerifyFound();
940
941 // Check surface capabilities:
942 VkSurfaceCapabilitiesKHR capabilities = {};
943 m_errorMonitor->SetDesiredFailureMsg(
944 VK_DEBUG_REPORT_ERROR_BIT_EXT,
945 "extension was not enabled for this");
946 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
947 &capabilities);
948 pass = (err != VK_SUCCESS);
949 ASSERT_TRUE(pass);
950 m_errorMonitor->VerifyFound();
951
952 // Check surface formats:
953 uint32_t format_count = 0;
954 VkSurfaceFormatKHR *formats = NULL;
955 m_errorMonitor->SetDesiredFailureMsg(
956 VK_DEBUG_REPORT_ERROR_BIT_EXT,
957 "extension was not enabled for this");
958 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
959 &format_count, formats);
960 pass = (err != VK_SUCCESS);
961 ASSERT_TRUE(pass);
962 m_errorMonitor->VerifyFound();
963
964 // Check surface present modes:
965 uint32_t present_mode_count = 0;
966 VkSurfaceFormatKHR *present_modes = NULL;
967 m_errorMonitor->SetDesiredFailureMsg(
968 VK_DEBUG_REPORT_ERROR_BIT_EXT,
969 "extension was not enabled for this");
970 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
971 &present_mode_count, present_modes);
972 pass = (err != VK_SUCCESS);
973 ASSERT_TRUE(pass);
974 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -0600975#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -0600976
977
978 // Use the functions from the VK_KHR_swapchain extension without enabling
979 // that extension:
980
981 // Create a swapchain:
982 m_errorMonitor->SetDesiredFailureMsg(
983 VK_DEBUG_REPORT_ERROR_BIT_EXT,
984 "extension was not enabled for this");
985 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
986 swapchain_create_info.pNext = NULL;
987#if 0
988 swapchain_create_info.flags = 0;
989 swapchain_create_info.surface = 0;
990 swapchain_create_info.minImageCount = 0;
991 swapchain_create_info.imageFormat = 0;
992 swapchain_create_info.imageColorSpace = 0;
993 swapchain_create_info.imageExtent.width = 0;
994 swapchain_create_info.imageExtent.height = 0;
995 swapchain_create_info.imageArrayLayers = 0;
996 swapchain_create_info.imageUsage = 0;
997 swapchain_create_info.imageSharingMode = 0;
998 swapchain_create_info.queueFamilyIndexCount = 0;
999 swapchain_create_info.preTransform = 0;
1000 swapchain_create_info.compositeAlpha = 0;
1001 swapchain_create_info.presentMode = 0;
1002 swapchain_create_info.clipped = 0;
1003 swapchain_create_info.oldSwapchain = NULL;
1004#endif
1005 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1006 NULL, &swapchain);
1007 pass = (err != VK_SUCCESS);
1008 ASSERT_TRUE(pass);
1009 m_errorMonitor->VerifyFound();
1010
1011 // Get the images from the swapchain:
1012 m_errorMonitor->SetDesiredFailureMsg(
1013 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1014 "extension was not enabled for this");
1015 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
1016 &swapchain_image_count, NULL);
1017 pass = (err != VK_SUCCESS);
1018 ASSERT_TRUE(pass);
1019 m_errorMonitor->VerifyFound();
1020
1021 // Try to acquire an image:
1022 m_errorMonitor->SetDesiredFailureMsg(
1023 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1024 "extension was not enabled for this");
1025 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
1026 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
1027 pass = (err != VK_SUCCESS);
1028 ASSERT_TRUE(pass);
1029 m_errorMonitor->VerifyFound();
1030
1031 // Try to present an image:
1032#if 0 // NOTE: Currently can't test this because a real swapchain is needed
1033 // (as opposed to the fake one we created) in order for the layer to
1034 // lookup the VkDevice used to enable the extension:
1035 m_errorMonitor->SetDesiredFailureMsg(
1036 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1037 "extension was not enabled for this");
1038 present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
1039 present_info.pNext = NULL;
1040#if 0
1041#endif
1042 err = vkQueuePresentKHR(m_device->m_queue, &present_info);
1043 pass = (err != VK_SUCCESS);
1044 ASSERT_TRUE(pass);
1045 m_errorMonitor->VerifyFound();
1046#endif
1047
1048 // Destroy the swapchain:
1049 m_errorMonitor->SetDesiredFailureMsg(
1050 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1051 "extension was not enabled for this");
1052 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1053 m_errorMonitor->VerifyFound();
1054}
1055
Karl Schultz6addd812016-02-02 17:17:23 -07001056TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1057 VkResult err;
1058 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001059
Karl Schultz6addd812016-02-02 17:17:23 -07001060 m_errorMonitor->SetDesiredFailureMsg(
1061 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001062 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
1063
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001064 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001065
1066 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001067 VkImage image;
1068 VkDeviceMemory mem;
1069 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001070
Karl Schultz6addd812016-02-02 17:17:23 -07001071 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1072 const int32_t tex_width = 32;
1073 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001074
Tony Barboureb254902015-07-15 12:50:33 -06001075 VkImageCreateInfo image_create_info = {};
1076 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001077 image_create_info.pNext = NULL;
1078 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1079 image_create_info.format = tex_format;
1080 image_create_info.extent.width = tex_width;
1081 image_create_info.extent.height = tex_height;
1082 image_create_info.extent.depth = 1;
1083 image_create_info.mipLevels = 1;
1084 image_create_info.arrayLayers = 1;
1085 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1086 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1087 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1088 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001089
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001090 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001091 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001092 mem_alloc.pNext = NULL;
1093 mem_alloc.allocationSize = 0;
1094 // Introduce failure, do NOT set memProps to
1095 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
1096 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001097
Chia-I Wuf7458c52015-10-26 21:10:41 +08001098 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001099 ASSERT_VK_SUCCESS(err);
1100
Karl Schultz6addd812016-02-02 17:17:23 -07001101 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001102
Mark Lobodzinski23065352015-05-29 09:32:35 -05001103 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001104
Karl Schultz6addd812016-02-02 17:17:23 -07001105 pass =
1106 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
1107 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1108 if (!pass) { // If we can't find any unmappable memory this test doesn't
1109 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08001110 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06001111 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06001112 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06001113
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001114 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001115 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001116 ASSERT_VK_SUCCESS(err);
1117
1118 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06001119 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001120 ASSERT_VK_SUCCESS(err);
1121
1122 // Map memory as if to initialize the image
1123 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07001124 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
1125 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001126
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001127 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001128
Chia-I Wuf7458c52015-10-26 21:10:41 +08001129 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001130}
1131
Karl Schultz6addd812016-02-02 17:17:23 -07001132TEST_F(VkLayerTest, RebindMemory) {
1133 VkResult err;
1134 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001135
Karl Schultz6addd812016-02-02 17:17:23 -07001136 m_errorMonitor->SetDesiredFailureMsg(
1137 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001138 "which has already been bound to mem object");
1139
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001140 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001141
1142 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001143 VkImage image;
1144 VkDeviceMemory mem1;
1145 VkDeviceMemory mem2;
1146 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001147
Karl Schultz6addd812016-02-02 17:17:23 -07001148 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1149 const int32_t tex_width = 32;
1150 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001151
Tony Barboureb254902015-07-15 12:50:33 -06001152 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001153 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1154 image_create_info.pNext = NULL;
1155 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1156 image_create_info.format = tex_format;
1157 image_create_info.extent.width = tex_width;
1158 image_create_info.extent.height = tex_height;
1159 image_create_info.extent.depth = 1;
1160 image_create_info.mipLevels = 1;
1161 image_create_info.arrayLayers = 1;
1162 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1163 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1164 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1165 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001166
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001167 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001168 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1169 mem_alloc.pNext = NULL;
1170 mem_alloc.allocationSize = 0;
1171 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001172
Karl Schultz6addd812016-02-02 17:17:23 -07001173 // Introduce failure, do NOT set memProps to
1174 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001175 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001176 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001177 ASSERT_VK_SUCCESS(err);
1178
Karl Schultz6addd812016-02-02 17:17:23 -07001179 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001180
1181 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001182 pass =
1183 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001184 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001185
1186 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001187 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001188 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001189 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001190 ASSERT_VK_SUCCESS(err);
1191
1192 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001193 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001194 ASSERT_VK_SUCCESS(err);
1195
Karl Schultz6addd812016-02-02 17:17:23 -07001196 // Introduce validation failure, try to bind a different memory object to
1197 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001198 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001199
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001200 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001201
Chia-I Wuf7458c52015-10-26 21:10:41 +08001202 vkDestroyImage(m_device->device(), image, NULL);
1203 vkFreeMemory(m_device->device(), mem1, NULL);
1204 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001205}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001206
Karl Schultz6addd812016-02-02 17:17:23 -07001207TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001208 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001209
Karl Schultz6addd812016-02-02 17:17:23 -07001210 m_errorMonitor->SetDesiredFailureMsg(
1211 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1212 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001213
1214 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001215 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1216 fenceInfo.pNext = NULL;
1217 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001218
Tony Barbour300a6082015-04-07 13:44:53 -06001219 ASSERT_NO_FATAL_FAILURE(InitState());
1220 ASSERT_NO_FATAL_FAILURE(InitViewport());
1221 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1222
Tony Barbourfe3351b2015-07-28 10:17:20 -06001223 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001224 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1225 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001226 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001227
1228 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001229
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001230 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001231 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1232 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001233 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001234 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001235 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001236 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001237 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001238 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001239 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001240
1241 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001242 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001243
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001244 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001245}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001246// This is a positive test. We used to expect error in this case but spec now
1247// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07001248TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001249 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001250 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001251 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001252 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1253 fenceInfo.pNext = NULL;
1254
Tony Barbour0b4d9562015-04-09 10:48:04 -06001255 ASSERT_NO_FATAL_FAILURE(InitState());
1256 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08001257 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001258 VkResult result = vkResetFences(m_device->device(), 1, fences);
1259 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06001260
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001261 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06001262}
Tobin Ehlis41376e12015-07-03 08:45:14 -06001263
1264TEST_F(VkLayerTest, InvalidUsageBits)
1265{
Tony Barbourf92621a2016-05-02 14:28:12 -06001266 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001267 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06001268 "Initialize buffer with wrong usage then perform copy expecting errors "
1269 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001271 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001272
1273 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06001274 VkImageObj image(m_device);
1275 // Initialize image with USAGE_INPUT_ATTACHMENT
1276 image.init(128, 128, VK_FORMAT_D32_SFLOAT_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001277 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1278 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06001279
Tony Barbourf92621a2016-05-02 14:28:12 -06001280 VkImageView dsv;
1281 VkImageViewCreateInfo dsvci = {};
1282 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1283 dsvci.image = image.handle();
1284 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
1285 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
1286 dsvci.subresourceRange.layerCount = 1;
1287 dsvci.subresourceRange.baseMipLevel = 0;
1288 dsvci.subresourceRange.levelCount = 1;
1289 dsvci.subresourceRange.aspectMask =
1290 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06001291
Tony Barbourf92621a2016-05-02 14:28:12 -06001292 // Create a view with depth / stencil aspect for image with different usage
1293 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001294
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001295 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06001296
1297 // Initialize buffer with TRANSFER_DST usage
1298 vk_testing::Buffer buffer;
1299 VkMemoryPropertyFlags reqs = 0;
1300 buffer.init_as_dst(*m_device, 128 * 128, reqs);
1301 VkBufferImageCopy region = {};
1302 region.bufferRowLength = 128;
1303 region.bufferImageHeight = 128;
1304 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1305 region.imageSubresource.layerCount = 1;
1306 region.imageExtent.height = 16;
1307 region.imageExtent.width = 16;
1308 region.imageExtent.depth = 1;
1309
1310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1311 "Invalid usage flag for buffer ");
1312 // Buffer usage not set to TRANSFER_SRC and image usage not set to
1313 // TRANSFER_DST
1314 BeginCommandBuffer();
1315 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1316 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1317 1, &region);
1318 m_errorMonitor->VerifyFound();
1319
1320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1321 "Invalid usage flag for image ");
1322 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1323 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1324 1, &region);
1325 m_errorMonitor->VerifyFound();
1326
1327 vkDestroyImageView(m_device->device(), dsv, NULL);
Tobin Ehlis41376e12015-07-03 08:45:14 -06001328}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001329#endif // MEM_TRACKER_TESTS
1330
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06001331#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07001332TEST_F(VkLayerTest, PipelineNotBound) {
1333 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001334
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001336 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001337
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001338 ASSERT_NO_FATAL_FAILURE(InitState());
1339 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001340
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001341 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001342 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1343 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001344
1345 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001346 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1347 ds_pool_ci.pNext = NULL;
1348 ds_pool_ci.maxSets = 1;
1349 ds_pool_ci.poolSizeCount = 1;
1350 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001351
1352 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001353 err =
1354 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001355 ASSERT_VK_SUCCESS(err);
1356
1357 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001358 dsl_binding.binding = 0;
1359 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1360 dsl_binding.descriptorCount = 1;
1361 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1362 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001363
1364 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001365 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1366 ds_layout_ci.pNext = NULL;
1367 ds_layout_ci.bindingCount = 1;
1368 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001369
1370 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001371 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1372 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001373 ASSERT_VK_SUCCESS(err);
1374
1375 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001376 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001377 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001378 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001379 alloc_info.descriptorPool = ds_pool;
1380 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001381 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1382 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001383 ASSERT_VK_SUCCESS(err);
1384
1385 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001386 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1387 pipeline_layout_ci.pNext = NULL;
1388 pipeline_layout_ci.setLayoutCount = 1;
1389 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001390
1391 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001392 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1393 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001394 ASSERT_VK_SUCCESS(err);
1395
Mark Youngad779052016-01-06 14:26:04 -07001396 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001397
1398 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001399 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1400 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001401
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001402 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001403
Chia-I Wuf7458c52015-10-26 21:10:41 +08001404 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1405 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1406 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001407}
1408
Karl Schultz6addd812016-02-02 17:17:23 -07001409TEST_F(VkLayerTest, BindInvalidMemory) {
1410 VkResult err;
1411 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001412
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001413 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001414 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001415
Tobin Ehlisec598302015-09-15 15:02:17 -06001416 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001417
1418 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001419 VkImage image;
1420 VkDeviceMemory mem;
1421 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001422
Karl Schultz6addd812016-02-02 17:17:23 -07001423 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1424 const int32_t tex_width = 32;
1425 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001426
1427 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001428 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1429 image_create_info.pNext = NULL;
1430 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1431 image_create_info.format = tex_format;
1432 image_create_info.extent.width = tex_width;
1433 image_create_info.extent.height = tex_height;
1434 image_create_info.extent.depth = 1;
1435 image_create_info.mipLevels = 1;
1436 image_create_info.arrayLayers = 1;
1437 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1438 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1439 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1440 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001441
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001442 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001443 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1444 mem_alloc.pNext = NULL;
1445 mem_alloc.allocationSize = 0;
1446 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001447
Chia-I Wuf7458c52015-10-26 21:10:41 +08001448 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001449 ASSERT_VK_SUCCESS(err);
1450
Karl Schultz6addd812016-02-02 17:17:23 -07001451 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001452
1453 mem_alloc.allocationSize = mem_reqs.size;
1454
Karl Schultz6addd812016-02-02 17:17:23 -07001455 pass =
1456 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001457 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001458
1459 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001460 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001461 ASSERT_VK_SUCCESS(err);
1462
1463 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001464 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001465
1466 // Try to bind free memory that has been freed
1467 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1468 // This may very well return an error.
1469 (void)err;
1470
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001471 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001472
Chia-I Wuf7458c52015-10-26 21:10:41 +08001473 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001474}
1475
Karl Schultz6addd812016-02-02 17:17:23 -07001476TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1477 VkResult err;
1478 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001479
Karl Schultz6addd812016-02-02 17:17:23 -07001480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1481 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001482
Tobin Ehlisec598302015-09-15 15:02:17 -06001483 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001484
Karl Schultz6addd812016-02-02 17:17:23 -07001485 // Create an image object, allocate memory, destroy the object and then try
1486 // to bind it
1487 VkImage image;
1488 VkDeviceMemory mem;
1489 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001490
Karl Schultz6addd812016-02-02 17:17:23 -07001491 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1492 const int32_t tex_width = 32;
1493 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001494
1495 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001496 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1497 image_create_info.pNext = NULL;
1498 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1499 image_create_info.format = tex_format;
1500 image_create_info.extent.width = tex_width;
1501 image_create_info.extent.height = tex_height;
1502 image_create_info.extent.depth = 1;
1503 image_create_info.mipLevels = 1;
1504 image_create_info.arrayLayers = 1;
1505 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1506 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1507 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1508 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001509
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001510 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001511 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1512 mem_alloc.pNext = NULL;
1513 mem_alloc.allocationSize = 0;
1514 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001515
Chia-I Wuf7458c52015-10-26 21:10:41 +08001516 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001517 ASSERT_VK_SUCCESS(err);
1518
Karl Schultz6addd812016-02-02 17:17:23 -07001519 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001520
1521 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001522 pass =
1523 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001524 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001525
1526 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001527 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001528 ASSERT_VK_SUCCESS(err);
1529
1530 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001531 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001532 ASSERT_VK_SUCCESS(err);
1533
1534 // Now Try to bind memory to this destroyed object
1535 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1536 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001537 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001538
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001539 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001540
Chia-I Wuf7458c52015-10-26 21:10:41 +08001541 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001542}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001543
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001544#endif // OBJ_TRACKER_TESTS
1545
Tobin Ehlis0788f522015-05-26 16:11:58 -06001546#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001547
1548// This is a positive test. No errors should be generated.
1549TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
1550
1551 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1552 "submitted on separate queues followed by a QueueWaitIdle.");
1553
Dustin Graves48458142016-04-29 16:11:55 -06001554 if ((m_device->queue_props.empty()) ||
1555 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001556 return;
1557
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001558 m_errorMonitor->ExpectSuccess();
1559
1560 VkSemaphore semaphore;
1561 VkSemaphoreCreateInfo semaphore_create_info{};
1562 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1563 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1564 &semaphore);
1565
1566 VkCommandPool command_pool;
1567 VkCommandPoolCreateInfo pool_create_info{};
1568 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1569 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1570 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1571 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1572 &command_pool);
1573
1574 VkCommandBuffer command_buffer[2];
1575 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1576 command_buffer_allocate_info.sType =
1577 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1578 command_buffer_allocate_info.commandPool = command_pool;
1579 command_buffer_allocate_info.commandBufferCount = 2;
1580 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1581 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1582 command_buffer);
1583
1584 VkQueue queue = VK_NULL_HANDLE;
1585 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1586 1, &queue);
1587
1588 {
1589 VkCommandBufferBeginInfo begin_info{};
1590 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1591 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1592
1593 vkCmdPipelineBarrier(command_buffer[0],
1594 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1595 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1596 0, nullptr, 0, nullptr);
1597
1598 VkViewport viewport{};
1599 viewport.maxDepth = 1.0f;
1600 viewport.minDepth = 0.0f;
1601 viewport.width = 512;
1602 viewport.height = 512;
1603 viewport.x = 0;
1604 viewport.y = 0;
1605 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1606 vkEndCommandBuffer(command_buffer[0]);
1607 }
1608 {
1609 VkCommandBufferBeginInfo begin_info{};
1610 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1611 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1612
1613 VkViewport viewport{};
1614 viewport.maxDepth = 1.0f;
1615 viewport.minDepth = 0.0f;
1616 viewport.width = 512;
1617 viewport.height = 512;
1618 viewport.x = 0;
1619 viewport.y = 0;
1620 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1621 vkEndCommandBuffer(command_buffer[1]);
1622 }
1623 {
1624 VkSubmitInfo submit_info{};
1625 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1626 submit_info.commandBufferCount = 1;
1627 submit_info.pCommandBuffers = &command_buffer[0];
1628 submit_info.signalSemaphoreCount = 1;
1629 submit_info.pSignalSemaphores = &semaphore;
1630 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1631 }
1632 {
1633 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1634 VkSubmitInfo submit_info{};
1635 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1636 submit_info.commandBufferCount = 1;
1637 submit_info.pCommandBuffers = &command_buffer[1];
1638 submit_info.waitSemaphoreCount = 1;
1639 submit_info.pWaitSemaphores = &semaphore;
1640 submit_info.pWaitDstStageMask = flags;
1641 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1642 }
1643
1644 vkQueueWaitIdle(m_device->m_queue);
1645
1646 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1647 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1648 &command_buffer[0]);
1649 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1650
1651 m_errorMonitor->VerifyNotFound();
1652}
1653
1654// This is a positive test. No errors should be generated.
1655TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
1656
1657 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1658 "submitted on separate queues, the second having a fence"
1659 "followed by a QueueWaitIdle.");
1660
Dustin Graves48458142016-04-29 16:11:55 -06001661 if ((m_device->queue_props.empty()) ||
1662 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001663 return;
1664
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001665 m_errorMonitor->ExpectSuccess();
1666
1667 VkFence fence;
1668 VkFenceCreateInfo fence_create_info{};
1669 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1670 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1671
1672 VkSemaphore semaphore;
1673 VkSemaphoreCreateInfo semaphore_create_info{};
1674 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1675 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1676 &semaphore);
1677
1678 VkCommandPool command_pool;
1679 VkCommandPoolCreateInfo pool_create_info{};
1680 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1681 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1682 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1683 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1684 &command_pool);
1685
1686 VkCommandBuffer command_buffer[2];
1687 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1688 command_buffer_allocate_info.sType =
1689 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1690 command_buffer_allocate_info.commandPool = command_pool;
1691 command_buffer_allocate_info.commandBufferCount = 2;
1692 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1693 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1694 command_buffer);
1695
1696 VkQueue queue = VK_NULL_HANDLE;
1697 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1698 1, &queue);
1699
1700 {
1701 VkCommandBufferBeginInfo begin_info{};
1702 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1703 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1704
1705 vkCmdPipelineBarrier(command_buffer[0],
1706 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1707 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1708 0, nullptr, 0, nullptr);
1709
1710 VkViewport viewport{};
1711 viewport.maxDepth = 1.0f;
1712 viewport.minDepth = 0.0f;
1713 viewport.width = 512;
1714 viewport.height = 512;
1715 viewport.x = 0;
1716 viewport.y = 0;
1717 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1718 vkEndCommandBuffer(command_buffer[0]);
1719 }
1720 {
1721 VkCommandBufferBeginInfo begin_info{};
1722 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1723 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1724
1725 VkViewport viewport{};
1726 viewport.maxDepth = 1.0f;
1727 viewport.minDepth = 0.0f;
1728 viewport.width = 512;
1729 viewport.height = 512;
1730 viewport.x = 0;
1731 viewport.y = 0;
1732 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1733 vkEndCommandBuffer(command_buffer[1]);
1734 }
1735 {
1736 VkSubmitInfo submit_info{};
1737 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1738 submit_info.commandBufferCount = 1;
1739 submit_info.pCommandBuffers = &command_buffer[0];
1740 submit_info.signalSemaphoreCount = 1;
1741 submit_info.pSignalSemaphores = &semaphore;
1742 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1743 }
1744 {
1745 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1746 VkSubmitInfo submit_info{};
1747 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1748 submit_info.commandBufferCount = 1;
1749 submit_info.pCommandBuffers = &command_buffer[1];
1750 submit_info.waitSemaphoreCount = 1;
1751 submit_info.pWaitSemaphores = &semaphore;
1752 submit_info.pWaitDstStageMask = flags;
1753 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1754 }
1755
1756 vkQueueWaitIdle(m_device->m_queue);
1757
1758 vkDestroyFence(m_device->device(), fence, nullptr);
1759 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1760 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1761 &command_buffer[0]);
1762 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1763
1764 m_errorMonitor->VerifyNotFound();
1765}
1766
1767// This is a positive test. No errors should be generated.
1768TEST_F(VkLayerTest,
1769 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
1770
1771 TEST_DESCRIPTION(
1772 "Two command buffers, each in a separate QueueSubmit call "
1773 "submitted on separate queues, the second having a fence"
1774 "followed by two consecutive WaitForFences calls on the same fence.");
1775
Dustin Graves48458142016-04-29 16:11:55 -06001776 if ((m_device->queue_props.empty()) ||
1777 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001778 return;
1779
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001780 m_errorMonitor->ExpectSuccess();
1781
1782 VkFence fence;
1783 VkFenceCreateInfo fence_create_info{};
1784 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1785 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1786
1787 VkSemaphore semaphore;
1788 VkSemaphoreCreateInfo semaphore_create_info{};
1789 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1790 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1791 &semaphore);
1792
1793 VkCommandPool command_pool;
1794 VkCommandPoolCreateInfo pool_create_info{};
1795 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1796 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1797 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1798 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1799 &command_pool);
1800
1801 VkCommandBuffer command_buffer[2];
1802 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1803 command_buffer_allocate_info.sType =
1804 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1805 command_buffer_allocate_info.commandPool = command_pool;
1806 command_buffer_allocate_info.commandBufferCount = 2;
1807 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1808 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1809 command_buffer);
1810
1811 VkQueue queue = VK_NULL_HANDLE;
1812 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1813 1, &queue);
1814
1815 {
1816 VkCommandBufferBeginInfo begin_info{};
1817 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1818 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1819
1820 vkCmdPipelineBarrier(command_buffer[0],
1821 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1822 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1823 0, nullptr, 0, nullptr);
1824
1825 VkViewport viewport{};
1826 viewport.maxDepth = 1.0f;
1827 viewport.minDepth = 0.0f;
1828 viewport.width = 512;
1829 viewport.height = 512;
1830 viewport.x = 0;
1831 viewport.y = 0;
1832 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1833 vkEndCommandBuffer(command_buffer[0]);
1834 }
1835 {
1836 VkCommandBufferBeginInfo begin_info{};
1837 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1838 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1839
1840 VkViewport viewport{};
1841 viewport.maxDepth = 1.0f;
1842 viewport.minDepth = 0.0f;
1843 viewport.width = 512;
1844 viewport.height = 512;
1845 viewport.x = 0;
1846 viewport.y = 0;
1847 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1848 vkEndCommandBuffer(command_buffer[1]);
1849 }
1850 {
1851 VkSubmitInfo submit_info{};
1852 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1853 submit_info.commandBufferCount = 1;
1854 submit_info.pCommandBuffers = &command_buffer[0];
1855 submit_info.signalSemaphoreCount = 1;
1856 submit_info.pSignalSemaphores = &semaphore;
1857 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1858 }
1859 {
1860 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1861 VkSubmitInfo submit_info{};
1862 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1863 submit_info.commandBufferCount = 1;
1864 submit_info.pCommandBuffers = &command_buffer[1];
1865 submit_info.waitSemaphoreCount = 1;
1866 submit_info.pWaitSemaphores = &semaphore;
1867 submit_info.pWaitDstStageMask = flags;
1868 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1869 }
1870
1871 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1872 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1873
1874 vkDestroyFence(m_device->device(), fence, nullptr);
1875 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1876 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1877 &command_buffer[0]);
1878 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1879
1880 m_errorMonitor->VerifyNotFound();
1881}
1882
1883// This is a positive test. No errors should be generated.
1884TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
1885
1886 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1887 "submitted on separate queues, the second having a fence, "
1888 "followed by a WaitForFences call.");
1889
Dustin Graves48458142016-04-29 16:11:55 -06001890 if ((m_device->queue_props.empty()) ||
1891 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001892 return;
1893
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001894 m_errorMonitor->ExpectSuccess();
1895
1896 VkFence fence;
1897 VkFenceCreateInfo fence_create_info{};
1898 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1899 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1900
1901 VkSemaphore semaphore;
1902 VkSemaphoreCreateInfo semaphore_create_info{};
1903 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1904 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1905 &semaphore);
1906
1907 VkCommandPool command_pool;
1908 VkCommandPoolCreateInfo pool_create_info{};
1909 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1910 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1911 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1912 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1913 &command_pool);
1914
1915 VkCommandBuffer command_buffer[2];
1916 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1917 command_buffer_allocate_info.sType =
1918 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1919 command_buffer_allocate_info.commandPool = command_pool;
1920 command_buffer_allocate_info.commandBufferCount = 2;
1921 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1922 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1923 command_buffer);
1924
1925 VkQueue queue = VK_NULL_HANDLE;
1926 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1927 1, &queue);
1928
1929
1930 {
1931 VkCommandBufferBeginInfo begin_info{};
1932 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1933 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1934
1935 vkCmdPipelineBarrier(command_buffer[0],
1936 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1937 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1938 0, nullptr, 0, nullptr);
1939
1940 VkViewport viewport{};
1941 viewport.maxDepth = 1.0f;
1942 viewport.minDepth = 0.0f;
1943 viewport.width = 512;
1944 viewport.height = 512;
1945 viewport.x = 0;
1946 viewport.y = 0;
1947 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1948 vkEndCommandBuffer(command_buffer[0]);
1949 }
1950 {
1951 VkCommandBufferBeginInfo begin_info{};
1952 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1953 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1954
1955 VkViewport viewport{};
1956 viewport.maxDepth = 1.0f;
1957 viewport.minDepth = 0.0f;
1958 viewport.width = 512;
1959 viewport.height = 512;
1960 viewport.x = 0;
1961 viewport.y = 0;
1962 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1963 vkEndCommandBuffer(command_buffer[1]);
1964 }
1965 {
1966 VkSubmitInfo submit_info{};
1967 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1968 submit_info.commandBufferCount = 1;
1969 submit_info.pCommandBuffers = &command_buffer[0];
1970 submit_info.signalSemaphoreCount = 1;
1971 submit_info.pSignalSemaphores = &semaphore;
1972 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1973 }
1974 {
1975 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1976 VkSubmitInfo submit_info{};
1977 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1978 submit_info.commandBufferCount = 1;
1979 submit_info.pCommandBuffers = &command_buffer[1];
1980 submit_info.waitSemaphoreCount = 1;
1981 submit_info.pWaitSemaphores = &semaphore;
1982 submit_info.pWaitDstStageMask = flags;
1983 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1984 }
1985
1986 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1987
1988 vkDestroyFence(m_device->device(), fence, nullptr);
1989 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1990 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1991 &command_buffer[0]);
1992 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1993
1994 m_errorMonitor->VerifyNotFound();
1995}
1996
1997// This is a positive test. No errors should be generated.
1998TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
1999
2000 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2001 "on the same queue, sharing a signal/wait semaphore, the "
2002 "second having a fence, "
2003 "followed by a WaitForFences call.");
2004
2005 m_errorMonitor->ExpectSuccess();
2006
2007 VkFence fence;
2008 VkFenceCreateInfo fence_create_info{};
2009 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2010 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2011
2012 VkSemaphore semaphore;
2013 VkSemaphoreCreateInfo semaphore_create_info{};
2014 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2015 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2016 &semaphore);
2017
2018 VkCommandPool command_pool;
2019 VkCommandPoolCreateInfo pool_create_info{};
2020 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2021 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2022 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2023 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2024 &command_pool);
2025
2026 VkCommandBuffer command_buffer[2];
2027 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2028 command_buffer_allocate_info.sType =
2029 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2030 command_buffer_allocate_info.commandPool = command_pool;
2031 command_buffer_allocate_info.commandBufferCount = 2;
2032 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2033 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2034 command_buffer);
2035
2036 {
2037 VkCommandBufferBeginInfo begin_info{};
2038 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2039 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2040
2041 vkCmdPipelineBarrier(command_buffer[0],
2042 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2043 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2044 0, nullptr, 0, nullptr);
2045
2046 VkViewport viewport{};
2047 viewport.maxDepth = 1.0f;
2048 viewport.minDepth = 0.0f;
2049 viewport.width = 512;
2050 viewport.height = 512;
2051 viewport.x = 0;
2052 viewport.y = 0;
2053 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2054 vkEndCommandBuffer(command_buffer[0]);
2055 }
2056 {
2057 VkCommandBufferBeginInfo begin_info{};
2058 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2059 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2060
2061 VkViewport viewport{};
2062 viewport.maxDepth = 1.0f;
2063 viewport.minDepth = 0.0f;
2064 viewport.width = 512;
2065 viewport.height = 512;
2066 viewport.x = 0;
2067 viewport.y = 0;
2068 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2069 vkEndCommandBuffer(command_buffer[1]);
2070 }
2071 {
2072 VkSubmitInfo submit_info{};
2073 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2074 submit_info.commandBufferCount = 1;
2075 submit_info.pCommandBuffers = &command_buffer[0];
2076 submit_info.signalSemaphoreCount = 1;
2077 submit_info.pSignalSemaphores = &semaphore;
2078 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2079 }
2080 {
2081 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2082 VkSubmitInfo submit_info{};
2083 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2084 submit_info.commandBufferCount = 1;
2085 submit_info.pCommandBuffers = &command_buffer[1];
2086 submit_info.waitSemaphoreCount = 1;
2087 submit_info.pWaitSemaphores = &semaphore;
2088 submit_info.pWaitDstStageMask = flags;
2089 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2090 }
2091
2092 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2093
2094 vkDestroyFence(m_device->device(), fence, nullptr);
2095 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2096 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2097 &command_buffer[0]);
2098 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2099
2100 m_errorMonitor->VerifyNotFound();
2101}
2102
2103// This is a positive test. No errors should be generated.
2104TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
2105
2106 TEST_DESCRIPTION(
2107 "Two command buffers, each in a separate QueueSubmit call "
2108 "on the same queue, no fences, followed by a third QueueSubmit with NO "
2109 "SubmitInfos but with a fence, followed by a WaitForFences call.");
2110
2111 m_errorMonitor->ExpectSuccess();
2112
2113 VkFence fence;
2114 VkFenceCreateInfo fence_create_info{};
2115 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2116 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2117
2118 VkCommandPool command_pool;
2119 VkCommandPoolCreateInfo pool_create_info{};
2120 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2121 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2122 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2123 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2124 &command_pool);
2125
2126 VkCommandBuffer command_buffer[2];
2127 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2128 command_buffer_allocate_info.sType =
2129 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2130 command_buffer_allocate_info.commandPool = command_pool;
2131 command_buffer_allocate_info.commandBufferCount = 2;
2132 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2133 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2134 command_buffer);
2135
2136 {
2137 VkCommandBufferBeginInfo begin_info{};
2138 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2139 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2140
2141 vkCmdPipelineBarrier(command_buffer[0],
2142 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2143 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2144 0, nullptr, 0, nullptr);
2145
2146 VkViewport viewport{};
2147 viewport.maxDepth = 1.0f;
2148 viewport.minDepth = 0.0f;
2149 viewport.width = 512;
2150 viewport.height = 512;
2151 viewport.x = 0;
2152 viewport.y = 0;
2153 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2154 vkEndCommandBuffer(command_buffer[0]);
2155 }
2156 {
2157 VkCommandBufferBeginInfo begin_info{};
2158 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2159 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2160
2161 VkViewport viewport{};
2162 viewport.maxDepth = 1.0f;
2163 viewport.minDepth = 0.0f;
2164 viewport.width = 512;
2165 viewport.height = 512;
2166 viewport.x = 0;
2167 viewport.y = 0;
2168 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2169 vkEndCommandBuffer(command_buffer[1]);
2170 }
2171 {
2172 VkSubmitInfo submit_info{};
2173 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2174 submit_info.commandBufferCount = 1;
2175 submit_info.pCommandBuffers = &command_buffer[0];
2176 submit_info.signalSemaphoreCount = 0;
2177 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2178 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2179 }
2180 {
2181 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2182 VkSubmitInfo submit_info{};
2183 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2184 submit_info.commandBufferCount = 1;
2185 submit_info.pCommandBuffers = &command_buffer[1];
2186 submit_info.waitSemaphoreCount = 0;
2187 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2188 submit_info.pWaitDstStageMask = flags;
2189 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2190 }
2191
2192 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
2193
2194 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2195
2196 vkDestroyFence(m_device->device(), fence, nullptr);
2197 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2198 &command_buffer[0]);
2199 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2200
2201 m_errorMonitor->VerifyNotFound();
2202}
2203
2204// This is a positive test. No errors should be generated.
2205TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
2206
2207 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2208 "on the same queue, the second having a fence, followed "
2209 "by a WaitForFences call.");
2210
2211 m_errorMonitor->ExpectSuccess();
2212
2213 VkFence fence;
2214 VkFenceCreateInfo fence_create_info{};
2215 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2216 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2217
2218 VkCommandPool command_pool;
2219 VkCommandPoolCreateInfo pool_create_info{};
2220 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2221 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2222 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2223 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2224 &command_pool);
2225
2226 VkCommandBuffer command_buffer[2];
2227 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2228 command_buffer_allocate_info.sType =
2229 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2230 command_buffer_allocate_info.commandPool = command_pool;
2231 command_buffer_allocate_info.commandBufferCount = 2;
2232 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2233 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2234 command_buffer);
2235
2236 {
2237 VkCommandBufferBeginInfo begin_info{};
2238 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2239 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2240
2241 vkCmdPipelineBarrier(command_buffer[0],
2242 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2243 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2244 0, nullptr, 0, nullptr);
2245
2246 VkViewport viewport{};
2247 viewport.maxDepth = 1.0f;
2248 viewport.minDepth = 0.0f;
2249 viewport.width = 512;
2250 viewport.height = 512;
2251 viewport.x = 0;
2252 viewport.y = 0;
2253 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2254 vkEndCommandBuffer(command_buffer[0]);
2255 }
2256 {
2257 VkCommandBufferBeginInfo begin_info{};
2258 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2259 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2260
2261 VkViewport viewport{};
2262 viewport.maxDepth = 1.0f;
2263 viewport.minDepth = 0.0f;
2264 viewport.width = 512;
2265 viewport.height = 512;
2266 viewport.x = 0;
2267 viewport.y = 0;
2268 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2269 vkEndCommandBuffer(command_buffer[1]);
2270 }
2271 {
2272 VkSubmitInfo submit_info{};
2273 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2274 submit_info.commandBufferCount = 1;
2275 submit_info.pCommandBuffers = &command_buffer[0];
2276 submit_info.signalSemaphoreCount = 0;
2277 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2278 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2279 }
2280 {
2281 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2282 VkSubmitInfo submit_info{};
2283 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2284 submit_info.commandBufferCount = 1;
2285 submit_info.pCommandBuffers = &command_buffer[1];
2286 submit_info.waitSemaphoreCount = 0;
2287 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2288 submit_info.pWaitDstStageMask = flags;
2289 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2290 }
2291
2292 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2293
2294 vkDestroyFence(m_device->device(), fence, nullptr);
2295 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2296 &command_buffer[0]);
2297 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2298
2299 m_errorMonitor->VerifyNotFound();
2300}
2301
2302// This is a positive test. No errors should be generated.
2303TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
2304
2305 TEST_DESCRIPTION(
2306 "Two command buffers each in a separate SubmitInfo sent in a single "
2307 "QueueSubmit call followed by a WaitForFences call.");
2308
2309 m_errorMonitor->ExpectSuccess();
2310
2311 VkFence fence;
2312 VkFenceCreateInfo fence_create_info{};
2313 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2314 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2315
2316 VkSemaphore semaphore;
2317 VkSemaphoreCreateInfo semaphore_create_info{};
2318 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2319 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2320 &semaphore);
2321
2322 VkCommandPool command_pool;
2323 VkCommandPoolCreateInfo pool_create_info{};
2324 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2325 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2326 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2327 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2328 &command_pool);
2329
2330 VkCommandBuffer command_buffer[2];
2331 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2332 command_buffer_allocate_info.sType =
2333 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2334 command_buffer_allocate_info.commandPool = command_pool;
2335 command_buffer_allocate_info.commandBufferCount = 2;
2336 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2337 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2338 command_buffer);
2339
2340 {
2341 VkCommandBufferBeginInfo begin_info{};
2342 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2343 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2344
2345 vkCmdPipelineBarrier(command_buffer[0],
2346 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2347 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2348 0, nullptr, 0, nullptr);
2349
2350 VkViewport viewport{};
2351 viewport.maxDepth = 1.0f;
2352 viewport.minDepth = 0.0f;
2353 viewport.width = 512;
2354 viewport.height = 512;
2355 viewport.x = 0;
2356 viewport.y = 0;
2357 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2358 vkEndCommandBuffer(command_buffer[0]);
2359 }
2360 {
2361 VkCommandBufferBeginInfo begin_info{};
2362 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2363 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2364
2365 VkViewport viewport{};
2366 viewport.maxDepth = 1.0f;
2367 viewport.minDepth = 0.0f;
2368 viewport.width = 512;
2369 viewport.height = 512;
2370 viewport.x = 0;
2371 viewport.y = 0;
2372 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2373 vkEndCommandBuffer(command_buffer[1]);
2374 }
2375 {
2376 VkSubmitInfo submit_info[2];
2377 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2378
2379 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2380 submit_info[0].pNext = NULL;
2381 submit_info[0].commandBufferCount = 1;
2382 submit_info[0].pCommandBuffers = &command_buffer[0];
2383 submit_info[0].signalSemaphoreCount = 1;
2384 submit_info[0].pSignalSemaphores = &semaphore;
2385 submit_info[0].waitSemaphoreCount = 0;
2386 submit_info[0].pWaitSemaphores = NULL;
2387 submit_info[0].pWaitDstStageMask = 0;
2388
2389 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2390 submit_info[1].pNext = NULL;
2391 submit_info[1].commandBufferCount = 1;
2392 submit_info[1].pCommandBuffers = &command_buffer[1];
2393 submit_info[1].waitSemaphoreCount = 1;
2394 submit_info[1].pWaitSemaphores = &semaphore;
2395 submit_info[1].pWaitDstStageMask = flags;
2396 submit_info[1].signalSemaphoreCount = 0;
2397 submit_info[1].pSignalSemaphores = NULL;
2398 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
2399 }
2400
2401 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2402
2403 vkDestroyFence(m_device->device(), fence, nullptr);
2404 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2405 &command_buffer[0]);
2406 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2407
2408 m_errorMonitor->VerifyNotFound();
2409}
2410
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002411TEST_F(VkLayerTest, DynamicStatesNotBound) {
2412 TEST_DESCRIPTION(
2413 "Run a series of simple draw calls to validate all the different "
2414 "failure cases that can occur when dynamic state is required but not "
2415 "correctly bound."
2416 "Here are the different dynamic state cases verified by this test:\n"
2417 "-Line Width\n-Depth Bias\n-Viewport State\n-Scissor State\n-Blend "
2418 "State\n-Depth Bounds\n-Stencil Read Mask\n-Stencil Write "
2419 "Mask\n-Stencil Reference");
2420
2421 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07002422 m_errorMonitor->SetDesiredFailureMsg(
2423 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002424 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002425 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2426 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002427 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002428 // Dynamic depth bias
Karl Schultz6addd812016-02-02 17:17:23 -07002429 m_errorMonitor->SetDesiredFailureMsg(
2430 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002431 "Dynamic depth bias state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002432 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2433 BsoFailDepthBias);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002434 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002435 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07002436 m_errorMonitor->SetDesiredFailureMsg(
2437 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002438 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002439 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2440 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002441 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002442 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07002443 m_errorMonitor->SetDesiredFailureMsg(
2444 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002445 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002446 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2447 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002448 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002449 // Dynamic blend state
Karl Schultz6addd812016-02-02 17:17:23 -07002450 m_errorMonitor->SetDesiredFailureMsg(
2451 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002452 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002453 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2454 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002455 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002456 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07002457 m_errorMonitor->SetDesiredFailureMsg(
2458 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002459 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002460 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2461 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002462 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002463 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07002464 m_errorMonitor->SetDesiredFailureMsg(
2465 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002466 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002467 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2468 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002469 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002470 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07002471 m_errorMonitor->SetDesiredFailureMsg(
2472 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002473 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002474 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2475 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002476 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002477}
2478
Karl Schultz6addd812016-02-02 17:17:23 -07002479TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002480 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002481
Karl Schultz6addd812016-02-02 17:17:23 -07002482 m_errorMonitor->SetDesiredFailureMsg(
2483 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2484 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2485 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002486
2487 VkFenceCreateInfo fenceInfo = {};
2488 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2489 fenceInfo.pNext = NULL;
2490 fenceInfo.flags = 0;
2491
2492 ASSERT_NO_FATAL_FAILURE(InitState());
2493 ASSERT_NO_FATAL_FAILURE(InitViewport());
2494 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2495
Karl Schultz6addd812016-02-02 17:17:23 -07002496 // We luck out b/c by default the framework creates CB w/ the
2497 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002498 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002499 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2500 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002501 EndCommandBuffer();
2502
2503 testFence.init(*m_device, fenceInfo);
2504
2505 // Bypass framework since it does the waits automatically
2506 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002507 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002508 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2509 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002510 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002511 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002512 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002513 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002514 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002515 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002516 submit_info.pSignalSemaphores = NULL;
2517
Karl Schultz6addd812016-02-02 17:17:23 -07002518 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2519 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002520
Karl Schultz6addd812016-02-02 17:17:23 -07002521 // Cause validation error by re-submitting cmd buffer that should only be
2522 // submitted once
2523 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002524
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002525 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002526}
2527
Karl Schultz6addd812016-02-02 17:17:23 -07002528TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002529 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002530 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002531
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002532 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002533 "Unable to allocate 1 descriptors of "
2534 "type "
2535 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002536
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002537 ASSERT_NO_FATAL_FAILURE(InitState());
2538 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002539
Karl Schultz6addd812016-02-02 17:17:23 -07002540 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
2541 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002542 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002543 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2544 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002545
2546 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002547 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2548 ds_pool_ci.pNext = NULL;
2549 ds_pool_ci.flags = 0;
2550 ds_pool_ci.maxSets = 1;
2551 ds_pool_ci.poolSizeCount = 1;
2552 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002553
2554 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002555 err =
2556 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002557 ASSERT_VK_SUCCESS(err);
2558
2559 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002560 dsl_binding.binding = 0;
2561 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2562 dsl_binding.descriptorCount = 1;
2563 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2564 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002565
2566 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002567 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2568 ds_layout_ci.pNext = NULL;
2569 ds_layout_ci.bindingCount = 1;
2570 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002571
2572 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002573 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2574 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002575 ASSERT_VK_SUCCESS(err);
2576
2577 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002578 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002579 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002580 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002581 alloc_info.descriptorPool = ds_pool;
2582 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002583 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2584 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002585
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002586 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002587
Chia-I Wuf7458c52015-10-26 21:10:41 +08002588 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2589 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002590}
2591
Karl Schultz6addd812016-02-02 17:17:23 -07002592TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
2593 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06002594
Karl Schultz6addd812016-02-02 17:17:23 -07002595 m_errorMonitor->SetDesiredFailureMsg(
2596 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2597 "It is invalid to call vkFreeDescriptorSets() with a pool created "
2598 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002599
Tobin Ehlise735c692015-10-08 13:13:50 -06002600 ASSERT_NO_FATAL_FAILURE(InitState());
2601 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06002602
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002603 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002604 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2605 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06002606
2607 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002608 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2609 ds_pool_ci.pNext = NULL;
2610 ds_pool_ci.maxSets = 1;
2611 ds_pool_ci.poolSizeCount = 1;
2612 ds_pool_ci.flags = 0;
2613 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
2614 // app can only call vkResetDescriptorPool on this pool.;
2615 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06002616
2617 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002618 err =
2619 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06002620 ASSERT_VK_SUCCESS(err);
2621
2622 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002623 dsl_binding.binding = 0;
2624 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2625 dsl_binding.descriptorCount = 1;
2626 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2627 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06002628
2629 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002630 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2631 ds_layout_ci.pNext = NULL;
2632 ds_layout_ci.bindingCount = 1;
2633 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06002634
2635 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002636 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2637 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06002638 ASSERT_VK_SUCCESS(err);
2639
2640 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002641 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002642 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002643 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002644 alloc_info.descriptorPool = ds_pool;
2645 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002646 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2647 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06002648 ASSERT_VK_SUCCESS(err);
2649
2650 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002651 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06002652
Chia-I Wuf7458c52015-10-26 21:10:41 +08002653 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2654 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06002655}
2656
Karl Schultz6addd812016-02-02 17:17:23 -07002657TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002658 // Attempt to clear Descriptor Pool with bad object.
2659 // ObjectTracker should catch this.
2660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2661 "Invalid VkDescriptorPool Object 0xbaad6001");
2662 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
2663 vkResetDescriptorPool(device(), badPool, 0);
2664 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002665}
2666
Karl Schultz6addd812016-02-02 17:17:23 -07002667TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002668 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
2669 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002670 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06002671 // call vkCmdBindDescriptorSets w/ false Descriptor Set
2672 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
2673 VkResult err;
2674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2675 "Invalid VkDescriptorSet Object 0xbaad6001");
2676
2677 ASSERT_NO_FATAL_FAILURE(InitState());
2678
2679 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
2680 layout_bindings[0].binding = 0;
2681 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2682 layout_bindings[0].descriptorCount = 1;
2683 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2684 layout_bindings[0].pImmutableSamplers = NULL;
2685
2686 VkDescriptorSetLayout descriptor_set_layout;
2687 VkDescriptorSetLayoutCreateInfo dslci = {};
2688 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2689 dslci.pNext = NULL;
2690 dslci.bindingCount = 1;
2691 dslci.pBindings = layout_bindings;
2692 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002693 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002694
2695 VkPipelineLayout pipeline_layout;
2696 VkPipelineLayoutCreateInfo plci = {};
2697 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2698 plci.pNext = NULL;
2699 plci.setLayoutCount = 1;
2700 plci.pSetLayouts = &descriptor_set_layout;
2701 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002702 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002703
2704 BeginCommandBuffer();
2705 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2706 pipeline_layout, 0, 1, &badSet, 0, NULL);
2707 m_errorMonitor->VerifyFound();
2708 EndCommandBuffer();
2709 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
2710 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002711}
2712
Karl Schultz6addd812016-02-02 17:17:23 -07002713TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002714 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
2715 // ObjectTracker should catch this.
2716 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
2717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2718 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
2719
2720 VkPipelineLayout pipeline_layout;
2721 VkPipelineLayoutCreateInfo plci = {};
2722 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2723 plci.pNext = NULL;
2724 plci.setLayoutCount = 1;
2725 plci.pSetLayouts = &bad_layout;
2726 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
2727
2728 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002729}
2730
Karl Schultz6addd812016-02-02 17:17:23 -07002731TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002732 // Attempt to bind an invalid Pipeline to a valid Command Buffer
2733 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002734 // Create a valid cmd buffer
2735 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06002736 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
2737 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2738 "Invalid VkPipeline Object 0xbaad6001");
2739 ASSERT_NO_FATAL_FAILURE(InitState());
2740 BeginCommandBuffer();
2741 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2742 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
2743 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06002744
2745 // Now issue a draw call with no pipeline bound
2746 m_errorMonitor->SetDesiredFailureMsg(
2747 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2748 "At Draw/Dispatch time no valid VkPipeline is bound!");
2749 ASSERT_NO_FATAL_FAILURE(InitState());
2750 BeginCommandBuffer();
2751 Draw(1, 0, 0, 0);
2752 m_errorMonitor->VerifyFound();
2753 // Finally same check once more but with Dispatch/Compute
2754 m_errorMonitor->SetDesiredFailureMsg(
2755 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2756 "At Draw/Dispatch time no valid VkPipeline is bound!");
2757 ASSERT_NO_FATAL_FAILURE(InitState());
2758 BeginCommandBuffer();
2759 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
2760 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002761}
2762
Karl Schultz6addd812016-02-02 17:17:23 -07002763TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
2764 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
2765 // CommandBuffer
2766 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002767
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002768 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002769 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002770
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002771 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06002772 ASSERT_NO_FATAL_FAILURE(InitViewport());
2773 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002774 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002775 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2776 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002777
2778 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002779 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2780 ds_pool_ci.pNext = NULL;
2781 ds_pool_ci.maxSets = 1;
2782 ds_pool_ci.poolSizeCount = 1;
2783 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06002784
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002785 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002786 err =
2787 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002788 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002789
Tony Barboureb254902015-07-15 12:50:33 -06002790 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002791 dsl_binding.binding = 0;
2792 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2793 dsl_binding.descriptorCount = 1;
2794 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2795 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002796
Tony Barboureb254902015-07-15 12:50:33 -06002797 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002798 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2799 ds_layout_ci.pNext = NULL;
2800 ds_layout_ci.bindingCount = 1;
2801 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002802 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002803 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2804 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002805 ASSERT_VK_SUCCESS(err);
2806
2807 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002808 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002809 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002810 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002811 alloc_info.descriptorPool = ds_pool;
2812 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002813 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2814 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002815 ASSERT_VK_SUCCESS(err);
2816
Tony Barboureb254902015-07-15 12:50:33 -06002817 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002818 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2819 pipeline_layout_ci.pNext = NULL;
2820 pipeline_layout_ci.setLayoutCount = 1;
2821 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002822
2823 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002824 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2825 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002826 ASSERT_VK_SUCCESS(err);
2827
Karl Schultz6addd812016-02-02 17:17:23 -07002828 VkShaderObj vs(m_device, bindStateVertShaderText,
2829 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06002830 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07002831 // on more devices
2832 VkShaderObj fs(m_device, bindStateFragShaderText,
2833 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002834
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002835 VkPipelineObj pipe(m_device);
2836 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06002837 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06002838 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002839 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06002840
2841 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002842 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2843 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2844 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2845 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2846 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002847
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002848 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002849
Chia-I Wuf7458c52015-10-26 21:10:41 +08002850 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2851 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2852 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002853}
2854
Karl Schultz6addd812016-02-02 17:17:23 -07002855TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002856 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07002857 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002858
Karl Schultz6addd812016-02-02 17:17:23 -07002859 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06002860 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
2861 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002862
2863 ASSERT_NO_FATAL_FAILURE(InitState());
2864 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002865 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2866 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002867
2868 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002869 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2870 ds_pool_ci.pNext = NULL;
2871 ds_pool_ci.maxSets = 1;
2872 ds_pool_ci.poolSizeCount = 1;
2873 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002874
2875 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002876 err =
2877 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002878 ASSERT_VK_SUCCESS(err);
2879
2880 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002881 dsl_binding.binding = 0;
2882 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2883 dsl_binding.descriptorCount = 1;
2884 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2885 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002886
2887 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002888 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2889 ds_layout_ci.pNext = NULL;
2890 ds_layout_ci.bindingCount = 1;
2891 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002892 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002893 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2894 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002895 ASSERT_VK_SUCCESS(err);
2896
2897 VkDescriptorSet descriptorSet;
2898 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002899 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002900 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002901 alloc_info.descriptorPool = ds_pool;
2902 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002903 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2904 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002905 ASSERT_VK_SUCCESS(err);
2906
Karl Schultz6addd812016-02-02 17:17:23 -07002907 VkBufferView view =
2908 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002909 VkWriteDescriptorSet descriptor_write;
2910 memset(&descriptor_write, 0, sizeof(descriptor_write));
2911 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2912 descriptor_write.dstSet = descriptorSet;
2913 descriptor_write.dstBinding = 0;
2914 descriptor_write.descriptorCount = 1;
2915 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2916 descriptor_write.pTexelBufferView = &view;
2917
2918 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2919
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002920 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002921
2922 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2923 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2924}
2925
Karl Schultz6addd812016-02-02 17:17:23 -07002926TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
2927 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
2928 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07002929 // 1. No dynamicOffset supplied
2930 // 2. Too many dynamicOffsets supplied
2931 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07002932 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002934 " requires 1 dynamicOffsets, but only "
2935 "0 dynamicOffsets are left in "
2936 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002937
2938 ASSERT_NO_FATAL_FAILURE(InitState());
2939 ASSERT_NO_FATAL_FAILURE(InitViewport());
2940 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2941
2942 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002943 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2944 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002945
2946 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002947 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2948 ds_pool_ci.pNext = NULL;
2949 ds_pool_ci.maxSets = 1;
2950 ds_pool_ci.poolSizeCount = 1;
2951 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002952
2953 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002954 err =
2955 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002956 ASSERT_VK_SUCCESS(err);
2957
2958 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002959 dsl_binding.binding = 0;
2960 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2961 dsl_binding.descriptorCount = 1;
2962 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2963 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002964
2965 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002966 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2967 ds_layout_ci.pNext = NULL;
2968 ds_layout_ci.bindingCount = 1;
2969 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002970 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002971 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2972 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002973 ASSERT_VK_SUCCESS(err);
2974
2975 VkDescriptorSet descriptorSet;
2976 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002977 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002978 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002979 alloc_info.descriptorPool = ds_pool;
2980 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002981 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2982 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002983 ASSERT_VK_SUCCESS(err);
2984
2985 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002986 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2987 pipeline_layout_ci.pNext = NULL;
2988 pipeline_layout_ci.setLayoutCount = 1;
2989 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002990
2991 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002992 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2993 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002994 ASSERT_VK_SUCCESS(err);
2995
2996 // Create a buffer to update the descriptor with
2997 uint32_t qfi = 0;
2998 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002999 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3000 buffCI.size = 1024;
3001 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3002 buffCI.queueFamilyIndexCount = 1;
3003 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003004
3005 VkBuffer dyub;
3006 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3007 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003008 // Allocate memory and bind to buffer so we can make it to the appropriate
3009 // error
3010 VkMemoryAllocateInfo mem_alloc = {};
3011 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3012 mem_alloc.pNext = NULL;
3013 mem_alloc.allocationSize = 1024;
3014 mem_alloc.memoryTypeIndex = 1;
3015 VkDeviceMemory mem;
3016 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3017 ASSERT_VK_SUCCESS(err);
3018 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
3019 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003020 // Correctly update descriptor to avoid "NOT_UPDATED" error
3021 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003022 buffInfo.buffer = dyub;
3023 buffInfo.offset = 0;
3024 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003025
3026 VkWriteDescriptorSet descriptor_write;
3027 memset(&descriptor_write, 0, sizeof(descriptor_write));
3028 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3029 descriptor_write.dstSet = descriptorSet;
3030 descriptor_write.dstBinding = 0;
3031 descriptor_write.descriptorCount = 1;
3032 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3033 descriptor_write.pBufferInfo = &buffInfo;
3034
3035 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3036
3037 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003038 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3039 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3040 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003041 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003042 uint32_t pDynOff[2] = {512, 756};
3043 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07003044 m_errorMonitor->SetDesiredFailureMsg(
3045 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07003046 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07003047 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3048 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3049 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12003050 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003051 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3053 " dynamic offset 512 combined with "
3054 "offset 0 and range 1024 that "
3055 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07003056 // Create PSO to be used for draw-time errors below
3057 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003058 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003059 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003060 "out gl_PerVertex { \n"
3061 " vec4 gl_Position;\n"
3062 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003063 "void main(){\n"
3064 " gl_Position = vec4(1);\n"
3065 "}\n";
3066 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003067 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003068 "\n"
3069 "layout(location=0) out vec4 x;\n"
3070 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3071 "void main(){\n"
3072 " x = vec4(bar.y);\n"
3073 "}\n";
3074 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3075 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3076 VkPipelineObj pipe(m_device);
3077 pipe.AddShader(&vs);
3078 pipe.AddShader(&fs);
3079 pipe.AddColorAttachment();
3080 pipe.CreateVKPipeline(pipeline_layout, renderPass());
3081
Karl Schultz6addd812016-02-02 17:17:23 -07003082 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3083 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3084 // This update should succeed, but offset size of 512 will overstep buffer
3085 // /w range 1024 & size 1024
3086 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3087 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3088 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07003089 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003090 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003091
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003092 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06003093 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003094
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003095 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3096 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3097}
3098
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003099TEST_F(VkLayerTest, InvalidPushConstants) {
3100 // Hit push constant error cases:
3101 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
3102 // 2. Incorrectly set push constant size to 0
3103 // 3. Incorrectly set push constant size to non-multiple of 4
3104 // 4. Attempt push constant update that exceeds maxPushConstantSize
3105 VkResult err;
3106 m_errorMonitor->SetDesiredFailureMsg(
3107 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3108 "vkCreatePipelineLayout() call has push constants with offset ");
3109
3110 ASSERT_NO_FATAL_FAILURE(InitState());
3111 ASSERT_NO_FATAL_FAILURE(InitViewport());
3112 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3113
3114 VkPushConstantRange pc_range = {};
3115 pc_range.size = 0xFFFFFFFFu;
3116 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3117 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3118 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3119 pipeline_layout_ci.pushConstantRangeCount = 1;
3120 pipeline_layout_ci.pPushConstantRanges = &pc_range;
3121
3122 VkPipelineLayout pipeline_layout;
3123 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3124 &pipeline_layout);
3125
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003126 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003127 // Now cause errors due to size 0 and non-4 byte aligned size
3128 pc_range.size = 0;
3129 m_errorMonitor->SetDesiredFailureMsg(
3130 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3131 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
3132 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3133 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003134 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003135 pc_range.size = 1;
3136 m_errorMonitor->SetDesiredFailureMsg(
3137 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3138 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
3139 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3140 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003141 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003142 // Cause error due to bad size in vkCmdPushConstants() call
3143 m_errorMonitor->SetDesiredFailureMsg(
3144 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3145 "vkCmdPushConstants() call has push constants with offset ");
3146 pipeline_layout_ci.pushConstantRangeCount = 0;
3147 pipeline_layout_ci.pPushConstantRanges = NULL;
3148 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3149 &pipeline_layout);
3150 ASSERT_VK_SUCCESS(err);
3151 BeginCommandBuffer();
3152 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
3153 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003154 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003155 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3156}
3157
Karl Schultz6addd812016-02-02 17:17:23 -07003158TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003159 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07003160 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003161
3162 ASSERT_NO_FATAL_FAILURE(InitState());
3163 ASSERT_NO_FATAL_FAILURE(InitViewport());
3164 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3165
3166 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
3167 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003168 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3169 ds_type_count[0].descriptorCount = 10;
3170 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3171 ds_type_count[1].descriptorCount = 2;
3172 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3173 ds_type_count[2].descriptorCount = 2;
3174 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
3175 ds_type_count[3].descriptorCount = 5;
3176 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
3177 // type
3178 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3179 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
3180 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003181
3182 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003183 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3184 ds_pool_ci.pNext = NULL;
3185 ds_pool_ci.maxSets = 5;
3186 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
3187 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003188
3189 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003190 err =
3191 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003192 ASSERT_VK_SUCCESS(err);
3193
3194 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
3195 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003196 dsl_binding[0].binding = 0;
3197 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3198 dsl_binding[0].descriptorCount = 5;
3199 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3200 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003201
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003202 // Create layout identical to set0 layout but w/ different stageFlags
3203 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003204 dsl_fs_stage_only.binding = 0;
3205 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3206 dsl_fs_stage_only.descriptorCount = 5;
3207 dsl_fs_stage_only.stageFlags =
3208 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
3209 // bind time
3210 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003211 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003212 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3213 ds_layout_ci.pNext = NULL;
3214 ds_layout_ci.bindingCount = 1;
3215 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003216 static const uint32_t NUM_LAYOUTS = 4;
3217 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003218 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003219 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
3220 // layout for error case
3221 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3222 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003223 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003224 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003225 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3226 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003227 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003228 dsl_binding[0].binding = 0;
3229 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003230 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003231 dsl_binding[1].binding = 1;
3232 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3233 dsl_binding[1].descriptorCount = 2;
3234 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
3235 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003236 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003237 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003238 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3239 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003240 ASSERT_VK_SUCCESS(err);
3241 dsl_binding[0].binding = 0;
3242 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003243 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003244 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07003245 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3246 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003247 ASSERT_VK_SUCCESS(err);
3248 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003249 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003250 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3251 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003252 ASSERT_VK_SUCCESS(err);
3253
3254 static const uint32_t NUM_SETS = 4;
3255 VkDescriptorSet descriptorSet[NUM_SETS] = {};
3256 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003257 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003258 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003259 alloc_info.descriptorPool = ds_pool;
3260 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003261 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3262 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003263 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003264 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003265 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003266 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003267 err =
3268 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003269 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003270
3271 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003272 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3273 pipeline_layout_ci.pNext = NULL;
3274 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
3275 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003276
3277 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003278 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3279 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003280 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003281 // Create pipelineLayout with only one setLayout
3282 pipeline_layout_ci.setLayoutCount = 1;
3283 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003284 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3285 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003286 ASSERT_VK_SUCCESS(err);
3287 // Create pipelineLayout with 2 descriptor setLayout at index 0
3288 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
3289 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07003290 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3291 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003292 ASSERT_VK_SUCCESS(err);
3293 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
3294 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
3295 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07003296 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3297 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003298 ASSERT_VK_SUCCESS(err);
3299 // Create pipelineLayout with UB type, but stageFlags for FS only
3300 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
3301 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003302 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3303 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003304 ASSERT_VK_SUCCESS(err);
3305 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
3306 VkDescriptorSetLayout pl_bad_s0[2] = {};
3307 pl_bad_s0[0] = ds_layout_fs_only;
3308 pl_bad_s0[1] = ds_layout[1];
3309 pipeline_layout_ci.setLayoutCount = 2;
3310 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
3311 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07003312 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3313 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003314 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003315
3316 // Create a buffer to update the descriptor with
3317 uint32_t qfi = 0;
3318 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003319 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3320 buffCI.size = 1024;
3321 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3322 buffCI.queueFamilyIndexCount = 1;
3323 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003324
3325 VkBuffer dyub;
3326 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3327 ASSERT_VK_SUCCESS(err);
3328 // Correctly update descriptor to avoid "NOT_UPDATED" error
3329 static const uint32_t NUM_BUFFS = 5;
3330 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003331 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003332 buffInfo[i].buffer = dyub;
3333 buffInfo[i].offset = 0;
3334 buffInfo[i].range = 1024;
3335 }
Karl Schultz6addd812016-02-02 17:17:23 -07003336 VkImage image;
3337 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3338 const int32_t tex_width = 32;
3339 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003340 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003341 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3342 image_create_info.pNext = NULL;
3343 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3344 image_create_info.format = tex_format;
3345 image_create_info.extent.width = tex_width;
3346 image_create_info.extent.height = tex_height;
3347 image_create_info.extent.depth = 1;
3348 image_create_info.mipLevels = 1;
3349 image_create_info.arrayLayers = 1;
3350 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3351 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3352 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3353 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003354 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3355 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003356
Karl Schultz6addd812016-02-02 17:17:23 -07003357 VkMemoryRequirements memReqs;
3358 VkDeviceMemory imageMem;
3359 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003360 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003361 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3362 memAlloc.pNext = NULL;
3363 memAlloc.allocationSize = 0;
3364 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003365 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
3366 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003367 pass =
3368 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003369 ASSERT_TRUE(pass);
3370 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
3371 ASSERT_VK_SUCCESS(err);
3372 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
3373 ASSERT_VK_SUCCESS(err);
3374
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003375 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003376 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3377 image_view_create_info.image = image;
3378 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
3379 image_view_create_info.format = tex_format;
3380 image_view_create_info.subresourceRange.layerCount = 1;
3381 image_view_create_info.subresourceRange.baseMipLevel = 0;
3382 image_view_create_info.subresourceRange.levelCount = 1;
3383 image_view_create_info.subresourceRange.aspectMask =
3384 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003385
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003386 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07003387 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
3388 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003389 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003390 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003391 imageInfo[0].imageView = view;
3392 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3393 imageInfo[1].imageView = view;
3394 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003395 imageInfo[2].imageView = view;
3396 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3397 imageInfo[3].imageView = view;
3398 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003399
3400 static const uint32_t NUM_SET_UPDATES = 3;
3401 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
3402 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3403 descriptor_write[0].dstSet = descriptorSet[0];
3404 descriptor_write[0].dstBinding = 0;
3405 descriptor_write[0].descriptorCount = 5;
3406 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3407 descriptor_write[0].pBufferInfo = buffInfo;
3408 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3409 descriptor_write[1].dstSet = descriptorSet[1];
3410 descriptor_write[1].dstBinding = 0;
3411 descriptor_write[1].descriptorCount = 2;
3412 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3413 descriptor_write[1].pImageInfo = imageInfo;
3414 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3415 descriptor_write[2].dstSet = descriptorSet[1];
3416 descriptor_write[2].dstBinding = 1;
3417 descriptor_write[2].descriptorCount = 2;
3418 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003419 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003420
3421 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003422
Tobin Ehlis88452832015-12-03 09:40:56 -07003423 // Create PSO to be used for draw-time errors below
3424 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003425 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003426 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003427 "out gl_PerVertex {\n"
3428 " vec4 gl_Position;\n"
3429 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003430 "void main(){\n"
3431 " gl_Position = vec4(1);\n"
3432 "}\n";
3433 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003434 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003435 "\n"
3436 "layout(location=0) out vec4 x;\n"
3437 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3438 "void main(){\n"
3439 " x = vec4(bar.y);\n"
3440 "}\n";
3441 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3442 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003443 VkPipelineObj pipe(m_device);
3444 pipe.AddShader(&vs);
3445 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07003446 pipe.AddColorAttachment();
3447 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003448
3449 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003450
Karl Schultz6addd812016-02-02 17:17:23 -07003451 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3452 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3453 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3454 // of PSO
3455 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3456 // cmd_pipeline.c
3457 // due to the fact that cmd_alloc_dset_data() has not been called in
3458 // cmd_bind_graphics_pipeline()
3459 // TODO : Want to cause various binding incompatibility issues here to test
3460 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003461 // First cause various verify_layout_compatibility() fails
3462 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003463 // verify_set_layout_compatibility fail cases:
3464 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3466 " due to: invalid VkPipelineLayout ");
3467 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3468 VK_PIPELINE_BIND_POINT_GRAPHICS,
3469 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3470 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003471 m_errorMonitor->VerifyFound();
3472
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003473 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3475 " attempting to bind set to index 1");
3476 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3477 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3478 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003479 m_errorMonitor->VerifyFound();
3480
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003481 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003482 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3483 // descriptors
3484 m_errorMonitor->SetDesiredFailureMsg(
3485 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003486 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003487 vkCmdBindDescriptorSets(
3488 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3489 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003490 m_errorMonitor->VerifyFound();
3491
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003492 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3493 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003494 m_errorMonitor->SetDesiredFailureMsg(
3495 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003496 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07003497 vkCmdBindDescriptorSets(
3498 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3499 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003500 m_errorMonitor->VerifyFound();
3501
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003502 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3503 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003504 m_errorMonitor->SetDesiredFailureMsg(
3505 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003506 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003507 vkCmdBindDescriptorSets(
3508 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3509 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003510 m_errorMonitor->VerifyFound();
3511
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003512 // Cause INFO messages due to disturbing previously bound Sets
3513 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003514 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3515 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3516 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003517 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07003518 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003519 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003520 " previously bound as set #0 was disturbed ");
3521 vkCmdBindDescriptorSets(
3522 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3523 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003524 m_errorMonitor->VerifyFound();
3525
Karl Schultz6addd812016-02-02 17:17:23 -07003526 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3527 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3528 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003529 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003530 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003531 " newly bound as set #0 so set #1 and "
3532 "any subsequent sets were disturbed ");
3533 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3534 VK_PIPELINE_BIND_POINT_GRAPHICS,
3535 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003536 m_errorMonitor->VerifyFound();
3537
Tobin Ehlis88452832015-12-03 09:40:56 -07003538 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07003539 // 1. Error due to not binding required set (we actually use same code as
3540 // above to disturb set0)
3541 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3542 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3543 2, &descriptorSet[0], 0, NULL);
3544 vkCmdBindDescriptorSets(
3545 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3546 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
3547 m_errorMonitor->SetDesiredFailureMsg(
3548 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3549 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07003550 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003551 m_errorMonitor->VerifyFound();
3552
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003553 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003554 // 2. Error due to bound set not being compatible with PSO's
3555 // VkPipelineLayout (diff stageFlags in this case)
3556 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3557 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3558 2, &descriptorSet[0], 0, NULL);
3559 m_errorMonitor->SetDesiredFailureMsg(
3560 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3561 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07003562 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003563 m_errorMonitor->VerifyFound();
3564
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003565 // Remaining clean-up
3566 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003567 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003568 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
3569 }
3570 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06003571 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
3572 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003573 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003574 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3575 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3576}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003577
Karl Schultz6addd812016-02-02 17:17:23 -07003578TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003579
Karl Schultz6addd812016-02-02 17:17:23 -07003580 m_errorMonitor->SetDesiredFailureMsg(
3581 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003582 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003583
3584 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003585 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003586 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003587 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003588
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003589 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003590}
3591
Karl Schultz6addd812016-02-02 17:17:23 -07003592TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3593 VkResult err;
3594 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003595
Karl Schultz6addd812016-02-02 17:17:23 -07003596 m_errorMonitor->SetDesiredFailureMsg(
3597 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003598 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003599
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003600 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003601
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003602 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003603 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003604 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003605 cmd.commandPool = m_commandPool;
3606 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003607 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003608
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003609 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003610 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003611
3612 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003613 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003614 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003615 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003616 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003617 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3618 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003619 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003620
3621 // The error should be caught by validation of the BeginCommandBuffer call
3622 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3623
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003624 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003625 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003626}
3627
Karl Schultz6addd812016-02-02 17:17:23 -07003628TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003629 // Cause error due to Begin while recording CB
3630 // Then cause 2 errors for attempting to reset CB w/o having
3631 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3632 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003634 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003635
3636 ASSERT_NO_FATAL_FAILURE(InitState());
3637
3638 // Calls AllocateCommandBuffers
3639 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3640
Karl Schultz6addd812016-02-02 17:17:23 -07003641 // Force the failure by setting the Renderpass and Framebuffer fields with
3642 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003643 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003644 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003645 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3646 cmd_buf_info.pNext = NULL;
3647 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003648 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003649
3650 // Begin CB to transition to recording state
3651 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3652 // Can't re-begin. This should trigger error
3653 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003654 m_errorMonitor->VerifyFound();
3655
Karl Schultz6addd812016-02-02 17:17:23 -07003656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3657 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003658 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3659 // Reset attempt will trigger error due to incorrect CommandPool state
3660 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003661 m_errorMonitor->VerifyFound();
3662
Karl Schultz6addd812016-02-02 17:17:23 -07003663 m_errorMonitor->SetDesiredFailureMsg(
3664 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3665 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003666 // Transition CB to RECORDED state
3667 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3668 // Now attempting to Begin will implicitly reset, which triggers error
3669 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003670 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003671}
3672
Karl Schultz6addd812016-02-02 17:17:23 -07003673TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003674 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003675 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003676
Karl Schultz6addd812016-02-02 17:17:23 -07003677 m_errorMonitor->SetDesiredFailureMsg(
3678 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003679 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3680
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003681 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003682 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003683
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003684 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003685 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3686 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003687
3688 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003689 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3690 ds_pool_ci.pNext = NULL;
3691 ds_pool_ci.maxSets = 1;
3692 ds_pool_ci.poolSizeCount = 1;
3693 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003694
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003695 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003696 err =
3697 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003698 ASSERT_VK_SUCCESS(err);
3699
Tony Barboureb254902015-07-15 12:50:33 -06003700 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003701 dsl_binding.binding = 0;
3702 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3703 dsl_binding.descriptorCount = 1;
3704 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3705 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003706
Tony Barboureb254902015-07-15 12:50:33 -06003707 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003708 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3709 ds_layout_ci.pNext = NULL;
3710 ds_layout_ci.bindingCount = 1;
3711 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003712
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003713 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003714 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3715 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003716 ASSERT_VK_SUCCESS(err);
3717
3718 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003719 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003720 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003721 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003722 alloc_info.descriptorPool = ds_pool;
3723 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003724 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3725 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003726 ASSERT_VK_SUCCESS(err);
3727
Tony Barboureb254902015-07-15 12:50:33 -06003728 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003729 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3730 pipeline_layout_ci.setLayoutCount = 1;
3731 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003732
3733 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003734 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3735 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003736 ASSERT_VK_SUCCESS(err);
3737
Tobin Ehlise68360f2015-10-01 11:15:13 -06003738 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07003739 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06003740
3741 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003742 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3743 vp_state_ci.scissorCount = 1;
3744 vp_state_ci.pScissors = &sc;
3745 vp_state_ci.viewportCount = 1;
3746 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003747
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003748 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3749 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3750 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3751 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3752 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3753 rs_state_ci.depthClampEnable = VK_FALSE;
3754 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3755 rs_state_ci.depthBiasEnable = VK_FALSE;
3756
Tony Barboureb254902015-07-15 12:50:33 -06003757 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003758 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3759 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003760 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003761 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3762 gp_ci.layout = pipeline_layout;
3763 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06003764
3765 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003766 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3767 pc_ci.initialDataSize = 0;
3768 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003769
3770 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003771 VkPipelineCache pipelineCache;
3772
Karl Schultz6addd812016-02-02 17:17:23 -07003773 err =
3774 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06003775 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003776 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3777 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003778
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003779 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003780
Chia-I Wuf7458c52015-10-26 21:10:41 +08003781 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3782 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3783 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3784 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003785}
Tobin Ehlis912df022015-09-17 08:46:18 -06003786/*// TODO : This test should be good, but needs Tess support in compiler to run
3787TEST_F(VkLayerTest, InvalidPatchControlPoints)
3788{
3789 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06003790 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003791
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003793 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
3794primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003795
Tobin Ehlis912df022015-09-17 08:46:18 -06003796 ASSERT_NO_FATAL_FAILURE(InitState());
3797 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06003798
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003799 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06003800 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003801 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003802
3803 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3804 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3805 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003806 ds_pool_ci.poolSizeCount = 1;
3807 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06003808
3809 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003810 err = vkCreateDescriptorPool(m_device->device(),
3811VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06003812 ASSERT_VK_SUCCESS(err);
3813
3814 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08003815 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06003816 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08003817 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003818 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3819 dsl_binding.pImmutableSamplers = NULL;
3820
3821 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003822 ds_layout_ci.sType =
3823VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003824 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003825 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003826 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06003827
3828 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003829 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3830&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003831 ASSERT_VK_SUCCESS(err);
3832
3833 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003834 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
3835VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06003836 ASSERT_VK_SUCCESS(err);
3837
3838 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003839 pipeline_layout_ci.sType =
3840VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003841 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003842 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003843 pipeline_layout_ci.pSetLayouts = &ds_layout;
3844
3845 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003846 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3847&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003848 ASSERT_VK_SUCCESS(err);
3849
3850 VkPipelineShaderStageCreateInfo shaderStages[3];
3851 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
3852
Karl Schultz6addd812016-02-02 17:17:23 -07003853 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
3854this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003855 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07003856 VkShaderObj
3857tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
3858this);
3859 VkShaderObj
3860te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
3861this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003862
Karl Schultz6addd812016-02-02 17:17:23 -07003863 shaderStages[0].sType =
3864VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003865 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003866 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003867 shaderStages[1].sType =
3868VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003869 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003870 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003871 shaderStages[2].sType =
3872VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003873 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003874 shaderStages[2].shader = te.handle();
3875
3876 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003877 iaCI.sType =
3878VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08003879 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06003880
3881 VkPipelineTessellationStateCreateInfo tsCI = {};
3882 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
3883 tsCI.patchControlPoints = 0; // This will cause an error
3884
3885 VkGraphicsPipelineCreateInfo gp_ci = {};
3886 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3887 gp_ci.pNext = NULL;
3888 gp_ci.stageCount = 3;
3889 gp_ci.pStages = shaderStages;
3890 gp_ci.pVertexInputState = NULL;
3891 gp_ci.pInputAssemblyState = &iaCI;
3892 gp_ci.pTessellationState = &tsCI;
3893 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003894 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06003895 gp_ci.pMultisampleState = NULL;
3896 gp_ci.pDepthStencilState = NULL;
3897 gp_ci.pColorBlendState = NULL;
3898 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3899 gp_ci.layout = pipeline_layout;
3900 gp_ci.renderPass = renderPass();
3901
3902 VkPipelineCacheCreateInfo pc_ci = {};
3903 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3904 pc_ci.pNext = NULL;
3905 pc_ci.initialSize = 0;
3906 pc_ci.initialData = 0;
3907 pc_ci.maxSize = 0;
3908
3909 VkPipeline pipeline;
3910 VkPipelineCache pipelineCache;
3911
Karl Schultz6addd812016-02-02 17:17:23 -07003912 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
3913&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06003914 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003915 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3916&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06003917
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003918 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003919
Chia-I Wuf7458c52015-10-26 21:10:41 +08003920 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3921 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3922 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3923 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06003924}
3925*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06003926// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07003927TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07003928 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003929
Karl Schultz6addd812016-02-02 17:17:23 -07003930 m_errorMonitor->SetDesiredFailureMsg(
3931 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003932 "Gfx Pipeline viewport count (1) must match scissor count (0).");
3933
Tobin Ehlise68360f2015-10-01 11:15:13 -06003934 ASSERT_NO_FATAL_FAILURE(InitState());
3935 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003936
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003937 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003938 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3939 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003940
3941 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003942 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3943 ds_pool_ci.maxSets = 1;
3944 ds_pool_ci.poolSizeCount = 1;
3945 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003946
3947 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003948 err =
3949 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003950 ASSERT_VK_SUCCESS(err);
3951
3952 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003953 dsl_binding.binding = 0;
3954 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3955 dsl_binding.descriptorCount = 1;
3956 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003957
3958 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003959 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3960 ds_layout_ci.bindingCount = 1;
3961 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003962
3963 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003964 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3965 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003966 ASSERT_VK_SUCCESS(err);
3967
3968 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003969 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003970 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003971 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003972 alloc_info.descriptorPool = ds_pool;
3973 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003974 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3975 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003976 ASSERT_VK_SUCCESS(err);
3977
3978 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003979 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3980 pipeline_layout_ci.setLayoutCount = 1;
3981 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003982
3983 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003984 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3985 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003986 ASSERT_VK_SUCCESS(err);
3987
3988 VkViewport vp = {}; // Just need dummy vp to point to
3989
3990 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003991 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3992 vp_state_ci.scissorCount = 0;
3993 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
3994 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003995
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003996 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3997 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3998 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3999 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4000 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4001 rs_state_ci.depthClampEnable = VK_FALSE;
4002 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4003 rs_state_ci.depthBiasEnable = VK_FALSE;
4004
Cody Northropeb3a6c12015-10-05 14:44:45 -06004005 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004006 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004007
Karl Schultz6addd812016-02-02 17:17:23 -07004008 VkShaderObj vs(m_device, bindStateVertShaderText,
4009 VK_SHADER_STAGE_VERTEX_BIT, this);
4010 VkShaderObj fs(m_device, bindStateFragShaderText,
4011 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004012 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004013 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004014 shaderStages[0] = vs.GetStageCreateInfo();
4015 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004016
4017 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004018 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4019 gp_ci.stageCount = 2;
4020 gp_ci.pStages = shaderStages;
4021 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004022 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004023 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4024 gp_ci.layout = pipeline_layout;
4025 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004026
4027 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004028 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004029
4030 VkPipeline pipeline;
4031 VkPipelineCache pipelineCache;
4032
Karl Schultz6addd812016-02-02 17:17:23 -07004033 err =
4034 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004035 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004036 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4037 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004038
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004039 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004040
Chia-I Wuf7458c52015-10-26 21:10:41 +08004041 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4042 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4043 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4044 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004045}
Karl Schultz6addd812016-02-02 17:17:23 -07004046// Don't set viewport state in PSO. This is an error b/c we always need this
4047// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06004048// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07004049TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06004050 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004051 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004052
Karl Schultz6addd812016-02-02 17:17:23 -07004053 m_errorMonitor->SetDesiredFailureMsg(
4054 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004055 "Gfx Pipeline pViewportState is null. Even if ");
4056
Tobin Ehlise68360f2015-10-01 11:15:13 -06004057 ASSERT_NO_FATAL_FAILURE(InitState());
4058 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004059
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004060 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004061 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4062 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004063
4064 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004065 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4066 ds_pool_ci.maxSets = 1;
4067 ds_pool_ci.poolSizeCount = 1;
4068 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004069
4070 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004071 err =
4072 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004073 ASSERT_VK_SUCCESS(err);
4074
4075 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004076 dsl_binding.binding = 0;
4077 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4078 dsl_binding.descriptorCount = 1;
4079 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004080
4081 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004082 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4083 ds_layout_ci.bindingCount = 1;
4084 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004085
4086 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004087 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4088 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004089 ASSERT_VK_SUCCESS(err);
4090
4091 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004092 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004093 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004094 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004095 alloc_info.descriptorPool = ds_pool;
4096 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004097 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4098 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004099 ASSERT_VK_SUCCESS(err);
4100
4101 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004102 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4103 pipeline_layout_ci.setLayoutCount = 1;
4104 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004105
4106 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004107 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4108 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004109 ASSERT_VK_SUCCESS(err);
4110
4111 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4112 // Set scissor as dynamic to avoid second error
4113 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004114 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4115 dyn_state_ci.dynamicStateCount = 1;
4116 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004117
Cody Northropeb3a6c12015-10-05 14:44:45 -06004118 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004119 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004120
Karl Schultz6addd812016-02-02 17:17:23 -07004121 VkShaderObj vs(m_device, bindStateVertShaderText,
4122 VK_SHADER_STAGE_VERTEX_BIT, this);
4123 VkShaderObj fs(m_device, bindStateFragShaderText,
4124 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004125 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004126 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004127 shaderStages[0] = vs.GetStageCreateInfo();
4128 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004129
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004130
4131 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4132 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4133 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4134 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4135 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4136 rs_state_ci.depthClampEnable = VK_FALSE;
4137 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4138 rs_state_ci.depthBiasEnable = VK_FALSE;
4139
Tobin Ehlise68360f2015-10-01 11:15:13 -06004140 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004141 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4142 gp_ci.stageCount = 2;
4143 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004144 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004145 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
4146 // should cause validation error
4147 gp_ci.pDynamicState = &dyn_state_ci;
4148 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4149 gp_ci.layout = pipeline_layout;
4150 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004151
4152 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004153 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004154
4155 VkPipeline pipeline;
4156 VkPipelineCache pipelineCache;
4157
Karl Schultz6addd812016-02-02 17:17:23 -07004158 err =
4159 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004160 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004161 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4162 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004163
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004164 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004165
Chia-I Wuf7458c52015-10-26 21:10:41 +08004166 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4167 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4168 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4169 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004170}
4171// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07004172// Then run second test where dynamic scissor count doesn't match PSO scissor
4173// count
4174TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
4175 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004176
Karl Schultz6addd812016-02-02 17:17:23 -07004177 m_errorMonitor->SetDesiredFailureMsg(
4178 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004179 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
4180
Tobin Ehlise68360f2015-10-01 11:15:13 -06004181 ASSERT_NO_FATAL_FAILURE(InitState());
4182 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004183
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004184 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004185 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4186 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004187
4188 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004189 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4190 ds_pool_ci.maxSets = 1;
4191 ds_pool_ci.poolSizeCount = 1;
4192 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004193
4194 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004195 err =
4196 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004197 ASSERT_VK_SUCCESS(err);
4198
4199 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004200 dsl_binding.binding = 0;
4201 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4202 dsl_binding.descriptorCount = 1;
4203 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004204
4205 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004206 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4207 ds_layout_ci.bindingCount = 1;
4208 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004209
4210 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004211 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4212 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004213 ASSERT_VK_SUCCESS(err);
4214
4215 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004216 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004217 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004218 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004219 alloc_info.descriptorPool = ds_pool;
4220 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004221 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4222 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004223 ASSERT_VK_SUCCESS(err);
4224
4225 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004226 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4227 pipeline_layout_ci.setLayoutCount = 1;
4228 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004229
4230 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004231 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4232 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004233 ASSERT_VK_SUCCESS(err);
4234
4235 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004236 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4237 vp_state_ci.viewportCount = 1;
4238 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
4239 vp_state_ci.scissorCount = 1;
4240 vp_state_ci.pScissors =
4241 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06004242
4243 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4244 // Set scissor as dynamic to avoid that error
4245 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004246 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4247 dyn_state_ci.dynamicStateCount = 1;
4248 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004249
Cody Northropeb3a6c12015-10-05 14:44:45 -06004250 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004251 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004252
Karl Schultz6addd812016-02-02 17:17:23 -07004253 VkShaderObj vs(m_device, bindStateVertShaderText,
4254 VK_SHADER_STAGE_VERTEX_BIT, this);
4255 VkShaderObj fs(m_device, bindStateFragShaderText,
4256 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004257 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004258 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004259 shaderStages[0] = vs.GetStageCreateInfo();
4260 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004261
Cody Northropf6622dc2015-10-06 10:33:21 -06004262 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4263 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4264 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004265 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004266 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004267 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004268 vi_ci.pVertexAttributeDescriptions = nullptr;
4269
4270 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4271 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4272 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4273
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004274 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004275 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06004276 rs_ci.pNext = nullptr;
4277
Mark Youngc89c6312016-03-31 16:03:20 -06004278 VkPipelineColorBlendAttachmentState att = {};
4279 att.blendEnable = VK_FALSE;
4280 att.colorWriteMask = 0xf;
4281
Cody Northropf6622dc2015-10-06 10:33:21 -06004282 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4283 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4284 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004285 cb_ci.attachmentCount = 1;
4286 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06004287
Tobin Ehlise68360f2015-10-01 11:15:13 -06004288 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004289 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4290 gp_ci.stageCount = 2;
4291 gp_ci.pStages = shaderStages;
4292 gp_ci.pVertexInputState = &vi_ci;
4293 gp_ci.pInputAssemblyState = &ia_ci;
4294 gp_ci.pViewportState = &vp_state_ci;
4295 gp_ci.pRasterizationState = &rs_ci;
4296 gp_ci.pColorBlendState = &cb_ci;
4297 gp_ci.pDynamicState = &dyn_state_ci;
4298 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4299 gp_ci.layout = pipeline_layout;
4300 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004301
4302 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004303 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004304
4305 VkPipeline pipeline;
4306 VkPipelineCache pipelineCache;
4307
Karl Schultz6addd812016-02-02 17:17:23 -07004308 err =
4309 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004310 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004311 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4312 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004313
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004314 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004315
Tobin Ehlisd332f282015-10-02 11:00:56 -06004316 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07004317 // First need to successfully create the PSO from above by setting
4318 // pViewports
4319 m_errorMonitor->SetDesiredFailureMsg(
4320 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4321 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
4322 "scissorCount is 1. These counts must match.");
4323
4324 VkViewport vp = {}; // Just need dummy vp to point to
4325 vp_state_ci.pViewports = &vp;
4326 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4327 &gp_ci, NULL, &pipeline);
4328 ASSERT_VK_SUCCESS(err);
4329 BeginCommandBuffer();
4330 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4331 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4332 VkRect2D scissors[2] = {}; // don't care about data
4333 // Count of 2 doesn't match PSO count of 1
4334 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
4335 Draw(1, 0, 0, 0);
4336
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004337 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004338
4339 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4340 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4341 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4342 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4343}
4344// Create PSO w/o non-zero scissorCount but no scissor data
4345// Then run second test where dynamic viewportCount doesn't match PSO
4346// viewportCount
4347TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
4348 VkResult err;
4349
4350 m_errorMonitor->SetDesiredFailureMsg(
4351 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4352 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
4353
4354 ASSERT_NO_FATAL_FAILURE(InitState());
4355 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4356
4357 VkDescriptorPoolSize ds_type_count = {};
4358 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4359 ds_type_count.descriptorCount = 1;
4360
4361 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4362 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4363 ds_pool_ci.maxSets = 1;
4364 ds_pool_ci.poolSizeCount = 1;
4365 ds_pool_ci.pPoolSizes = &ds_type_count;
4366
4367 VkDescriptorPool ds_pool;
4368 err =
4369 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4370 ASSERT_VK_SUCCESS(err);
4371
4372 VkDescriptorSetLayoutBinding dsl_binding = {};
4373 dsl_binding.binding = 0;
4374 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4375 dsl_binding.descriptorCount = 1;
4376 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4377
4378 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4379 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4380 ds_layout_ci.bindingCount = 1;
4381 ds_layout_ci.pBindings = &dsl_binding;
4382
4383 VkDescriptorSetLayout ds_layout;
4384 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4385 &ds_layout);
4386 ASSERT_VK_SUCCESS(err);
4387
4388 VkDescriptorSet descriptorSet;
4389 VkDescriptorSetAllocateInfo alloc_info = {};
4390 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4391 alloc_info.descriptorSetCount = 1;
4392 alloc_info.descriptorPool = ds_pool;
4393 alloc_info.pSetLayouts = &ds_layout;
4394 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4395 &descriptorSet);
4396 ASSERT_VK_SUCCESS(err);
4397
4398 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4399 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4400 pipeline_layout_ci.setLayoutCount = 1;
4401 pipeline_layout_ci.pSetLayouts = &ds_layout;
4402
4403 VkPipelineLayout pipeline_layout;
4404 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4405 &pipeline_layout);
4406 ASSERT_VK_SUCCESS(err);
4407
4408 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4409 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4410 vp_state_ci.scissorCount = 1;
4411 vp_state_ci.pScissors =
4412 NULL; // Null scissor w/ count of 1 should cause error
4413 vp_state_ci.viewportCount = 1;
4414 vp_state_ci.pViewports =
4415 NULL; // vp is dynamic (below) so this won't cause error
4416
4417 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
4418 // Set scissor as dynamic to avoid that error
4419 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4420 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4421 dyn_state_ci.dynamicStateCount = 1;
4422 dyn_state_ci.pDynamicStates = &vp_state;
4423
4424 VkPipelineShaderStageCreateInfo shaderStages[2];
4425 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4426
4427 VkShaderObj vs(m_device, bindStateVertShaderText,
4428 VK_SHADER_STAGE_VERTEX_BIT, this);
4429 VkShaderObj fs(m_device, bindStateFragShaderText,
4430 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004431 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004432 // but add it to be able to run on more devices
4433 shaderStages[0] = vs.GetStageCreateInfo();
4434 shaderStages[1] = fs.GetStageCreateInfo();
4435
4436 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4437 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4438 vi_ci.pNext = nullptr;
4439 vi_ci.vertexBindingDescriptionCount = 0;
4440 vi_ci.pVertexBindingDescriptions = nullptr;
4441 vi_ci.vertexAttributeDescriptionCount = 0;
4442 vi_ci.pVertexAttributeDescriptions = nullptr;
4443
4444 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4445 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4446 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4447
4448 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4449 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4450 rs_ci.pNext = nullptr;
4451
Mark Youngc89c6312016-03-31 16:03:20 -06004452 VkPipelineColorBlendAttachmentState att = {};
4453 att.blendEnable = VK_FALSE;
4454 att.colorWriteMask = 0xf;
4455
Karl Schultz6addd812016-02-02 17:17:23 -07004456 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4457 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4458 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004459 cb_ci.attachmentCount = 1;
4460 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004461
4462 VkGraphicsPipelineCreateInfo gp_ci = {};
4463 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4464 gp_ci.stageCount = 2;
4465 gp_ci.pStages = shaderStages;
4466 gp_ci.pVertexInputState = &vi_ci;
4467 gp_ci.pInputAssemblyState = &ia_ci;
4468 gp_ci.pViewportState = &vp_state_ci;
4469 gp_ci.pRasterizationState = &rs_ci;
4470 gp_ci.pColorBlendState = &cb_ci;
4471 gp_ci.pDynamicState = &dyn_state_ci;
4472 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4473 gp_ci.layout = pipeline_layout;
4474 gp_ci.renderPass = renderPass();
4475
4476 VkPipelineCacheCreateInfo pc_ci = {};
4477 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4478
4479 VkPipeline pipeline;
4480 VkPipelineCache pipelineCache;
4481
4482 err =
4483 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4484 ASSERT_VK_SUCCESS(err);
4485 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4486 &gp_ci, NULL, &pipeline);
4487
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004488 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004489
4490 // Now hit second fail case where we set scissor w/ different count than PSO
4491 // First need to successfully create the PSO from above by setting
4492 // pViewports
4493 m_errorMonitor->SetDesiredFailureMsg(
4494 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4495 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4496 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004497
Tobin Ehlisd332f282015-10-02 11:00:56 -06004498 VkRect2D sc = {}; // Just need dummy vp to point to
4499 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004500 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4501 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004502 ASSERT_VK_SUCCESS(err);
4503 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004504 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4505 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004506 VkViewport viewports[2] = {}; // don't care about data
4507 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004508 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004509 Draw(1, 0, 0, 0);
4510
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004511 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004512
Chia-I Wuf7458c52015-10-26 21:10:41 +08004513 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4514 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4515 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4516 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004517}
4518
Mark Young7394fdd2016-03-31 14:56:43 -06004519TEST_F(VkLayerTest, PSOLineWidthInvalid) {
4520 VkResult err;
4521
4522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004523 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004524
4525 ASSERT_NO_FATAL_FAILURE(InitState());
4526 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4527
4528 VkDescriptorPoolSize ds_type_count = {};
4529 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4530 ds_type_count.descriptorCount = 1;
4531
4532 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4533 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4534 ds_pool_ci.maxSets = 1;
4535 ds_pool_ci.poolSizeCount = 1;
4536 ds_pool_ci.pPoolSizes = &ds_type_count;
4537
4538 VkDescriptorPool ds_pool;
4539 err =
4540 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4541 ASSERT_VK_SUCCESS(err);
4542
4543 VkDescriptorSetLayoutBinding dsl_binding = {};
4544 dsl_binding.binding = 0;
4545 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4546 dsl_binding.descriptorCount = 1;
4547 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4548
4549 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4550 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4551 ds_layout_ci.bindingCount = 1;
4552 ds_layout_ci.pBindings = &dsl_binding;
4553
4554 VkDescriptorSetLayout ds_layout;
4555 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4556 &ds_layout);
4557 ASSERT_VK_SUCCESS(err);
4558
4559 VkDescriptorSet descriptorSet;
4560 VkDescriptorSetAllocateInfo alloc_info = {};
4561 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4562 alloc_info.descriptorSetCount = 1;
4563 alloc_info.descriptorPool = ds_pool;
4564 alloc_info.pSetLayouts = &ds_layout;
4565 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4566 &descriptorSet);
4567 ASSERT_VK_SUCCESS(err);
4568
4569 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4570 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4571 pipeline_layout_ci.setLayoutCount = 1;
4572 pipeline_layout_ci.pSetLayouts = &ds_layout;
4573
4574 VkPipelineLayout pipeline_layout;
4575 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4576 &pipeline_layout);
4577 ASSERT_VK_SUCCESS(err);
4578
4579 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4580 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4581 vp_state_ci.scissorCount = 1;
4582 vp_state_ci.pScissors = NULL;
4583 vp_state_ci.viewportCount = 1;
4584 vp_state_ci.pViewports = NULL;
4585
4586 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
4587 VK_DYNAMIC_STATE_SCISSOR,
4588 VK_DYNAMIC_STATE_LINE_WIDTH};
4589 // Set scissor as dynamic to avoid that error
4590 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4591 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4592 dyn_state_ci.dynamicStateCount = 2;
4593 dyn_state_ci.pDynamicStates = dynamic_states;
4594
4595 VkPipelineShaderStageCreateInfo shaderStages[2];
4596 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4597
4598 VkShaderObj vs(m_device, bindStateVertShaderText,
4599 VK_SHADER_STAGE_VERTEX_BIT, this);
4600 VkShaderObj fs(m_device, bindStateFragShaderText,
4601 VK_SHADER_STAGE_FRAGMENT_BIT,
4602 this); // TODO - We shouldn't need a fragment shader
4603 // but add it to be able to run on more devices
4604 shaderStages[0] = vs.GetStageCreateInfo();
4605 shaderStages[1] = fs.GetStageCreateInfo();
4606
4607 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4608 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4609 vi_ci.pNext = nullptr;
4610 vi_ci.vertexBindingDescriptionCount = 0;
4611 vi_ci.pVertexBindingDescriptions = nullptr;
4612 vi_ci.vertexAttributeDescriptionCount = 0;
4613 vi_ci.pVertexAttributeDescriptions = nullptr;
4614
4615 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4616 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4617 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4618
4619 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4620 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4621 rs_ci.pNext = nullptr;
4622
Mark Young47107952016-05-02 15:59:55 -06004623 // Check too low (line width of -1.0f).
4624 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06004625
4626 VkPipelineColorBlendAttachmentState att = {};
4627 att.blendEnable = VK_FALSE;
4628 att.colorWriteMask = 0xf;
4629
4630 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4631 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4632 cb_ci.pNext = nullptr;
4633 cb_ci.attachmentCount = 1;
4634 cb_ci.pAttachments = &att;
4635
4636 VkGraphicsPipelineCreateInfo gp_ci = {};
4637 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4638 gp_ci.stageCount = 2;
4639 gp_ci.pStages = shaderStages;
4640 gp_ci.pVertexInputState = &vi_ci;
4641 gp_ci.pInputAssemblyState = &ia_ci;
4642 gp_ci.pViewportState = &vp_state_ci;
4643 gp_ci.pRasterizationState = &rs_ci;
4644 gp_ci.pColorBlendState = &cb_ci;
4645 gp_ci.pDynamicState = &dyn_state_ci;
4646 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4647 gp_ci.layout = pipeline_layout;
4648 gp_ci.renderPass = renderPass();
4649
4650 VkPipelineCacheCreateInfo pc_ci = {};
4651 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4652
4653 VkPipeline pipeline;
4654 VkPipelineCache pipelineCache;
4655
4656 err =
4657 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4658 ASSERT_VK_SUCCESS(err);
4659 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4660 &gp_ci, NULL, &pipeline);
4661
4662 m_errorMonitor->VerifyFound();
4663
4664 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4665 "Attempt to set lineWidth to 65536");
4666
4667 // Check too high (line width of 65536.0f).
4668 rs_ci.lineWidth = 65536.0f;
4669
4670 err =
4671 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4672 ASSERT_VK_SUCCESS(err);
4673 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4674 &gp_ci, NULL, &pipeline);
4675
4676 m_errorMonitor->VerifyFound();
4677
4678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004679 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004680
4681 dyn_state_ci.dynamicStateCount = 3;
4682
4683 rs_ci.lineWidth = 1.0f;
4684
4685 err =
4686 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4687 ASSERT_VK_SUCCESS(err);
4688 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4689 &gp_ci, NULL, &pipeline);
4690 BeginCommandBuffer();
4691 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4692 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4693
4694 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06004695 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06004696 m_errorMonitor->VerifyFound();
4697
4698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4699 "Attempt to set lineWidth to 65536");
4700
4701 // Check too high with dynamic setting.
4702 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
4703 m_errorMonitor->VerifyFound();
4704 EndCommandBuffer();
4705
4706 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4707 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4708 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4709 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4710}
4711
Karl Schultz6addd812016-02-02 17:17:23 -07004712TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004713 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004714 m_errorMonitor->SetDesiredFailureMsg(
4715 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004716 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004717
4718 ASSERT_NO_FATAL_FAILURE(InitState());
4719 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004720
Tony Barbourfe3351b2015-07-28 10:17:20 -06004721 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004722 // Don't care about RenderPass handle b/c error should be flagged before
4723 // that
4724 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
4725 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004726
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004727 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004728}
4729
Karl Schultz6addd812016-02-02 17:17:23 -07004730TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004731 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004732 m_errorMonitor->SetDesiredFailureMsg(
4733 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004734 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004735
4736 ASSERT_NO_FATAL_FAILURE(InitState());
4737 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004738
Tony Barbourfe3351b2015-07-28 10:17:20 -06004739 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004740 // Just create a dummy Renderpass that's non-NULL so we can get to the
4741 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06004742 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004743 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4744 rp_begin.pNext = NULL;
4745 rp_begin.renderPass = renderPass();
4746 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004747
Karl Schultz6addd812016-02-02 17:17:23 -07004748 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
4749 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004750
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004751 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004752}
4753
Karl Schultz6addd812016-02-02 17:17:23 -07004754TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004755 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004756 m_errorMonitor->SetDesiredFailureMsg(
4757 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004758 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004759
4760 ASSERT_NO_FATAL_FAILURE(InitState());
4761 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004762
4763 // Renderpass is started here
4764 BeginCommandBuffer();
4765
4766 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004767 vk_testing::Buffer dstBuffer;
4768 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004769
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004770 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004771
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004772 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004773}
4774
Karl Schultz6addd812016-02-02 17:17:23 -07004775TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004776 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004777 m_errorMonitor->SetDesiredFailureMsg(
4778 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004779 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004780
4781 ASSERT_NO_FATAL_FAILURE(InitState());
4782 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004783
4784 // Renderpass is started here
4785 BeginCommandBuffer();
4786
4787 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004788 vk_testing::Buffer dstBuffer;
4789 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004790
Karl Schultz6addd812016-02-02 17:17:23 -07004791 VkDeviceSize dstOffset = 0;
4792 VkDeviceSize dataSize = 1024;
4793 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004794
Karl Schultz6addd812016-02-02 17:17:23 -07004795 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
4796 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004797
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004798 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004799}
4800
Karl Schultz6addd812016-02-02 17:17:23 -07004801TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004802 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004803 m_errorMonitor->SetDesiredFailureMsg(
4804 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004805 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004806
4807 ASSERT_NO_FATAL_FAILURE(InitState());
4808 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004809
4810 // Renderpass is started here
4811 BeginCommandBuffer();
4812
Michael Lentine0a369f62016-02-03 16:51:46 -06004813 VkClearColorValue clear_color;
4814 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07004815 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
4816 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4817 const int32_t tex_width = 32;
4818 const int32_t tex_height = 32;
4819 VkImageCreateInfo image_create_info = {};
4820 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4821 image_create_info.pNext = NULL;
4822 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4823 image_create_info.format = tex_format;
4824 image_create_info.extent.width = tex_width;
4825 image_create_info.extent.height = tex_height;
4826 image_create_info.extent.depth = 1;
4827 image_create_info.mipLevels = 1;
4828 image_create_info.arrayLayers = 1;
4829 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4830 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4831 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004832
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004833 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004834 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4835 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004836
Karl Schultz6addd812016-02-02 17:17:23 -07004837 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4838 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004839
Karl Schultz6addd812016-02-02 17:17:23 -07004840 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4841 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004842
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004843 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004844}
4845
Karl Schultz6addd812016-02-02 17:17:23 -07004846TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004847 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004848 m_errorMonitor->SetDesiredFailureMsg(
4849 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004850 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004851
4852 ASSERT_NO_FATAL_FAILURE(InitState());
4853 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004854
4855 // Renderpass is started here
4856 BeginCommandBuffer();
4857
4858 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07004859 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004860 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
4861 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4862 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
4863 image_create_info.extent.width = 64;
4864 image_create_info.extent.height = 64;
4865 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4866 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004867
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004868 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004869 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4870 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004871
Karl Schultz6addd812016-02-02 17:17:23 -07004872 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4873 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004874
Karl Schultz6addd812016-02-02 17:17:23 -07004875 vkCmdClearDepthStencilImage(
4876 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4877 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
4878 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004879
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004880 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004881}
4882
Karl Schultz6addd812016-02-02 17:17:23 -07004883TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004884 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004885 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004886
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004888 "vkCmdClearAttachments: This call "
4889 "must be issued inside an active "
4890 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004891
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004892 ASSERT_NO_FATAL_FAILURE(InitState());
4893 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004894
4895 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004896 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004897 ASSERT_VK_SUCCESS(err);
4898
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004899 VkClearAttachment color_attachment;
4900 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4901 color_attachment.clearValue.color.float32[0] = 0;
4902 color_attachment.clearValue.color.float32[1] = 0;
4903 color_attachment.clearValue.color.float32[2] = 0;
4904 color_attachment.clearValue.color.float32[3] = 0;
4905 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004906 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
4907 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4908 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004909
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004910 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004911}
4912
Karl Schultz9e66a292016-04-21 15:57:51 -06004913TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
4914 // Try to add a buffer memory barrier with no buffer.
4915 m_errorMonitor->SetDesiredFailureMsg(
4916 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4917 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
4918
4919 ASSERT_NO_FATAL_FAILURE(InitState());
4920 BeginCommandBuffer();
4921
4922 VkBufferMemoryBarrier buf_barrier = {};
4923 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
4924 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4925 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4926 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4927 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4928 buf_barrier.buffer = VK_NULL_HANDLE;
4929 buf_barrier.offset = 0;
4930 buf_barrier.size = VK_WHOLE_SIZE;
4931 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4932 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
4933 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
4934
4935 m_errorMonitor->VerifyFound();
4936}
4937
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06004938TEST_F(VkLayerTest, InvalidBarriers) {
4939 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
4940
4941 m_errorMonitor->SetDesiredFailureMsg(
4942 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
4943
4944 ASSERT_NO_FATAL_FAILURE(InitState());
4945 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4946
4947 VkMemoryBarrier mem_barrier = {};
4948 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
4949 mem_barrier.pNext = NULL;
4950 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4951 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4952 BeginCommandBuffer();
4953 // BeginCommandBuffer() starts a render pass
4954 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4955 VK_PIPELINE_STAGE_HOST_BIT,
4956 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
4957 &mem_barrier, 0, nullptr, 0, nullptr);
4958 m_errorMonitor->VerifyFound();
4959
4960 m_errorMonitor->SetDesiredFailureMsg(
4961 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4962 "Image Layout cannot be transitioned to UNDEFINED");
4963 VkImageObj image(m_device);
4964 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
4965 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4966 ASSERT_TRUE(image.initialized());
4967 VkImageMemoryBarrier img_barrier = {};
4968 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4969 img_barrier.pNext = NULL;
4970 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4971 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4972 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
4973 // New layout can't be UNDEFINED
4974 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4975 img_barrier.image = image.handle();
4976 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4977 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4978 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4979 img_barrier.subresourceRange.baseArrayLayer = 0;
4980 img_barrier.subresourceRange.baseMipLevel = 0;
4981 img_barrier.subresourceRange.layerCount = 1;
4982 img_barrier.subresourceRange.levelCount = 1;
4983 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4984 VK_PIPELINE_STAGE_HOST_BIT,
4985 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
4986 nullptr, 1, &img_barrier);
4987 m_errorMonitor->VerifyFound();
4988 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
4989
4990 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4991 "Subresource must have the sum of the "
4992 "baseArrayLayer");
4993 // baseArrayLayer + layerCount must be <= image's arrayLayers
4994 img_barrier.subresourceRange.baseArrayLayer = 1;
4995 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4996 VK_PIPELINE_STAGE_HOST_BIT,
4997 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
4998 nullptr, 1, &img_barrier);
4999 m_errorMonitor->VerifyFound();
5000 img_barrier.subresourceRange.baseArrayLayer = 0;
5001
5002 m_errorMonitor->SetDesiredFailureMsg(
5003 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5004 "Subresource must have the sum of the baseMipLevel");
5005 // baseMipLevel + levelCount must be <= image's mipLevels
5006 img_barrier.subresourceRange.baseMipLevel = 1;
5007 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5008 VK_PIPELINE_STAGE_HOST_BIT,
5009 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5010 nullptr, 1, &img_barrier);
5011 m_errorMonitor->VerifyFound();
5012 img_barrier.subresourceRange.baseMipLevel = 0;
5013
5014 m_errorMonitor->SetDesiredFailureMsg(
5015 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5016 "Buffer Barriers cannot be used during a render pass");
5017 vk_testing::Buffer buffer;
5018 buffer.init(*m_device, 256);
5019 VkBufferMemoryBarrier buf_barrier = {};
5020 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5021 buf_barrier.pNext = NULL;
5022 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5023 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5024 buf_barrier.buffer = buffer.handle();
5025 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5026 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5027 buf_barrier.offset = 0;
5028 buf_barrier.size = VK_WHOLE_SIZE;
5029 // Can't send buffer barrier during a render pass
5030 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5031 VK_PIPELINE_STAGE_HOST_BIT,
5032 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5033 &buf_barrier, 0, nullptr);
5034 m_errorMonitor->VerifyFound();
5035 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
5036
5037 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5038 "which is not less than total size");
5039 buf_barrier.offset = 257;
5040 // Offset greater than total size
5041 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5042 VK_PIPELINE_STAGE_HOST_BIT,
5043 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5044 &buf_barrier, 0, nullptr);
5045 m_errorMonitor->VerifyFound();
5046 buf_barrier.offset = 0;
5047
5048 m_errorMonitor->SetDesiredFailureMsg(
5049 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
5050 buf_barrier.size = 257;
5051 // Size greater than total size
5052 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5053 VK_PIPELINE_STAGE_HOST_BIT,
5054 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5055 &buf_barrier, 0, nullptr);
5056 m_errorMonitor->VerifyFound();
5057 buf_barrier.size = VK_WHOLE_SIZE;
5058
5059 m_errorMonitor->SetDesiredFailureMsg(
5060 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5061 "Image is a depth and stencil format and thus must "
5062 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
5063 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
5064 VkDepthStencilObj ds_image(m_device);
5065 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
5066 ASSERT_TRUE(ds_image.initialized());
5067 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5068 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
5069 img_barrier.image = ds_image.handle();
5070 // Leave aspectMask at COLOR on purpose
5071 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5072 VK_PIPELINE_STAGE_HOST_BIT,
5073 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5074 nullptr, 1, &img_barrier);
5075 m_errorMonitor->VerifyFound();
5076}
5077
Karl Schultz6addd812016-02-02 17:17:23 -07005078TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005079 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005080 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005081
Karl Schultz6addd812016-02-02 17:17:23 -07005082 m_errorMonitor->SetDesiredFailureMsg(
5083 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005084 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
5085
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005086 ASSERT_NO_FATAL_FAILURE(InitState());
5087 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005088 uint32_t qfi = 0;
5089 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005090 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5091 buffCI.size = 1024;
5092 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5093 buffCI.queueFamilyIndexCount = 1;
5094 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005095
5096 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005097 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005098 ASSERT_VK_SUCCESS(err);
5099
5100 BeginCommandBuffer();
5101 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005102 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5103 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005104 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07005105 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
5106 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005107
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005108 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005109
Chia-I Wuf7458c52015-10-26 21:10:41 +08005110 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005111}
5112
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005113TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
5114 // Create an out-of-range queueFamilyIndex
5115 m_errorMonitor->SetDesiredFailureMsg(
5116 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06005117 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005118
5119 ASSERT_NO_FATAL_FAILURE(InitState());
5120 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5121 VkBufferCreateInfo buffCI = {};
5122 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5123 buffCI.size = 1024;
5124 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5125 buffCI.queueFamilyIndexCount = 1;
5126 // Introduce failure by specifying invalid queue_family_index
5127 uint32_t qfi = 777;
5128 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06005129 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005130
5131 VkBuffer ib;
5132 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
5133
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005134 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005135}
5136
Karl Schultz6addd812016-02-02 17:17:23 -07005137TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
5138 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
5139 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005140
Karl Schultz6addd812016-02-02 17:17:23 -07005141 m_errorMonitor->SetDesiredFailureMsg(
5142 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005143 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005144
5145 ASSERT_NO_FATAL_FAILURE(InitState());
5146 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005147
5148 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005149 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005150 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
5151 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005152
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005153 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005154}
5155
Karl Schultz6addd812016-02-02 17:17:23 -07005156TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005157 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07005158 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005159
Karl Schultz6addd812016-02-02 17:17:23 -07005160 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005161 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5162 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
5163 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005164
Tobin Ehlis3b780662015-05-28 12:11:26 -06005165 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005166 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005167 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005168 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5169 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005170
5171 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005172 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5173 ds_pool_ci.pNext = NULL;
5174 ds_pool_ci.maxSets = 1;
5175 ds_pool_ci.poolSizeCount = 1;
5176 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005177
Tobin Ehlis3b780662015-05-28 12:11:26 -06005178 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005179 err =
5180 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005181 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005182 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005183 dsl_binding.binding = 0;
5184 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5185 dsl_binding.descriptorCount = 1;
5186 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5187 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005188
Tony Barboureb254902015-07-15 12:50:33 -06005189 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005190 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5191 ds_layout_ci.pNext = NULL;
5192 ds_layout_ci.bindingCount = 1;
5193 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005194
Tobin Ehlis3b780662015-05-28 12:11:26 -06005195 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005196 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5197 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005198 ASSERT_VK_SUCCESS(err);
5199
5200 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005201 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005202 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005203 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005204 alloc_info.descriptorPool = ds_pool;
5205 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005206 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5207 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005208 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005209
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005210 VkSamplerCreateInfo sampler_ci = {};
5211 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5212 sampler_ci.pNext = NULL;
5213 sampler_ci.magFilter = VK_FILTER_NEAREST;
5214 sampler_ci.minFilter = VK_FILTER_NEAREST;
5215 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5216 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5217 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5218 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5219 sampler_ci.mipLodBias = 1.0;
5220 sampler_ci.anisotropyEnable = VK_FALSE;
5221 sampler_ci.maxAnisotropy = 1;
5222 sampler_ci.compareEnable = VK_FALSE;
5223 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5224 sampler_ci.minLod = 1.0;
5225 sampler_ci.maxLod = 1.0;
5226 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5227 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5228 VkSampler sampler;
5229 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5230 ASSERT_VK_SUCCESS(err);
5231
5232 VkDescriptorImageInfo info = {};
5233 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005234
5235 VkWriteDescriptorSet descriptor_write;
5236 memset(&descriptor_write, 0, sizeof(descriptor_write));
5237 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005238 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005239 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005240 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005241 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005242 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005243
5244 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5245
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005246 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005247
Chia-I Wuf7458c52015-10-26 21:10:41 +08005248 vkDestroySampler(m_device->device(), sampler, NULL);
5249 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5250 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005251}
5252
Karl Schultz6addd812016-02-02 17:17:23 -07005253TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005254 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07005255 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005256
Karl Schultz6addd812016-02-02 17:17:23 -07005257 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005258 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5259 " binding #0 with 1 total descriptors but update of 1 descriptors "
5260 "starting at binding offset of 0 combined with update array element "
5261 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005262
Tobin Ehlis3b780662015-05-28 12:11:26 -06005263 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005264 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005265 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005266 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5267 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005268
5269 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005270 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5271 ds_pool_ci.pNext = NULL;
5272 ds_pool_ci.maxSets = 1;
5273 ds_pool_ci.poolSizeCount = 1;
5274 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005275
Tobin Ehlis3b780662015-05-28 12:11:26 -06005276 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005277 err =
5278 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005279 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005280
Tony Barboureb254902015-07-15 12:50:33 -06005281 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005282 dsl_binding.binding = 0;
5283 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5284 dsl_binding.descriptorCount = 1;
5285 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5286 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005287
5288 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005289 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5290 ds_layout_ci.pNext = NULL;
5291 ds_layout_ci.bindingCount = 1;
5292 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005293
Tobin Ehlis3b780662015-05-28 12:11:26 -06005294 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005295 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5296 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005297 ASSERT_VK_SUCCESS(err);
5298
5299 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005300 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005301 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005302 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005303 alloc_info.descriptorPool = ds_pool;
5304 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005305 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5306 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005307 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005308
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005309 // Correctly update descriptor to avoid "NOT_UPDATED" error
5310 VkDescriptorBufferInfo buff_info = {};
5311 buff_info.buffer =
5312 VkBuffer(0); // Don't care about buffer handle for this test
5313 buff_info.offset = 0;
5314 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005315
5316 VkWriteDescriptorSet descriptor_write;
5317 memset(&descriptor_write, 0, sizeof(descriptor_write));
5318 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005319 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005320 descriptor_write.dstArrayElement =
5321 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08005322 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005323 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5324 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005325
5326 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5327
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005328 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005329
Chia-I Wuf7458c52015-10-26 21:10:41 +08005330 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5331 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005332}
5333
Karl Schultz6addd812016-02-02 17:17:23 -07005334TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
5335 // Create layout w/ count of 1 and attempt update to that layout w/ binding
5336 // index 2
5337 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005338
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5340 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005341
Tobin Ehlis3b780662015-05-28 12:11:26 -06005342 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005343 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005344 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005345 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5346 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005347
5348 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005349 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5350 ds_pool_ci.pNext = NULL;
5351 ds_pool_ci.maxSets = 1;
5352 ds_pool_ci.poolSizeCount = 1;
5353 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005354
Tobin Ehlis3b780662015-05-28 12:11:26 -06005355 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005356 err =
5357 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005358 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005359
Tony Barboureb254902015-07-15 12:50:33 -06005360 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005361 dsl_binding.binding = 0;
5362 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5363 dsl_binding.descriptorCount = 1;
5364 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5365 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005366
5367 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005368 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5369 ds_layout_ci.pNext = NULL;
5370 ds_layout_ci.bindingCount = 1;
5371 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005372 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005373 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5374 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005375 ASSERT_VK_SUCCESS(err);
5376
5377 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005378 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005379 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005380 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005381 alloc_info.descriptorPool = ds_pool;
5382 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005383 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5384 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005385 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005386
Tony Barboureb254902015-07-15 12:50:33 -06005387 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005388 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5389 sampler_ci.pNext = NULL;
5390 sampler_ci.magFilter = VK_FILTER_NEAREST;
5391 sampler_ci.minFilter = VK_FILTER_NEAREST;
5392 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5393 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5394 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5395 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5396 sampler_ci.mipLodBias = 1.0;
5397 sampler_ci.anisotropyEnable = VK_FALSE;
5398 sampler_ci.maxAnisotropy = 1;
5399 sampler_ci.compareEnable = VK_FALSE;
5400 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5401 sampler_ci.minLod = 1.0;
5402 sampler_ci.maxLod = 1.0;
5403 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5404 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005405
Tobin Ehlis3b780662015-05-28 12:11:26 -06005406 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005407 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005408 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005409
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005410 VkDescriptorImageInfo info = {};
5411 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005412
5413 VkWriteDescriptorSet descriptor_write;
5414 memset(&descriptor_write, 0, sizeof(descriptor_write));
5415 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005416 descriptor_write.dstSet = descriptorSet;
5417 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005418 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005419 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005420 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005421 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005422
5423 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5424
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005425 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005426
Chia-I Wuf7458c52015-10-26 21:10:41 +08005427 vkDestroySampler(m_device->device(), sampler, NULL);
5428 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5429 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005430}
5431
Karl Schultz6addd812016-02-02 17:17:23 -07005432TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
5433 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
5434 // types
5435 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005436
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005438 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005439
Tobin Ehlis3b780662015-05-28 12:11:26 -06005440 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005441
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005442 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005443 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5444 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005445
5446 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005447 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5448 ds_pool_ci.pNext = NULL;
5449 ds_pool_ci.maxSets = 1;
5450 ds_pool_ci.poolSizeCount = 1;
5451 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005452
Tobin Ehlis3b780662015-05-28 12:11:26 -06005453 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005454 err =
5455 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005456 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005457 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005458 dsl_binding.binding = 0;
5459 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5460 dsl_binding.descriptorCount = 1;
5461 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5462 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005463
Tony Barboureb254902015-07-15 12:50:33 -06005464 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005465 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5466 ds_layout_ci.pNext = NULL;
5467 ds_layout_ci.bindingCount = 1;
5468 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005469
Tobin Ehlis3b780662015-05-28 12:11:26 -06005470 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005471 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5472 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005473 ASSERT_VK_SUCCESS(err);
5474
5475 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005476 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005477 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005478 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005479 alloc_info.descriptorPool = ds_pool;
5480 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005481 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5482 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005483 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005484
Tony Barboureb254902015-07-15 12:50:33 -06005485 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005486 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5487 sampler_ci.pNext = NULL;
5488 sampler_ci.magFilter = VK_FILTER_NEAREST;
5489 sampler_ci.minFilter = VK_FILTER_NEAREST;
5490 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5491 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5492 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5493 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5494 sampler_ci.mipLodBias = 1.0;
5495 sampler_ci.anisotropyEnable = VK_FALSE;
5496 sampler_ci.maxAnisotropy = 1;
5497 sampler_ci.compareEnable = VK_FALSE;
5498 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5499 sampler_ci.minLod = 1.0;
5500 sampler_ci.maxLod = 1.0;
5501 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5502 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005503 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005504 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005505 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005506
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005507 VkDescriptorImageInfo info = {};
5508 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005509
5510 VkWriteDescriptorSet descriptor_write;
5511 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07005512 descriptor_write.sType =
5513 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005514 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005515 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005516 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005517 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005518 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005519
5520 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5521
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005522 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005523
Chia-I Wuf7458c52015-10-26 21:10:41 +08005524 vkDestroySampler(m_device->device(), sampler, NULL);
5525 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5526 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005527}
5528
Karl Schultz6addd812016-02-02 17:17:23 -07005529TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005530 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07005531 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005532
Karl Schultz6addd812016-02-02 17:17:23 -07005533 m_errorMonitor->SetDesiredFailureMsg(
5534 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005535 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005536
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005537 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005538 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
5539 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005540 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005541 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
5542 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005543
5544 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005545 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5546 ds_pool_ci.pNext = NULL;
5547 ds_pool_ci.maxSets = 1;
5548 ds_pool_ci.poolSizeCount = 1;
5549 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005550
5551 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005552 err =
5553 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005554 ASSERT_VK_SUCCESS(err);
5555
5556 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005557 dsl_binding.binding = 0;
5558 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5559 dsl_binding.descriptorCount = 1;
5560 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5561 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005562
5563 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005564 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5565 ds_layout_ci.pNext = NULL;
5566 ds_layout_ci.bindingCount = 1;
5567 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005568 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005569 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5570 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005571 ASSERT_VK_SUCCESS(err);
5572
5573 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005574 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005575 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005576 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005577 alloc_info.descriptorPool = ds_pool;
5578 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005579 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5580 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005581 ASSERT_VK_SUCCESS(err);
5582
Karl Schultz6addd812016-02-02 17:17:23 -07005583 VkSampler sampler =
5584 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005585
5586 VkDescriptorImageInfo descriptor_info;
5587 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5588 descriptor_info.sampler = sampler;
5589
5590 VkWriteDescriptorSet descriptor_write;
5591 memset(&descriptor_write, 0, sizeof(descriptor_write));
5592 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005593 descriptor_write.dstSet = descriptorSet;
5594 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005595 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005596 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5597 descriptor_write.pImageInfo = &descriptor_info;
5598
5599 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5600
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005601 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005602
Chia-I Wuf7458c52015-10-26 21:10:41 +08005603 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5604 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005605}
5606
Karl Schultz6addd812016-02-02 17:17:23 -07005607TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
5608 // Create a single combined Image/Sampler descriptor and send it an invalid
5609 // imageView
5610 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005611
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005612 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5613 "Attempted write update to combined "
5614 "image sampler descriptor failed due "
5615 "to: Invalid VkImageView: 0xbaadbeef");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005616
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005617 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005618 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005619 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5620 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005621
5622 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005623 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5624 ds_pool_ci.pNext = NULL;
5625 ds_pool_ci.maxSets = 1;
5626 ds_pool_ci.poolSizeCount = 1;
5627 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005628
5629 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005630 err =
5631 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005632 ASSERT_VK_SUCCESS(err);
5633
5634 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005635 dsl_binding.binding = 0;
5636 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5637 dsl_binding.descriptorCount = 1;
5638 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5639 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005640
5641 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005642 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5643 ds_layout_ci.pNext = NULL;
5644 ds_layout_ci.bindingCount = 1;
5645 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005646 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005647 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5648 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005649 ASSERT_VK_SUCCESS(err);
5650
5651 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005652 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005653 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005654 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005655 alloc_info.descriptorPool = ds_pool;
5656 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005657 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5658 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005659 ASSERT_VK_SUCCESS(err);
5660
5661 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005662 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5663 sampler_ci.pNext = NULL;
5664 sampler_ci.magFilter = VK_FILTER_NEAREST;
5665 sampler_ci.minFilter = VK_FILTER_NEAREST;
5666 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5667 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5668 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5669 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5670 sampler_ci.mipLodBias = 1.0;
5671 sampler_ci.anisotropyEnable = VK_FALSE;
5672 sampler_ci.maxAnisotropy = 1;
5673 sampler_ci.compareEnable = VK_FALSE;
5674 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5675 sampler_ci.minLod = 1.0;
5676 sampler_ci.maxLod = 1.0;
5677 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5678 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005679
5680 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005681 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005682 ASSERT_VK_SUCCESS(err);
5683
Karl Schultz6addd812016-02-02 17:17:23 -07005684 VkImageView view =
5685 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005686
5687 VkDescriptorImageInfo descriptor_info;
5688 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5689 descriptor_info.sampler = sampler;
5690 descriptor_info.imageView = view;
5691
5692 VkWriteDescriptorSet descriptor_write;
5693 memset(&descriptor_write, 0, sizeof(descriptor_write));
5694 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005695 descriptor_write.dstSet = descriptorSet;
5696 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005697 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005698 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5699 descriptor_write.pImageInfo = &descriptor_info;
5700
5701 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5702
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005703 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005704
Chia-I Wuf7458c52015-10-26 21:10:41 +08005705 vkDestroySampler(m_device->device(), sampler, NULL);
5706 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5707 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005708}
5709
Karl Schultz6addd812016-02-02 17:17:23 -07005710TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
5711 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
5712 // into the other
5713 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005714
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5716 " binding #1 with type "
5717 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
5718 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005719
Tobin Ehlis04356f92015-10-27 16:35:27 -06005720 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005721 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005722 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005723 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5724 ds_type_count[0].descriptorCount = 1;
5725 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
5726 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005727
5728 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005729 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5730 ds_pool_ci.pNext = NULL;
5731 ds_pool_ci.maxSets = 1;
5732 ds_pool_ci.poolSizeCount = 2;
5733 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005734
5735 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005736 err =
5737 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005738 ASSERT_VK_SUCCESS(err);
5739 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005740 dsl_binding[0].binding = 0;
5741 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5742 dsl_binding[0].descriptorCount = 1;
5743 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
5744 dsl_binding[0].pImmutableSamplers = NULL;
5745 dsl_binding[1].binding = 1;
5746 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5747 dsl_binding[1].descriptorCount = 1;
5748 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
5749 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005750
5751 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005752 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5753 ds_layout_ci.pNext = NULL;
5754 ds_layout_ci.bindingCount = 2;
5755 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005756
5757 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005758 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5759 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005760 ASSERT_VK_SUCCESS(err);
5761
5762 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005763 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005764 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005765 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005766 alloc_info.descriptorPool = ds_pool;
5767 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005768 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5769 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005770 ASSERT_VK_SUCCESS(err);
5771
5772 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005773 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5774 sampler_ci.pNext = NULL;
5775 sampler_ci.magFilter = VK_FILTER_NEAREST;
5776 sampler_ci.minFilter = VK_FILTER_NEAREST;
5777 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5778 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5779 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5780 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5781 sampler_ci.mipLodBias = 1.0;
5782 sampler_ci.anisotropyEnable = VK_FALSE;
5783 sampler_ci.maxAnisotropy = 1;
5784 sampler_ci.compareEnable = VK_FALSE;
5785 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5786 sampler_ci.minLod = 1.0;
5787 sampler_ci.maxLod = 1.0;
5788 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5789 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005790
5791 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005792 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005793 ASSERT_VK_SUCCESS(err);
5794
5795 VkDescriptorImageInfo info = {};
5796 info.sampler = sampler;
5797
5798 VkWriteDescriptorSet descriptor_write;
5799 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
5800 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005801 descriptor_write.dstSet = descriptorSet;
5802 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08005803 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005804 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5805 descriptor_write.pImageInfo = &info;
5806 // This write update should succeed
5807 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5808 // Now perform a copy update that fails due to type mismatch
5809 VkCopyDescriptorSet copy_ds_update;
5810 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5811 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5812 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06005813 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005814 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005815 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08005816 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005817 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5818
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005819 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005820 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005821 m_errorMonitor->SetDesiredFailureMsg(
5822 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005823 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06005824 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5825 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5826 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005827 copy_ds_update.srcBinding =
5828 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005829 copy_ds_update.dstSet = descriptorSet;
5830 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06005831 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005832 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5833
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005834 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005835
Tobin Ehlis04356f92015-10-27 16:35:27 -06005836 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005837 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005838 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
5839 "update array offset of 0 and update of "
5840 "5 descriptors oversteps total number "
5841 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005842
Tobin Ehlis04356f92015-10-27 16:35:27 -06005843 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5844 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5845 copy_ds_update.srcSet = descriptorSet;
5846 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005847 copy_ds_update.dstSet = descriptorSet;
5848 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005849 copy_ds_update.descriptorCount =
5850 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06005851 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5852
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005853 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005854
Chia-I Wuf7458c52015-10-26 21:10:41 +08005855 vkDestroySampler(m_device->device(), sampler, NULL);
5856 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5857 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005858}
5859
Karl Schultz6addd812016-02-02 17:17:23 -07005860TEST_F(VkLayerTest, NumSamplesMismatch) {
5861 // Create CommandBuffer where MSAA samples doesn't match RenderPass
5862 // sampleCount
5863 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005864
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005866 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005867
Tobin Ehlis3b780662015-05-28 12:11:26 -06005868 ASSERT_NO_FATAL_FAILURE(InitState());
5869 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005870 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06005871 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005872 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005873
5874 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005875 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5876 ds_pool_ci.pNext = NULL;
5877 ds_pool_ci.maxSets = 1;
5878 ds_pool_ci.poolSizeCount = 1;
5879 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005880
Tobin Ehlis3b780662015-05-28 12:11:26 -06005881 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005882 err =
5883 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005884 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005885
Tony Barboureb254902015-07-15 12:50:33 -06005886 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08005887 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06005888 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08005889 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005890 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5891 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005892
Tony Barboureb254902015-07-15 12:50:33 -06005893 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5894 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5895 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005896 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07005897 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005898
Tobin Ehlis3b780662015-05-28 12:11:26 -06005899 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005900 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5901 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005902 ASSERT_VK_SUCCESS(err);
5903
5904 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005905 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005906 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005907 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005908 alloc_info.descriptorPool = ds_pool;
5909 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005910 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5911 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005912 ASSERT_VK_SUCCESS(err);
5913
Tony Barboureb254902015-07-15 12:50:33 -06005914 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005915 pipe_ms_state_ci.sType =
5916 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5917 pipe_ms_state_ci.pNext = NULL;
5918 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5919 pipe_ms_state_ci.sampleShadingEnable = 0;
5920 pipe_ms_state_ci.minSampleShading = 1.0;
5921 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005922
Tony Barboureb254902015-07-15 12:50:33 -06005923 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005924 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5925 pipeline_layout_ci.pNext = NULL;
5926 pipeline_layout_ci.setLayoutCount = 1;
5927 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005928
5929 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005930 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5931 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005932 ASSERT_VK_SUCCESS(err);
5933
Karl Schultz6addd812016-02-02 17:17:23 -07005934 VkShaderObj vs(m_device, bindStateVertShaderText,
5935 VK_SHADER_STAGE_VERTEX_BIT, this);
5936 VkShaderObj fs(m_device, bindStateFragShaderText,
5937 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005938 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005939 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005940 VkPipelineObj pipe(m_device);
5941 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005942 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005943 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005944 pipe.SetMSAA(&pipe_ms_state_ci);
5945 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005946
Tony Barbourfe3351b2015-07-28 10:17:20 -06005947 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005948 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5949 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005950
Mark Young29927482016-05-04 14:38:51 -06005951 // Render triangle (the error should trigger on the attempt to draw).
5952 Draw(3, 1, 0, 0);
5953
5954 // Finalize recording of the command buffer
5955 EndCommandBuffer();
5956
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005957 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005958
Chia-I Wuf7458c52015-10-26 21:10:41 +08005959 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5960 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5961 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005962}
Mark Young29927482016-05-04 14:38:51 -06005963
Mark Youngc89c6312016-03-31 16:03:20 -06005964TEST_F(VkLayerTest, NumBlendAttachMismatch) {
5965 // Create Pipeline where the number of blend attachments doesn't match the
5966 // number of color attachments. In this case, we don't add any color
5967 // blend attachments even though we have a color attachment.
5968 VkResult err;
5969
5970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -06005971 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06005972
5973 ASSERT_NO_FATAL_FAILURE(InitState());
5974 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5975 VkDescriptorPoolSize ds_type_count = {};
5976 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5977 ds_type_count.descriptorCount = 1;
5978
5979 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5980 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5981 ds_pool_ci.pNext = NULL;
5982 ds_pool_ci.maxSets = 1;
5983 ds_pool_ci.poolSizeCount = 1;
5984 ds_pool_ci.pPoolSizes = &ds_type_count;
5985
5986 VkDescriptorPool ds_pool;
5987 err =
5988 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5989 ASSERT_VK_SUCCESS(err);
5990
5991 VkDescriptorSetLayoutBinding dsl_binding = {};
5992 dsl_binding.binding = 0;
5993 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5994 dsl_binding.descriptorCount = 1;
5995 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5996 dsl_binding.pImmutableSamplers = NULL;
5997
5998 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5999 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6000 ds_layout_ci.pNext = NULL;
6001 ds_layout_ci.bindingCount = 1;
6002 ds_layout_ci.pBindings = &dsl_binding;
6003
6004 VkDescriptorSetLayout ds_layout;
6005 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6006 &ds_layout);
6007 ASSERT_VK_SUCCESS(err);
6008
6009 VkDescriptorSet descriptorSet;
6010 VkDescriptorSetAllocateInfo alloc_info = {};
6011 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6012 alloc_info.descriptorSetCount = 1;
6013 alloc_info.descriptorPool = ds_pool;
6014 alloc_info.pSetLayouts = &ds_layout;
6015 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6016 &descriptorSet);
6017 ASSERT_VK_SUCCESS(err);
6018
6019 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
6020 pipe_ms_state_ci.sType =
6021 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6022 pipe_ms_state_ci.pNext = NULL;
6023 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6024 pipe_ms_state_ci.sampleShadingEnable = 0;
6025 pipe_ms_state_ci.minSampleShading = 1.0;
6026 pipe_ms_state_ci.pSampleMask = NULL;
6027
6028 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6029 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6030 pipeline_layout_ci.pNext = NULL;
6031 pipeline_layout_ci.setLayoutCount = 1;
6032 pipeline_layout_ci.pSetLayouts = &ds_layout;
6033
6034 VkPipelineLayout pipeline_layout;
6035 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6036 &pipeline_layout);
6037 ASSERT_VK_SUCCESS(err);
6038
6039 VkShaderObj vs(m_device, bindStateVertShaderText,
6040 VK_SHADER_STAGE_VERTEX_BIT, this);
6041 VkShaderObj fs(m_device, bindStateFragShaderText,
6042 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006043 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06006044 // but add it to be able to run on more devices
6045 VkPipelineObj pipe(m_device);
6046 pipe.AddShader(&vs);
6047 pipe.AddShader(&fs);
6048 pipe.SetMSAA(&pipe_ms_state_ci);
6049 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6050
6051 BeginCommandBuffer();
6052 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6053 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6054
Mark Young29927482016-05-04 14:38:51 -06006055 // Render triangle (the error should trigger on the attempt to draw).
6056 Draw(3, 1, 0, 0);
6057
6058 // Finalize recording of the command buffer
6059 EndCommandBuffer();
6060
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006061 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06006062
6063 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6064 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6065 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6066}
Mark Young29927482016-05-04 14:38:51 -06006067
Karl Schultz6addd812016-02-02 17:17:23 -07006068TEST_F(VkLayerTest, ClearCmdNoDraw) {
6069 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
6070 // to issuing a Draw
6071 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006072
Karl Schultz6addd812016-02-02 17:17:23 -07006073 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07006074 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006075 "vkCmdClearAttachments() issued on CB object ");
6076
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006077 ASSERT_NO_FATAL_FAILURE(InitState());
6078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006079
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006080 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006081 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6082 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006083
6084 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006085 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6086 ds_pool_ci.pNext = NULL;
6087 ds_pool_ci.maxSets = 1;
6088 ds_pool_ci.poolSizeCount = 1;
6089 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006090
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006091 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006092 err =
6093 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006094 ASSERT_VK_SUCCESS(err);
6095
Tony Barboureb254902015-07-15 12:50:33 -06006096 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006097 dsl_binding.binding = 0;
6098 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6099 dsl_binding.descriptorCount = 1;
6100 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6101 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006102
Tony Barboureb254902015-07-15 12:50:33 -06006103 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006104 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6105 ds_layout_ci.pNext = NULL;
6106 ds_layout_ci.bindingCount = 1;
6107 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006108
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006109 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006110 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6111 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006112 ASSERT_VK_SUCCESS(err);
6113
6114 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006115 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006116 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006117 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006118 alloc_info.descriptorPool = ds_pool;
6119 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006120 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6121 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006122 ASSERT_VK_SUCCESS(err);
6123
Tony Barboureb254902015-07-15 12:50:33 -06006124 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006125 pipe_ms_state_ci.sType =
6126 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6127 pipe_ms_state_ci.pNext = NULL;
6128 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6129 pipe_ms_state_ci.sampleShadingEnable = 0;
6130 pipe_ms_state_ci.minSampleShading = 1.0;
6131 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006132
Tony Barboureb254902015-07-15 12:50:33 -06006133 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006134 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6135 pipeline_layout_ci.pNext = NULL;
6136 pipeline_layout_ci.setLayoutCount = 1;
6137 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006138
6139 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006140 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6141 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006142 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006143
Karl Schultz6addd812016-02-02 17:17:23 -07006144 VkShaderObj vs(m_device, bindStateVertShaderText,
6145 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006146 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006147 // on more devices
6148 VkShaderObj fs(m_device, bindStateFragShaderText,
6149 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006150
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006151 VkPipelineObj pipe(m_device);
6152 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006153 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006154 pipe.SetMSAA(&pipe_ms_state_ci);
6155 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006156
6157 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006158
Karl Schultz6addd812016-02-02 17:17:23 -07006159 // Main thing we care about for this test is that the VkImage obj we're
6160 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006161 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006162 VkClearAttachment color_attachment;
6163 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6164 color_attachment.clearValue.color.float32[0] = 1.0;
6165 color_attachment.clearValue.color.float32[1] = 1.0;
6166 color_attachment.clearValue.color.float32[2] = 1.0;
6167 color_attachment.clearValue.color.float32[3] = 1.0;
6168 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006169 VkClearRect clear_rect = {
6170 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006171
Karl Schultz6addd812016-02-02 17:17:23 -07006172 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
6173 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006174
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006175 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006176
Chia-I Wuf7458c52015-10-26 21:10:41 +08006177 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6178 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6179 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006180}
6181
Karl Schultz6addd812016-02-02 17:17:23 -07006182TEST_F(VkLayerTest, VtxBufferBadIndex) {
6183 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006184
Karl Schultz6addd812016-02-02 17:17:23 -07006185 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006186 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07006187 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006188
Tobin Ehlis502480b2015-06-24 15:53:07 -06006189 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06006190 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06006191 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006192
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006193 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006194 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6195 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006196
6197 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006198 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6199 ds_pool_ci.pNext = NULL;
6200 ds_pool_ci.maxSets = 1;
6201 ds_pool_ci.poolSizeCount = 1;
6202 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006203
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006204 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006205 err =
6206 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006207 ASSERT_VK_SUCCESS(err);
6208
Tony Barboureb254902015-07-15 12:50:33 -06006209 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006210 dsl_binding.binding = 0;
6211 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6212 dsl_binding.descriptorCount = 1;
6213 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6214 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006215
Tony Barboureb254902015-07-15 12:50:33 -06006216 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006217 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6218 ds_layout_ci.pNext = NULL;
6219 ds_layout_ci.bindingCount = 1;
6220 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006221
Tobin Ehlis502480b2015-06-24 15:53:07 -06006222 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006223 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6224 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006225 ASSERT_VK_SUCCESS(err);
6226
6227 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006228 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006229 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006230 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006231 alloc_info.descriptorPool = ds_pool;
6232 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006233 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6234 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006235 ASSERT_VK_SUCCESS(err);
6236
Tony Barboureb254902015-07-15 12:50:33 -06006237 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006238 pipe_ms_state_ci.sType =
6239 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6240 pipe_ms_state_ci.pNext = NULL;
6241 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6242 pipe_ms_state_ci.sampleShadingEnable = 0;
6243 pipe_ms_state_ci.minSampleShading = 1.0;
6244 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006245
Tony Barboureb254902015-07-15 12:50:33 -06006246 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006247 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6248 pipeline_layout_ci.pNext = NULL;
6249 pipeline_layout_ci.setLayoutCount = 1;
6250 pipeline_layout_ci.pSetLayouts = &ds_layout;
6251 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006252
Karl Schultz6addd812016-02-02 17:17:23 -07006253 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6254 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006255 ASSERT_VK_SUCCESS(err);
6256
Karl Schultz6addd812016-02-02 17:17:23 -07006257 VkShaderObj vs(m_device, bindStateVertShaderText,
6258 VK_SHADER_STAGE_VERTEX_BIT, this);
6259 VkShaderObj fs(m_device, bindStateFragShaderText,
6260 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006261 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006262 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006263 VkPipelineObj pipe(m_device);
6264 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006265 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006266 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006267 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006268 pipe.SetViewport(m_viewports);
6269 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006270 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006271
6272 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006273 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6274 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006275 // Don't care about actual data, just need to get to draw to flag error
6276 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07006277 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
6278 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006279 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06006280 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006281
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006282 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006283
Chia-I Wuf7458c52015-10-26 21:10:41 +08006284 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6285 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6286 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006287}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006288#endif // DRAW_STATE_TESTS
6289
Tobin Ehlis0788f522015-05-26 16:11:58 -06006290#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06006291#if GTEST_IS_THREADSAFE
6292struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006293 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006294 VkEvent event;
6295 bool bailout;
6296};
6297
Karl Schultz6addd812016-02-02 17:17:23 -07006298extern "C" void *AddToCommandBuffer(void *arg) {
6299 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006300
Karl Schultz6addd812016-02-02 17:17:23 -07006301 for (int i = 0; i < 10000; i++) {
6302 vkCmdSetEvent(data->commandBuffer, data->event,
6303 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006304 if (data->bailout) {
6305 break;
6306 }
6307 }
6308 return NULL;
6309}
6310
Karl Schultz6addd812016-02-02 17:17:23 -07006311TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006312 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006313
Karl Schultz6addd812016-02-02 17:17:23 -07006314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6315 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006316
Mike Stroyanaccf7692015-05-12 16:00:45 -06006317 ASSERT_NO_FATAL_FAILURE(InitState());
6318 ASSERT_NO_FATAL_FAILURE(InitViewport());
6319 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6320
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006321 // Calls AllocateCommandBuffers
6322 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006323
6324 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006325 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006326
6327 VkEventCreateInfo event_info;
6328 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006329 VkResult err;
6330
6331 memset(&event_info, 0, sizeof(event_info));
6332 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6333
Chia-I Wuf7458c52015-10-26 21:10:41 +08006334 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006335 ASSERT_VK_SUCCESS(err);
6336
Mike Stroyanaccf7692015-05-12 16:00:45 -06006337 err = vkResetEvent(device(), event);
6338 ASSERT_VK_SUCCESS(err);
6339
6340 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006341 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006342 data.event = event;
6343 data.bailout = false;
6344 m_errorMonitor->SetBailout(&data.bailout);
6345 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006346 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006347 // Add many entries to command buffer from this thread at the same time.
6348 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006349
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006350 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006351 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006352
Mike Stroyan10b8cb72016-01-22 15:22:03 -07006353 m_errorMonitor->SetBailout(NULL);
6354
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006355 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006356
Chia-I Wuf7458c52015-10-26 21:10:41 +08006357 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006358}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006359#endif // GTEST_IS_THREADSAFE
6360#endif // THREADING_TESTS
6361
Chris Forbes9f7ff632015-05-25 11:13:08 +12006362#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006363TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006365 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006366
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006367 ASSERT_NO_FATAL_FAILURE(InitState());
6368 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6369
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006370 VkShaderModule module;
6371 VkShaderModuleCreateInfo moduleCreateInfo;
6372 struct icd_spv_header spv;
6373
6374 spv.magic = ICD_SPV_MAGIC;
6375 spv.version = ICD_SPV_VERSION;
6376 spv.gen_magic = 0;
6377
6378 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6379 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006380 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006381 moduleCreateInfo.codeSize = 4;
6382 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006383 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006384
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006385 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006386}
6387
Karl Schultz6addd812016-02-02 17:17:23 -07006388TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006389 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006390 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006391
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006392 ASSERT_NO_FATAL_FAILURE(InitState());
6393 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6394
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006395 VkShaderModule module;
6396 VkShaderModuleCreateInfo moduleCreateInfo;
6397 struct icd_spv_header spv;
6398
6399 spv.magic = ~ICD_SPV_MAGIC;
6400 spv.version = ICD_SPV_VERSION;
6401 spv.gen_magic = 0;
6402
6403 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6404 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006405 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006406 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6407 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006408 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006409
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006410 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006411}
6412
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006413#if 0
6414// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07006415TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006416 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006417 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006418
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006419 ASSERT_NO_FATAL_FAILURE(InitState());
6420 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6421
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006422 VkShaderModule module;
6423 VkShaderModuleCreateInfo moduleCreateInfo;
6424 struct icd_spv_header spv;
6425
6426 spv.magic = ICD_SPV_MAGIC;
6427 spv.version = ~ICD_SPV_VERSION;
6428 spv.gen_magic = 0;
6429
6430 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6431 moduleCreateInfo.pNext = NULL;
6432
Karl Schultz6addd812016-02-02 17:17:23 -07006433 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006434 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6435 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006436 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006437
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006438 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006439}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006440#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006441
Karl Schultz6addd812016-02-02 17:17:23 -07006442TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006444 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006445
Chris Forbes9f7ff632015-05-25 11:13:08 +12006446 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006447 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006448
6449 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006450 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006451 "\n"
6452 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006453 "out gl_PerVertex {\n"
6454 " vec4 gl_Position;\n"
6455 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006456 "void main(){\n"
6457 " gl_Position = vec4(1);\n"
6458 " x = 0;\n"
6459 "}\n";
6460 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006461 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006462 "\n"
6463 "layout(location=0) out vec4 color;\n"
6464 "void main(){\n"
6465 " color = vec4(1);\n"
6466 "}\n";
6467
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006468 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6469 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006470
6471 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006472 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006473 pipe.AddShader(&vs);
6474 pipe.AddShader(&fs);
6475
Chris Forbes9f7ff632015-05-25 11:13:08 +12006476 VkDescriptorSetObj descriptorSet(m_device);
6477 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006478 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006479
Tony Barbour5781e8f2015-08-04 16:23:11 -06006480 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006481
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006482 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006483}
Chris Forbes9f7ff632015-05-25 11:13:08 +12006484
Karl Schultz6addd812016-02-02 17:17:23 -07006485TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006487 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006488
Chris Forbes59cb88d2015-05-25 11:13:13 +12006489 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006490 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006491
6492 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006493 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006494 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006495 "out gl_PerVertex {\n"
6496 " vec4 gl_Position;\n"
6497 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006498 "void main(){\n"
6499 " gl_Position = vec4(1);\n"
6500 "}\n";
6501 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006502 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006503 "\n"
6504 "layout(location=0) in float x;\n"
6505 "layout(location=0) out vec4 color;\n"
6506 "void main(){\n"
6507 " color = vec4(x);\n"
6508 "}\n";
6509
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006510 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6511 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006512
6513 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006514 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006515 pipe.AddShader(&vs);
6516 pipe.AddShader(&fs);
6517
Chris Forbes59cb88d2015-05-25 11:13:13 +12006518 VkDescriptorSetObj descriptorSet(m_device);
6519 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006520 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006521
Tony Barbour5781e8f2015-08-04 16:23:11 -06006522 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006523
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006524 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006525}
6526
Karl Schultz6addd812016-02-02 17:17:23 -07006527TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006529 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006530
6531 ASSERT_NO_FATAL_FAILURE(InitState());
6532 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6533
6534 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006535 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006536 "\n"
6537 "out gl_PerVertex {\n"
6538 " vec4 gl_Position;\n"
6539 "};\n"
6540 "void main(){\n"
6541 " gl_Position = vec4(1);\n"
6542 "}\n";
6543 char const *fsSource =
6544 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006545 "\n"
6546 "in block { layout(location=0) float x; } ins;\n"
6547 "layout(location=0) out vec4 color;\n"
6548 "void main(){\n"
6549 " color = vec4(ins.x);\n"
6550 "}\n";
6551
6552 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6553 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6554
6555 VkPipelineObj pipe(m_device);
6556 pipe.AddColorAttachment();
6557 pipe.AddShader(&vs);
6558 pipe.AddShader(&fs);
6559
6560 VkDescriptorSetObj descriptorSet(m_device);
6561 descriptorSet.AppendDummy();
6562 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6563
6564 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6565
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006566 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006567}
6568
Karl Schultz6addd812016-02-02 17:17:23 -07006569TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13006570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13006571 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07006572 "output arr[2] of float32' vs 'ptr to "
6573 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13006574
6575 ASSERT_NO_FATAL_FAILURE(InitState());
6576 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6577
6578 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006579 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006580 "\n"
6581 "layout(location=0) out float x[2];\n"
6582 "out gl_PerVertex {\n"
6583 " vec4 gl_Position;\n"
6584 "};\n"
6585 "void main(){\n"
6586 " x[0] = 0; x[1] = 0;\n"
6587 " gl_Position = vec4(1);\n"
6588 "}\n";
6589 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006590 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006591 "\n"
6592 "layout(location=0) in float x[3];\n"
6593 "layout(location=0) out vec4 color;\n"
6594 "void main(){\n"
6595 " color = vec4(x[0] + x[1] + x[2]);\n"
6596 "}\n";
6597
6598 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6599 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6600
6601 VkPipelineObj pipe(m_device);
6602 pipe.AddColorAttachment();
6603 pipe.AddShader(&vs);
6604 pipe.AddShader(&fs);
6605
6606 VkDescriptorSetObj descriptorSet(m_device);
6607 descriptorSet.AppendDummy();
6608 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6609
6610 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6611
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006612 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13006613}
6614
Karl Schultz6addd812016-02-02 17:17:23 -07006615TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006617 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006618
Chris Forbesb56af562015-05-25 11:13:17 +12006619 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006620 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12006621
6622 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006623 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006624 "\n"
6625 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006626 "out gl_PerVertex {\n"
6627 " vec4 gl_Position;\n"
6628 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006629 "void main(){\n"
6630 " x = 0;\n"
6631 " gl_Position = vec4(1);\n"
6632 "}\n";
6633 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006634 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006635 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006636 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12006637 "layout(location=0) out vec4 color;\n"
6638 "void main(){\n"
6639 " color = vec4(x);\n"
6640 "}\n";
6641
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006642 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6643 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12006644
6645 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006646 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12006647 pipe.AddShader(&vs);
6648 pipe.AddShader(&fs);
6649
Chris Forbesb56af562015-05-25 11:13:17 +12006650 VkDescriptorSetObj descriptorSet(m_device);
6651 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006652 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12006653
Tony Barbour5781e8f2015-08-04 16:23:11 -06006654 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12006655
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006656 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12006657}
6658
Karl Schultz6addd812016-02-02 17:17:23 -07006659TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006661 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006662
6663 ASSERT_NO_FATAL_FAILURE(InitState());
6664 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6665
6666 char const *vsSource =
6667 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006668 "\n"
6669 "out block { layout(location=0) int x; } outs;\n"
6670 "out gl_PerVertex {\n"
6671 " vec4 gl_Position;\n"
6672 "};\n"
6673 "void main(){\n"
6674 " outs.x = 0;\n"
6675 " gl_Position = vec4(1);\n"
6676 "}\n";
6677 char const *fsSource =
6678 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006679 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006680 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13006681 "layout(location=0) out vec4 color;\n"
6682 "void main(){\n"
6683 " color = vec4(ins.x);\n"
6684 "}\n";
6685
6686 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6687 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6688
6689 VkPipelineObj pipe(m_device);
6690 pipe.AddColorAttachment();
6691 pipe.AddShader(&vs);
6692 pipe.AddShader(&fs);
6693
6694 VkDescriptorSetObj descriptorSet(m_device);
6695 descriptorSet.AppendDummy();
6696 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6697
6698 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6699
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006700 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006701}
6702
6703TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
6704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6705 "location 0.0 which is not written by vertex shader");
6706
6707 ASSERT_NO_FATAL_FAILURE(InitState());
6708 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6709
6710 char const *vsSource =
6711 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006712 "\n"
6713 "out block { layout(location=1) float x; } outs;\n"
6714 "out gl_PerVertex {\n"
6715 " vec4 gl_Position;\n"
6716 "};\n"
6717 "void main(){\n"
6718 " outs.x = 0;\n"
6719 " gl_Position = vec4(1);\n"
6720 "}\n";
6721 char const *fsSource =
6722 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006723 "\n"
6724 "in block { layout(location=0) float x; } ins;\n"
6725 "layout(location=0) out vec4 color;\n"
6726 "void main(){\n"
6727 " color = vec4(ins.x);\n"
6728 "}\n";
6729
6730 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6731 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6732
6733 VkPipelineObj pipe(m_device);
6734 pipe.AddColorAttachment();
6735 pipe.AddShader(&vs);
6736 pipe.AddShader(&fs);
6737
6738 VkDescriptorSetObj descriptorSet(m_device);
6739 descriptorSet.AppendDummy();
6740 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6741
6742 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6743
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006744 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006745}
6746
6747TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
6748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6749 "location 0.1 which is not written by vertex shader");
6750
6751 ASSERT_NO_FATAL_FAILURE(InitState());
6752 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6753
6754 char const *vsSource =
6755 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006756 "\n"
6757 "out block { layout(location=0, component=0) float x; } outs;\n"
6758 "out gl_PerVertex {\n"
6759 " vec4 gl_Position;\n"
6760 "};\n"
6761 "void main(){\n"
6762 " outs.x = 0;\n"
6763 " gl_Position = vec4(1);\n"
6764 "}\n";
6765 char const *fsSource =
6766 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006767 "\n"
6768 "in block { layout(location=0, component=1) float x; } ins;\n"
6769 "layout(location=0) out vec4 color;\n"
6770 "void main(){\n"
6771 " color = vec4(ins.x);\n"
6772 "}\n";
6773
6774 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6775 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6776
6777 VkPipelineObj pipe(m_device);
6778 pipe.AddColorAttachment();
6779 pipe.AddShader(&vs);
6780 pipe.AddShader(&fs);
6781
6782 VkDescriptorSetObj descriptorSet(m_device);
6783 descriptorSet.AppendDummy();
6784 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6785
6786 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6787
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006788 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006789}
6790
Karl Schultz6addd812016-02-02 17:17:23 -07006791TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006793 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006794
Chris Forbesde136e02015-05-25 11:13:28 +12006795 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006796 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12006797
6798 VkVertexInputBindingDescription input_binding;
6799 memset(&input_binding, 0, sizeof(input_binding));
6800
6801 VkVertexInputAttributeDescription input_attrib;
6802 memset(&input_attrib, 0, sizeof(input_attrib));
6803 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6804
6805 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006806 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006807 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006808 "out gl_PerVertex {\n"
6809 " vec4 gl_Position;\n"
6810 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006811 "void main(){\n"
6812 " gl_Position = vec4(1);\n"
6813 "}\n";
6814 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006815 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006816 "\n"
6817 "layout(location=0) out vec4 color;\n"
6818 "void main(){\n"
6819 " color = vec4(1);\n"
6820 "}\n";
6821
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006822 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6823 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12006824
6825 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006826 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12006827 pipe.AddShader(&vs);
6828 pipe.AddShader(&fs);
6829
6830 pipe.AddVertexInputBindings(&input_binding, 1);
6831 pipe.AddVertexInputAttribs(&input_attrib, 1);
6832
Chris Forbesde136e02015-05-25 11:13:28 +12006833 VkDescriptorSetObj descriptorSet(m_device);
6834 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006835 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12006836
Tony Barbour5781e8f2015-08-04 16:23:11 -06006837 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12006838
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006839 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12006840}
6841
Karl Schultz6addd812016-02-02 17:17:23 -07006842TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006844 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13006845
6846 ASSERT_NO_FATAL_FAILURE(InitState());
6847 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6848
6849 VkVertexInputBindingDescription input_binding;
6850 memset(&input_binding, 0, sizeof(input_binding));
6851
6852 VkVertexInputAttributeDescription input_attrib;
6853 memset(&input_attrib, 0, sizeof(input_attrib));
6854 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6855
6856 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006857 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006858 "\n"
6859 "layout(location=1) in float x;\n"
6860 "out gl_PerVertex {\n"
6861 " vec4 gl_Position;\n"
6862 "};\n"
6863 "void main(){\n"
6864 " gl_Position = vec4(x);\n"
6865 "}\n";
6866 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006867 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006868 "\n"
6869 "layout(location=0) out vec4 color;\n"
6870 "void main(){\n"
6871 " color = vec4(1);\n"
6872 "}\n";
6873
6874 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6875 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6876
6877 VkPipelineObj pipe(m_device);
6878 pipe.AddColorAttachment();
6879 pipe.AddShader(&vs);
6880 pipe.AddShader(&fs);
6881
6882 pipe.AddVertexInputBindings(&input_binding, 1);
6883 pipe.AddVertexInputAttribs(&input_attrib, 1);
6884
6885 VkDescriptorSetObj descriptorSet(m_device);
6886 descriptorSet.AppendDummy();
6887 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6888
6889 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6890
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006891 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13006892}
6893
Karl Schultz6addd812016-02-02 17:17:23 -07006894TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
6895 m_errorMonitor->SetDesiredFailureMsg(
6896 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006897 "VS consumes input at location 0 but not provided");
6898
Chris Forbes62e8e502015-05-25 11:13:29 +12006899 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006900 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12006901
6902 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006903 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006904 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006905 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07006906 "out gl_PerVertex {\n"
6907 " vec4 gl_Position;\n"
6908 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006909 "void main(){\n"
6910 " gl_Position = x;\n"
6911 "}\n";
6912 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006913 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006914 "\n"
6915 "layout(location=0) out vec4 color;\n"
6916 "void main(){\n"
6917 " color = vec4(1);\n"
6918 "}\n";
6919
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006920 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6921 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12006922
6923 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006924 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12006925 pipe.AddShader(&vs);
6926 pipe.AddShader(&fs);
6927
Chris Forbes62e8e502015-05-25 11:13:29 +12006928 VkDescriptorSetObj descriptorSet(m_device);
6929 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006930 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12006931
Tony Barbour5781e8f2015-08-04 16:23:11 -06006932 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12006933
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006934 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12006935}
6936
Karl Schultz6addd812016-02-02 17:17:23 -07006937TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
6938 m_errorMonitor->SetDesiredFailureMsg(
6939 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006940 "location 0 does not match VS input type");
6941
Chris Forbesc97d98e2015-05-25 11:13:31 +12006942 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006943 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006944
6945 VkVertexInputBindingDescription input_binding;
6946 memset(&input_binding, 0, sizeof(input_binding));
6947
6948 VkVertexInputAttributeDescription input_attrib;
6949 memset(&input_attrib, 0, sizeof(input_attrib));
6950 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6951
6952 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006953 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006954 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006955 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006956 "out gl_PerVertex {\n"
6957 " vec4 gl_Position;\n"
6958 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006959 "void main(){\n"
6960 " gl_Position = vec4(x);\n"
6961 "}\n";
6962 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006963 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006964 "\n"
6965 "layout(location=0) out vec4 color;\n"
6966 "void main(){\n"
6967 " color = vec4(1);\n"
6968 "}\n";
6969
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006970 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6971 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006972
6973 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006974 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006975 pipe.AddShader(&vs);
6976 pipe.AddShader(&fs);
6977
6978 pipe.AddVertexInputBindings(&input_binding, 1);
6979 pipe.AddVertexInputAttribs(&input_attrib, 1);
6980
Chris Forbesc97d98e2015-05-25 11:13:31 +12006981 VkDescriptorSetObj descriptorSet(m_device);
6982 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006983 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006984
Tony Barbour5781e8f2015-08-04 16:23:11 -06006985 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006986
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006987 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006988}
6989
Chris Forbesc68b43c2016-04-06 11:18:47 +12006990TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
6991 m_errorMonitor->SetDesiredFailureMsg(
6992 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6993 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
6994
6995 ASSERT_NO_FATAL_FAILURE(InitState());
6996 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6997
6998 char const *vsSource =
6999 "#version 450\n"
7000 "\n"
7001 "out gl_PerVertex {\n"
7002 " vec4 gl_Position;\n"
7003 "};\n"
7004 "void main(){\n"
7005 " gl_Position = vec4(1);\n"
7006 "}\n";
7007 char const *fsSource =
7008 "#version 450\n"
7009 "\n"
7010 "layout(location=0) out vec4 color;\n"
7011 "void main(){\n"
7012 " color = vec4(1);\n"
7013 "}\n";
7014
7015 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7016 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7017
7018 VkPipelineObj pipe(m_device);
7019 pipe.AddColorAttachment();
7020 pipe.AddShader(&vs);
7021 pipe.AddShader(&vs);
7022 pipe.AddShader(&fs);
7023
7024 VkDescriptorSetObj descriptorSet(m_device);
7025 descriptorSet.AppendDummy();
7026 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7027
7028 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7029
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007030 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12007031}
7032
Karl Schultz6addd812016-02-02 17:17:23 -07007033TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007034 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007035
7036 ASSERT_NO_FATAL_FAILURE(InitState());
7037 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7038
7039 VkVertexInputBindingDescription input_binding;
7040 memset(&input_binding, 0, sizeof(input_binding));
7041
7042 VkVertexInputAttributeDescription input_attribs[2];
7043 memset(input_attribs, 0, sizeof(input_attribs));
7044
7045 for (int i = 0; i < 2; i++) {
7046 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7047 input_attribs[i].location = i;
7048 }
7049
7050 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007051 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007052 "\n"
7053 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007054 "out gl_PerVertex {\n"
7055 " vec4 gl_Position;\n"
7056 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007057 "void main(){\n"
7058 " gl_Position = x[0] + x[1];\n"
7059 "}\n";
7060 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007061 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007062 "\n"
7063 "layout(location=0) out vec4 color;\n"
7064 "void main(){\n"
7065 " color = vec4(1);\n"
7066 "}\n";
7067
7068 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7069 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7070
7071 VkPipelineObj pipe(m_device);
7072 pipe.AddColorAttachment();
7073 pipe.AddShader(&vs);
7074 pipe.AddShader(&fs);
7075
7076 pipe.AddVertexInputBindings(&input_binding, 1);
7077 pipe.AddVertexInputAttribs(input_attribs, 2);
7078
7079 VkDescriptorSetObj descriptorSet(m_device);
7080 descriptorSet.AppendDummy();
7081 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7082
7083 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7084
7085 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007086 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007087}
7088
Chris Forbes2682b242015-11-24 11:13:14 +13007089TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
7090{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007091 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007092
7093 ASSERT_NO_FATAL_FAILURE(InitState());
7094 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7095
7096 VkVertexInputBindingDescription input_binding;
7097 memset(&input_binding, 0, sizeof(input_binding));
7098
7099 VkVertexInputAttributeDescription input_attribs[2];
7100 memset(input_attribs, 0, sizeof(input_attribs));
7101
7102 for (int i = 0; i < 2; i++) {
7103 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7104 input_attribs[i].location = i;
7105 }
7106
7107 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007108 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007109 "\n"
7110 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07007111 "out gl_PerVertex {\n"
7112 " vec4 gl_Position;\n"
7113 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007114 "void main(){\n"
7115 " gl_Position = x[0] + x[1];\n"
7116 "}\n";
7117 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007118 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007119 "\n"
7120 "layout(location=0) out vec4 color;\n"
7121 "void main(){\n"
7122 " color = vec4(1);\n"
7123 "}\n";
7124
7125 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7126 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7127
7128 VkPipelineObj pipe(m_device);
7129 pipe.AddColorAttachment();
7130 pipe.AddShader(&vs);
7131 pipe.AddShader(&fs);
7132
7133 pipe.AddVertexInputBindings(&input_binding, 1);
7134 pipe.AddVertexInputAttribs(input_attribs, 2);
7135
7136 VkDescriptorSetObj descriptorSet(m_device);
7137 descriptorSet.AppendDummy();
7138 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7139
7140 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7141
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007142 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007143}
Chris Forbes2682b242015-11-24 11:13:14 +13007144
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007145TEST_F(VkLayerTest, CreatePipelineSimplePositive)
7146{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007147 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007148
7149 ASSERT_NO_FATAL_FAILURE(InitState());
7150 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7151
7152 char const *vsSource =
7153 "#version 450\n"
7154 "out gl_PerVertex {\n"
7155 " vec4 gl_Position;\n"
7156 "};\n"
7157 "void main(){\n"
7158 " gl_Position = vec4(0);\n"
7159 "}\n";
7160 char const *fsSource =
7161 "#version 450\n"
7162 "\n"
7163 "layout(location=0) out vec4 color;\n"
7164 "void main(){\n"
7165 " color = vec4(1);\n"
7166 "}\n";
7167
7168 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7169 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7170
7171 VkPipelineObj pipe(m_device);
7172 pipe.AddColorAttachment();
7173 pipe.AddShader(&vs);
7174 pipe.AddShader(&fs);
7175
7176 VkDescriptorSetObj descriptorSet(m_device);
7177 descriptorSet.AppendDummy();
7178 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7179
7180 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7181
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007182 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007183}
7184
Chris Forbes912c9192016-04-05 17:50:35 +12007185TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
7186{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007187 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12007188
7189 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
7190
7191 ASSERT_NO_FATAL_FAILURE(InitState());
7192 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7193
7194 char const *vsSource =
7195 "#version 450\n"
7196 "out gl_PerVertex {\n"
7197 " vec4 gl_Position;\n"
7198 "};\n"
7199 "layout(location=0) out vec3 x;\n"
7200 "layout(location=1) out ivec3 y;\n"
7201 "layout(location=2) out vec3 z;\n"
7202 "void main(){\n"
7203 " gl_Position = vec4(0);\n"
7204 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
7205 "}\n";
7206 char const *fsSource =
7207 "#version 450\n"
7208 "\n"
7209 "layout(location=0) out vec4 color;\n"
7210 "layout(location=0) in float x;\n"
7211 "layout(location=1) flat in int y;\n"
7212 "layout(location=2) in vec2 z;\n"
7213 "void main(){\n"
7214 " color = vec4(1 + x + y + z.x);\n"
7215 "}\n";
7216
7217 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7218 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7219
7220 VkPipelineObj pipe(m_device);
7221 pipe.AddColorAttachment();
7222 pipe.AddShader(&vs);
7223 pipe.AddShader(&fs);
7224
7225 VkDescriptorSetObj descriptorSet(m_device);
7226 descriptorSet.AppendDummy();
7227 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7228
7229 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7230
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007231 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12007232}
7233
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007234TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
7235{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007236 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007237
7238 ASSERT_NO_FATAL_FAILURE(InitState());
7239 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7240
Chris Forbesc1e852d2016-04-04 19:26:42 +12007241 if (!m_device->phy().features().tessellationShader) {
7242 printf("Device does not support tessellation shaders; skipped.\n");
7243 return;
7244 }
7245
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007246 char const *vsSource =
7247 "#version 450\n"
7248 "void main(){}\n";
7249 char const *tcsSource =
7250 "#version 450\n"
7251 "layout(location=0) out int x[];\n"
7252 "layout(vertices=3) out;\n"
7253 "void main(){\n"
7254 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7255 " gl_TessLevelInner[0] = 1;\n"
7256 " x[gl_InvocationID] = gl_InvocationID;\n"
7257 "}\n";
7258 char const *tesSource =
7259 "#version 450\n"
7260 "layout(triangles, equal_spacing, cw) in;\n"
7261 "layout(location=0) in int x[];\n"
7262 "out gl_PerVertex { vec4 gl_Position; };\n"
7263 "void main(){\n"
7264 " gl_Position.xyz = gl_TessCoord;\n"
7265 " gl_Position.w = x[0] + x[1] + x[2];\n"
7266 "}\n";
7267 char const *fsSource =
7268 "#version 450\n"
7269 "layout(location=0) out vec4 color;\n"
7270 "void main(){\n"
7271 " color = vec4(1);\n"
7272 "}\n";
7273
7274 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7275 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7276 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7277 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7278
7279 VkPipelineInputAssemblyStateCreateInfo iasci{
7280 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7281 nullptr,
7282 0,
7283 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7284 VK_FALSE};
7285
Chris Forbesb4cacb62016-04-04 19:15:00 +12007286 VkPipelineTessellationStateCreateInfo tsci{
7287 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7288 nullptr,
7289 0,
7290 3};
7291
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007292 VkPipelineObj pipe(m_device);
7293 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12007294 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007295 pipe.AddColorAttachment();
7296 pipe.AddShader(&vs);
7297 pipe.AddShader(&tcs);
7298 pipe.AddShader(&tes);
7299 pipe.AddShader(&fs);
7300
7301 VkDescriptorSetObj descriptorSet(m_device);
7302 descriptorSet.AppendDummy();
7303 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7304
7305 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7306
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007307 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007308}
7309
Chris Forbesa0ab8152016-04-20 13:34:27 +12007310TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
7311{
7312 m_errorMonitor->ExpectSuccess();
7313
7314 ASSERT_NO_FATAL_FAILURE(InitState());
7315 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7316
7317 if (!m_device->phy().features().geometryShader) {
7318 printf("Device does not support geometry shaders; skipped.\n");
7319 return;
7320 }
7321
7322 char const *vsSource =
7323 "#version 450\n"
7324 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
7325 "void main(){\n"
7326 " vs_out.x = vec4(1);\n"
7327 "}\n";
7328 char const *gsSource =
7329 "#version 450\n"
7330 "layout(triangles) in;\n"
7331 "layout(triangle_strip, max_vertices=3) out;\n"
7332 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
7333 "out gl_PerVertex { vec4 gl_Position; };\n"
7334 "void main() {\n"
7335 " gl_Position = gs_in[0].x;\n"
7336 " EmitVertex();\n"
7337 "}\n";
7338 char const *fsSource =
7339 "#version 450\n"
7340 "layout(location=0) out vec4 color;\n"
7341 "void main(){\n"
7342 " color = vec4(1);\n"
7343 "}\n";
7344
7345 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7346 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
7347 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7348
7349 VkPipelineObj pipe(m_device);
7350 pipe.AddColorAttachment();
7351 pipe.AddShader(&vs);
7352 pipe.AddShader(&gs);
7353 pipe.AddShader(&fs);
7354
7355 VkDescriptorSetObj descriptorSet(m_device);
7356 descriptorSet.AppendDummy();
7357 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7358
7359 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7360
7361 m_errorMonitor->VerifyNotFound();
7362}
7363
Chris Forbesa0193bc2016-04-04 19:19:47 +12007364TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
7365{
7366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7367 "is per-vertex in tessellation control shader stage "
7368 "but per-patch in tessellation evaluation shader stage");
7369
7370 ASSERT_NO_FATAL_FAILURE(InitState());
7371 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7372
Chris Forbesc1e852d2016-04-04 19:26:42 +12007373 if (!m_device->phy().features().tessellationShader) {
7374 printf("Device does not support tessellation shaders; skipped.\n");
7375 return;
7376 }
7377
Chris Forbesa0193bc2016-04-04 19:19:47 +12007378 char const *vsSource =
7379 "#version 450\n"
7380 "void main(){}\n";
7381 char const *tcsSource =
7382 "#version 450\n"
7383 "layout(location=0) out int x[];\n"
7384 "layout(vertices=3) out;\n"
7385 "void main(){\n"
7386 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7387 " gl_TessLevelInner[0] = 1;\n"
7388 " x[gl_InvocationID] = gl_InvocationID;\n"
7389 "}\n";
7390 char const *tesSource =
7391 "#version 450\n"
7392 "layout(triangles, equal_spacing, cw) in;\n"
7393 "layout(location=0) patch in int x;\n"
7394 "out gl_PerVertex { vec4 gl_Position; };\n"
7395 "void main(){\n"
7396 " gl_Position.xyz = gl_TessCoord;\n"
7397 " gl_Position.w = x;\n"
7398 "}\n";
7399 char const *fsSource =
7400 "#version 450\n"
7401 "layout(location=0) out vec4 color;\n"
7402 "void main(){\n"
7403 " color = vec4(1);\n"
7404 "}\n";
7405
7406 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7407 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7408 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7409 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7410
7411 VkPipelineInputAssemblyStateCreateInfo iasci{
7412 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7413 nullptr,
7414 0,
7415 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7416 VK_FALSE};
7417
7418 VkPipelineTessellationStateCreateInfo tsci{
7419 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7420 nullptr,
7421 0,
7422 3};
7423
7424 VkPipelineObj pipe(m_device);
7425 pipe.SetInputAssembly(&iasci);
7426 pipe.SetTessellation(&tsci);
7427 pipe.AddColorAttachment();
7428 pipe.AddShader(&vs);
7429 pipe.AddShader(&tcs);
7430 pipe.AddShader(&tes);
7431 pipe.AddShader(&fs);
7432
7433 VkDescriptorSetObj descriptorSet(m_device);
7434 descriptorSet.AppendDummy();
7435 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7436
7437 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7438
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007439 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12007440}
7441
Karl Schultz6addd812016-02-02 17:17:23 -07007442TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
7443 m_errorMonitor->SetDesiredFailureMsg(
7444 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007445 "Duplicate vertex input binding descriptions for binding 0");
7446
Chris Forbes280ba2c2015-06-12 11:16:41 +12007447 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007448 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007449
7450 /* Two binding descriptions for binding 0 */
7451 VkVertexInputBindingDescription input_bindings[2];
7452 memset(input_bindings, 0, sizeof(input_bindings));
7453
7454 VkVertexInputAttributeDescription input_attrib;
7455 memset(&input_attrib, 0, sizeof(input_attrib));
7456 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7457
7458 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007459 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007460 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007461 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007462 "out gl_PerVertex {\n"
7463 " vec4 gl_Position;\n"
7464 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007465 "void main(){\n"
7466 " gl_Position = vec4(x);\n"
7467 "}\n";
7468 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007469 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007470 "\n"
7471 "layout(location=0) out vec4 color;\n"
7472 "void main(){\n"
7473 " color = vec4(1);\n"
7474 "}\n";
7475
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007476 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7477 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007478
7479 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007480 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007481 pipe.AddShader(&vs);
7482 pipe.AddShader(&fs);
7483
7484 pipe.AddVertexInputBindings(input_bindings, 2);
7485 pipe.AddVertexInputAttribs(&input_attrib, 1);
7486
Chris Forbes280ba2c2015-06-12 11:16:41 +12007487 VkDescriptorSetObj descriptorSet(m_device);
7488 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007489 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007490
Tony Barbour5781e8f2015-08-04 16:23:11 -06007491 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007492
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007493 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007494}
Chris Forbes8f68b562015-05-25 11:13:32 +12007495
Chris Forbes35efec72016-04-21 14:32:08 +12007496TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
7497 m_errorMonitor->ExpectSuccess();
7498
7499 ASSERT_NO_FATAL_FAILURE(InitState());
7500 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7501
7502 if (!m_device->phy().features().tessellationShader) {
7503 printf("Device does not support 64bit vertex attributes; skipped.\n");
7504 return;
7505 }
7506
7507 VkVertexInputBindingDescription input_bindings[1];
7508 memset(input_bindings, 0, sizeof(input_bindings));
7509
7510 VkVertexInputAttributeDescription input_attribs[4];
7511 memset(input_attribs, 0, sizeof(input_attribs));
7512 input_attribs[0].location = 0;
7513 input_attribs[0].offset = 0;
7514 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7515 input_attribs[1].location = 2;
7516 input_attribs[1].offset = 32;
7517 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7518 input_attribs[2].location = 4;
7519 input_attribs[2].offset = 64;
7520 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7521 input_attribs[3].location = 6;
7522 input_attribs[3].offset = 96;
7523 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7524
7525 char const *vsSource =
7526 "#version 450\n"
7527 "\n"
7528 "layout(location=0) in dmat4 x;\n"
7529 "out gl_PerVertex {\n"
7530 " vec4 gl_Position;\n"
7531 "};\n"
7532 "void main(){\n"
7533 " gl_Position = vec4(x[0][0]);\n"
7534 "}\n";
7535 char const *fsSource =
7536 "#version 450\n"
7537 "\n"
7538 "layout(location=0) out vec4 color;\n"
7539 "void main(){\n"
7540 " color = vec4(1);\n"
7541 "}\n";
7542
7543 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7544 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7545
7546 VkPipelineObj pipe(m_device);
7547 pipe.AddColorAttachment();
7548 pipe.AddShader(&vs);
7549 pipe.AddShader(&fs);
7550
7551 pipe.AddVertexInputBindings(input_bindings, 1);
7552 pipe.AddVertexInputAttribs(input_attribs, 4);
7553
7554 VkDescriptorSetObj descriptorSet(m_device);
7555 descriptorSet.AppendDummy();
7556 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7557
7558 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7559
7560 m_errorMonitor->VerifyNotFound();
7561}
7562
Karl Schultz6addd812016-02-02 17:17:23 -07007563TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007564 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007565 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007566
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007567 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007568
7569 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007570 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007571 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007572 "out gl_PerVertex {\n"
7573 " vec4 gl_Position;\n"
7574 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007575 "void main(){\n"
7576 " gl_Position = vec4(1);\n"
7577 "}\n";
7578 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007579 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007580 "\n"
7581 "void main(){\n"
7582 "}\n";
7583
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007584 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7585 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007586
7587 VkPipelineObj pipe(m_device);
7588 pipe.AddShader(&vs);
7589 pipe.AddShader(&fs);
7590
Chia-I Wu08accc62015-07-07 11:50:03 +08007591 /* set up CB 0, not written */
7592 pipe.AddColorAttachment();
7593 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007594
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007595 VkDescriptorSetObj descriptorSet(m_device);
7596 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007597 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007598
Tony Barbour5781e8f2015-08-04 16:23:11 -06007599 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007600
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007601 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007602}
7603
Karl Schultz6addd812016-02-02 17:17:23 -07007604TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07007605 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007606 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007607 "FS writes to output location 1 with no matching attachment");
7608
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007609 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007610
7611 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007612 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007613 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007614 "out gl_PerVertex {\n"
7615 " vec4 gl_Position;\n"
7616 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007617 "void main(){\n"
7618 " gl_Position = vec4(1);\n"
7619 "}\n";
7620 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007621 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007622 "\n"
7623 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007624 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007625 "void main(){\n"
7626 " x = vec4(1);\n"
7627 " y = vec4(1);\n"
7628 "}\n";
7629
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007630 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7631 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007632
7633 VkPipelineObj pipe(m_device);
7634 pipe.AddShader(&vs);
7635 pipe.AddShader(&fs);
7636
Chia-I Wu08accc62015-07-07 11:50:03 +08007637 /* set up CB 0, not written */
7638 pipe.AddColorAttachment();
7639 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007640 /* FS writes CB 1, but we don't configure it */
7641
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007642 VkDescriptorSetObj descriptorSet(m_device);
7643 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007644 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007645
Tony Barbour5781e8f2015-08-04 16:23:11 -06007646 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007647
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007648 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007649}
7650
Karl Schultz6addd812016-02-02 17:17:23 -07007651TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007653 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007654
Chris Forbesa36d69e2015-05-25 11:13:44 +12007655 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007656
7657 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007658 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007659 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007660 "out gl_PerVertex {\n"
7661 " vec4 gl_Position;\n"
7662 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007663 "void main(){\n"
7664 " gl_Position = vec4(1);\n"
7665 "}\n";
7666 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007667 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007668 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007669 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12007670 "void main(){\n"
7671 " x = ivec4(1);\n"
7672 "}\n";
7673
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007674 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7675 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007676
7677 VkPipelineObj pipe(m_device);
7678 pipe.AddShader(&vs);
7679 pipe.AddShader(&fs);
7680
Chia-I Wu08accc62015-07-07 11:50:03 +08007681 /* set up CB 0; type is UNORM by default */
7682 pipe.AddColorAttachment();
7683 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007684
Chris Forbesa36d69e2015-05-25 11:13:44 +12007685 VkDescriptorSetObj descriptorSet(m_device);
7686 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007687 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007688
Tony Barbour5781e8f2015-08-04 16:23:11 -06007689 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007690
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007691 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12007692}
Chris Forbes7b1b8932015-06-05 14:43:36 +12007693
Karl Schultz6addd812016-02-02 17:17:23 -07007694TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007696 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007697
Chris Forbes556c76c2015-08-14 12:04:59 +12007698 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12007699
7700 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007701 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007702 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007703 "out gl_PerVertex {\n"
7704 " vec4 gl_Position;\n"
7705 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007706 "void main(){\n"
7707 " gl_Position = vec4(1);\n"
7708 "}\n";
7709 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007710 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007711 "\n"
7712 "layout(location=0) out vec4 x;\n"
7713 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7714 "void main(){\n"
7715 " x = vec4(bar.y);\n"
7716 "}\n";
7717
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007718 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7719 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12007720
Chris Forbes556c76c2015-08-14 12:04:59 +12007721 VkPipelineObj pipe(m_device);
7722 pipe.AddShader(&vs);
7723 pipe.AddShader(&fs);
7724
7725 /* set up CB 0; type is UNORM by default */
7726 pipe.AddColorAttachment();
7727 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7728
7729 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007730 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12007731
7732 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7733
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007734 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12007735}
7736
Chris Forbes5c59e902016-02-26 16:56:09 +13007737TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
7738 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7739 "not declared in layout");
7740
7741 ASSERT_NO_FATAL_FAILURE(InitState());
7742
7743 char const *vsSource =
7744 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007745 "\n"
7746 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
7747 "out gl_PerVertex {\n"
7748 " vec4 gl_Position;\n"
7749 "};\n"
7750 "void main(){\n"
7751 " gl_Position = vec4(consts.x);\n"
7752 "}\n";
7753 char const *fsSource =
7754 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007755 "\n"
7756 "layout(location=0) out vec4 x;\n"
7757 "void main(){\n"
7758 " x = vec4(1);\n"
7759 "}\n";
7760
7761 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7762 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7763
7764 VkPipelineObj pipe(m_device);
7765 pipe.AddShader(&vs);
7766 pipe.AddShader(&fs);
7767
7768 /* set up CB 0; type is UNORM by default */
7769 pipe.AddColorAttachment();
7770 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7771
7772 VkDescriptorSetObj descriptorSet(m_device);
7773 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7774
7775 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7776
7777 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007778 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13007779}
7780
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007781#endif // SHADER_CHECKER_TESTS
7782
7783#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06007784TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07007785 m_errorMonitor->SetDesiredFailureMsg(
7786 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007787 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007788
7789 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007790
7791 // Create an image
7792 VkImage image;
7793
Karl Schultz6addd812016-02-02 17:17:23 -07007794 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7795 const int32_t tex_width = 32;
7796 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007797
7798 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007799 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7800 image_create_info.pNext = NULL;
7801 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7802 image_create_info.format = tex_format;
7803 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007804 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07007805 image_create_info.extent.depth = 1;
7806 image_create_info.mipLevels = 1;
7807 image_create_info.arrayLayers = 1;
7808 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7809 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7810 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7811 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007812
7813 // Introduce error by sending down a bogus width extent
7814 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007815 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007816
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007817 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007818}
7819
Mark Youngc48c4c12016-04-11 14:26:49 -06007820TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
7821 m_errorMonitor->SetDesiredFailureMsg(
7822 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7823 "CreateImage extents is 0 for at least one required dimension");
7824
7825 ASSERT_NO_FATAL_FAILURE(InitState());
7826
7827 // Create an image
7828 VkImage image;
7829
7830 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7831 const int32_t tex_width = 32;
7832 const int32_t tex_height = 32;
7833
7834 VkImageCreateInfo image_create_info = {};
7835 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7836 image_create_info.pNext = NULL;
7837 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7838 image_create_info.format = tex_format;
7839 image_create_info.extent.width = tex_width;
7840 image_create_info.extent.height = tex_height;
7841 image_create_info.extent.depth = 1;
7842 image_create_info.mipLevels = 1;
7843 image_create_info.arrayLayers = 1;
7844 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7845 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7846 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7847 image_create_info.flags = 0;
7848
7849 // Introduce error by sending down a bogus width extent
7850 image_create_info.extent.width = 0;
7851 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7852
7853 m_errorMonitor->VerifyFound();
7854}
7855
Karl Schultz6addd812016-02-02 17:17:23 -07007856TEST_F(VkLayerTest, UpdateBufferAlignment) {
7857 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06007858
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007860 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007861
Mike Stroyana3082432015-09-25 13:39:21 -06007862 ASSERT_NO_FATAL_FAILURE(InitState());
7863
7864 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7865 vk_testing::Buffer buffer;
7866 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7867
7868 BeginCommandBuffer();
7869 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007870 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007871 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007872
Mike Stroyana3082432015-09-25 13:39:21 -06007873 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007875 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007876
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007877 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007878 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007879 EndCommandBuffer();
7880}
7881
Karl Schultz6addd812016-02-02 17:17:23 -07007882TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007884 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06007885
7886 ASSERT_NO_FATAL_FAILURE(InitState());
7887
7888 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7889 vk_testing::Buffer buffer;
7890 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7891
7892 BeginCommandBuffer();
7893 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007894 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007895 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007896
Mike Stroyana3082432015-09-25 13:39:21 -06007897 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007898 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007899 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007900
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007901 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007902
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007903 m_errorMonitor->VerifyFound();
7904
Mike Stroyana3082432015-09-25 13:39:21 -06007905 EndCommandBuffer();
7906}
7907
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007908#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12007909
Tobin Ehliscde08892015-09-22 10:11:37 -06007910#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007911TEST_F(VkLayerTest, InvalidImageView) {
7912 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06007913
Karl Schultz6addd812016-02-02 17:17:23 -07007914 m_errorMonitor->SetDesiredFailureMsg(
7915 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007916 "vkCreateImageView called with baseMipLevel 10 ");
7917
Tobin Ehliscde08892015-09-22 10:11:37 -06007918 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06007919
Mike Stroyana3082432015-09-25 13:39:21 -06007920 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07007921 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06007922
Karl Schultz6addd812016-02-02 17:17:23 -07007923 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7924 const int32_t tex_width = 32;
7925 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06007926
7927 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007928 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7929 image_create_info.pNext = NULL;
7930 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7931 image_create_info.format = tex_format;
7932 image_create_info.extent.width = tex_width;
7933 image_create_info.extent.height = tex_height;
7934 image_create_info.extent.depth = 1;
7935 image_create_info.mipLevels = 1;
7936 image_create_info.arrayLayers = 1;
7937 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7938 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7939 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7940 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06007941
Chia-I Wuf7458c52015-10-26 21:10:41 +08007942 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06007943 ASSERT_VK_SUCCESS(err);
7944
7945 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007946 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7947 image_view_create_info.image = image;
7948 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7949 image_view_create_info.format = tex_format;
7950 image_view_create_info.subresourceRange.layerCount = 1;
7951 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
7952 image_view_create_info.subresourceRange.levelCount = 1;
7953 image_view_create_info.subresourceRange.aspectMask =
7954 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06007955
7956 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007957 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7958 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06007959
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007960 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06007961}
Mike Stroyana3082432015-09-25 13:39:21 -06007962
Karl Schultz6addd812016-02-02 17:17:23 -07007963TEST_F(VkLayerTest, InvalidImageViewAspect) {
7964 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007965
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007966 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007967 "vkCreateImageView: Color image "
7968 "formats must have ONLY the "
7969 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007970
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007971 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007972
7973 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07007974 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007975
Karl Schultz6addd812016-02-02 17:17:23 -07007976 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7977 const int32_t tex_width = 32;
7978 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007979
7980 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007981 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7982 image_create_info.pNext = NULL;
7983 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7984 image_create_info.format = tex_format;
7985 image_create_info.extent.width = tex_width;
7986 image_create_info.extent.height = tex_height;
7987 image_create_info.extent.depth = 1;
7988 image_create_info.mipLevels = 1;
7989 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7990 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7991 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7992 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007993
Chia-I Wuf7458c52015-10-26 21:10:41 +08007994 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007995 ASSERT_VK_SUCCESS(err);
7996
7997 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007998 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7999 image_view_create_info.image = image;
8000 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8001 image_view_create_info.format = tex_format;
8002 image_view_create_info.subresourceRange.baseMipLevel = 0;
8003 image_view_create_info.subresourceRange.levelCount = 1;
8004 // Cause an error by setting an invalid image aspect
8005 image_view_create_info.subresourceRange.aspectMask =
8006 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008007
8008 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008009 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8010 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008011
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008012 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008013}
8014
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008015TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008016 VkResult err;
8017 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008018
Karl Schultz6addd812016-02-02 17:17:23 -07008019 m_errorMonitor->SetDesiredFailureMsg(
8020 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008021 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008022
Mike Stroyana3082432015-09-25 13:39:21 -06008023 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008024
8025 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008026 VkImage srcImage;
8027 VkImage dstImage;
8028 VkDeviceMemory srcMem;
8029 VkDeviceMemory destMem;
8030 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008031
8032 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008033 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8034 image_create_info.pNext = NULL;
8035 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8036 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8037 image_create_info.extent.width = 32;
8038 image_create_info.extent.height = 32;
8039 image_create_info.extent.depth = 1;
8040 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008041 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07008042 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8043 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8044 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8045 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008046
Karl Schultz6addd812016-02-02 17:17:23 -07008047 err =
8048 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008049 ASSERT_VK_SUCCESS(err);
8050
Karl Schultz6addd812016-02-02 17:17:23 -07008051 err =
8052 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008053 ASSERT_VK_SUCCESS(err);
8054
8055 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008056 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008057 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8058 memAlloc.pNext = NULL;
8059 memAlloc.allocationSize = 0;
8060 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008061
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008062 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008063 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008064 pass =
8065 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008066 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008067 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008068 ASSERT_VK_SUCCESS(err);
8069
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008070 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008071 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008072 pass =
8073 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008074 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008075 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008076 ASSERT_VK_SUCCESS(err);
8077
8078 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8079 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008080 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008081 ASSERT_VK_SUCCESS(err);
8082
8083 BeginCommandBuffer();
8084 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008085 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008086 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008087 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008088 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06008089 copyRegion.srcOffset.x = 0;
8090 copyRegion.srcOffset.y = 0;
8091 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008092 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008093 copyRegion.dstSubresource.mipLevel = 0;
8094 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008095 // Introduce failure by forcing the dst layerCount to differ from src
8096 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008097 copyRegion.dstOffset.x = 0;
8098 copyRegion.dstOffset.y = 0;
8099 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008100 copyRegion.extent.width = 1;
8101 copyRegion.extent.height = 1;
8102 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008103 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8104 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008105 EndCommandBuffer();
8106
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008107 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008108
Chia-I Wuf7458c52015-10-26 21:10:41 +08008109 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008110 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008111 vkFreeMemory(m_device->device(), srcMem, NULL);
8112 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008113}
8114
Karl Schultz6addd812016-02-02 17:17:23 -07008115TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06008116 VkResult err;
8117 bool pass;
8118
8119 // Create color images with different format sizes and try to copy between them
8120 m_errorMonitor->SetDesiredFailureMsg(
8121 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8122 "vkCmdCopyImage called with unmatched source and dest image format sizes");
8123
8124 ASSERT_NO_FATAL_FAILURE(InitState());
8125
8126 // Create two images of different types and try to copy between them
8127 VkImage srcImage;
8128 VkImage dstImage;
8129 VkDeviceMemory srcMem;
8130 VkDeviceMemory destMem;
8131 VkMemoryRequirements memReqs;
8132
8133 VkImageCreateInfo image_create_info = {};
8134 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8135 image_create_info.pNext = NULL;
8136 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8137 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8138 image_create_info.extent.width = 32;
8139 image_create_info.extent.height = 32;
8140 image_create_info.extent.depth = 1;
8141 image_create_info.mipLevels = 1;
8142 image_create_info.arrayLayers = 1;
8143 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8144 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8145 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8146 image_create_info.flags = 0;
8147
8148 err =
8149 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
8150 ASSERT_VK_SUCCESS(err);
8151
8152 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8153 // Introduce failure by creating second image with a different-sized format.
8154 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
8155
8156 err =
8157 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
8158 ASSERT_VK_SUCCESS(err);
8159
8160 // Allocate memory
8161 VkMemoryAllocateInfo memAlloc = {};
8162 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8163 memAlloc.pNext = NULL;
8164 memAlloc.allocationSize = 0;
8165 memAlloc.memoryTypeIndex = 0;
8166
8167 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
8168 memAlloc.allocationSize = memReqs.size;
8169 pass =
8170 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
8171 ASSERT_TRUE(pass);
8172 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
8173 ASSERT_VK_SUCCESS(err);
8174
8175 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
8176 memAlloc.allocationSize = memReqs.size;
8177 pass =
8178 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
8179 ASSERT_TRUE(pass);
8180 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
8181 ASSERT_VK_SUCCESS(err);
8182
8183 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8184 ASSERT_VK_SUCCESS(err);
8185 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
8186 ASSERT_VK_SUCCESS(err);
8187
8188 BeginCommandBuffer();
8189 VkImageCopy copyRegion;
8190 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8191 copyRegion.srcSubresource.mipLevel = 0;
8192 copyRegion.srcSubresource.baseArrayLayer = 0;
8193 copyRegion.srcSubresource.layerCount = 0;
8194 copyRegion.srcOffset.x = 0;
8195 copyRegion.srcOffset.y = 0;
8196 copyRegion.srcOffset.z = 0;
8197 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8198 copyRegion.dstSubresource.mipLevel = 0;
8199 copyRegion.dstSubresource.baseArrayLayer = 0;
8200 copyRegion.dstSubresource.layerCount = 0;
8201 copyRegion.dstOffset.x = 0;
8202 copyRegion.dstOffset.y = 0;
8203 copyRegion.dstOffset.z = 0;
8204 copyRegion.extent.width = 1;
8205 copyRegion.extent.height = 1;
8206 copyRegion.extent.depth = 1;
8207 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8208 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
8209 EndCommandBuffer();
8210
8211 m_errorMonitor->VerifyFound();
8212
8213 vkDestroyImage(m_device->device(), srcImage, NULL);
8214 vkDestroyImage(m_device->device(), dstImage, NULL);
8215 vkFreeMemory(m_device->device(), srcMem, NULL);
8216 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008217}
8218
Karl Schultz6addd812016-02-02 17:17:23 -07008219TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
8220 VkResult err;
8221 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008222
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008223 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008224 m_errorMonitor->SetDesiredFailureMsg(
8225 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008226 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008227
Mike Stroyana3082432015-09-25 13:39:21 -06008228 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008229
8230 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008231 VkImage srcImage;
8232 VkImage dstImage;
8233 VkDeviceMemory srcMem;
8234 VkDeviceMemory destMem;
8235 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008236
8237 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008238 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8239 image_create_info.pNext = NULL;
8240 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8241 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8242 image_create_info.extent.width = 32;
8243 image_create_info.extent.height = 32;
8244 image_create_info.extent.depth = 1;
8245 image_create_info.mipLevels = 1;
8246 image_create_info.arrayLayers = 1;
8247 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8248 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8249 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8250 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008251
Karl Schultz6addd812016-02-02 17:17:23 -07008252 err =
8253 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008254 ASSERT_VK_SUCCESS(err);
8255
Karl Schultzbdb75952016-04-19 11:36:49 -06008256 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8257
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008258 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07008259 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008260 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8261 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008262
Karl Schultz6addd812016-02-02 17:17:23 -07008263 err =
8264 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008265 ASSERT_VK_SUCCESS(err);
8266
8267 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008268 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008269 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8270 memAlloc.pNext = NULL;
8271 memAlloc.allocationSize = 0;
8272 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008273
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008274 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008275 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008276 pass =
8277 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008278 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008279 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008280 ASSERT_VK_SUCCESS(err);
8281
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008282 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008283 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008284 pass =
8285 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008286 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008287 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008288 ASSERT_VK_SUCCESS(err);
8289
8290 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8291 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008292 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008293 ASSERT_VK_SUCCESS(err);
8294
8295 BeginCommandBuffer();
8296 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008297 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008298 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008299 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008300 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008301 copyRegion.srcOffset.x = 0;
8302 copyRegion.srcOffset.y = 0;
8303 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008304 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008305 copyRegion.dstSubresource.mipLevel = 0;
8306 copyRegion.dstSubresource.baseArrayLayer = 0;
8307 copyRegion.dstSubresource.layerCount = 0;
8308 copyRegion.dstOffset.x = 0;
8309 copyRegion.dstOffset.y = 0;
8310 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008311 copyRegion.extent.width = 1;
8312 copyRegion.extent.height = 1;
8313 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008314 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8315 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008316 EndCommandBuffer();
8317
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008318 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008319
Chia-I Wuf7458c52015-10-26 21:10:41 +08008320 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008321 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008322 vkFreeMemory(m_device->device(), srcMem, NULL);
8323 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008324}
8325
Karl Schultz6addd812016-02-02 17:17:23 -07008326TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
8327 VkResult err;
8328 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008329
Karl Schultz6addd812016-02-02 17:17:23 -07008330 m_errorMonitor->SetDesiredFailureMsg(
8331 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008332 "vkCmdResolveImage called with source sample count less than 2.");
8333
Mike Stroyana3082432015-09-25 13:39:21 -06008334 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008335
8336 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008337 VkImage srcImage;
8338 VkImage dstImage;
8339 VkDeviceMemory srcMem;
8340 VkDeviceMemory destMem;
8341 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008342
8343 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008344 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8345 image_create_info.pNext = NULL;
8346 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8347 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8348 image_create_info.extent.width = 32;
8349 image_create_info.extent.height = 1;
8350 image_create_info.extent.depth = 1;
8351 image_create_info.mipLevels = 1;
8352 image_create_info.arrayLayers = 1;
8353 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8354 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8355 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8356 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008357
Karl Schultz6addd812016-02-02 17:17:23 -07008358 err =
8359 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008360 ASSERT_VK_SUCCESS(err);
8361
Karl Schultz6addd812016-02-02 17:17:23 -07008362 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8363 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008364
Karl Schultz6addd812016-02-02 17:17:23 -07008365 err =
8366 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008367 ASSERT_VK_SUCCESS(err);
8368
8369 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008370 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008371 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8372 memAlloc.pNext = NULL;
8373 memAlloc.allocationSize = 0;
8374 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008375
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008376 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008377 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008378 pass =
8379 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008380 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008381 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008382 ASSERT_VK_SUCCESS(err);
8383
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008384 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008385 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008386 pass =
8387 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008388 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008389 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008390 ASSERT_VK_SUCCESS(err);
8391
8392 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8393 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008394 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008395 ASSERT_VK_SUCCESS(err);
8396
8397 BeginCommandBuffer();
8398 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008399 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8400 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008401 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008402 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008403 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008404 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008405 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008406 resolveRegion.srcOffset.x = 0;
8407 resolveRegion.srcOffset.y = 0;
8408 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008409 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008410 resolveRegion.dstSubresource.mipLevel = 0;
8411 resolveRegion.dstSubresource.baseArrayLayer = 0;
8412 resolveRegion.dstSubresource.layerCount = 0;
8413 resolveRegion.dstOffset.x = 0;
8414 resolveRegion.dstOffset.y = 0;
8415 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008416 resolveRegion.extent.width = 1;
8417 resolveRegion.extent.height = 1;
8418 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008419 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8420 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008421 EndCommandBuffer();
8422
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008423 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008424
Chia-I Wuf7458c52015-10-26 21:10:41 +08008425 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008426 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008427 vkFreeMemory(m_device->device(), srcMem, NULL);
8428 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008429}
8430
Karl Schultz6addd812016-02-02 17:17:23 -07008431TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
8432 VkResult err;
8433 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008434
Karl Schultz6addd812016-02-02 17:17:23 -07008435 m_errorMonitor->SetDesiredFailureMsg(
8436 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008437 "vkCmdResolveImage called with dest sample count greater than 1.");
8438
Mike Stroyana3082432015-09-25 13:39:21 -06008439 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008440
8441 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008442 VkImage srcImage;
8443 VkImage dstImage;
8444 VkDeviceMemory srcMem;
8445 VkDeviceMemory destMem;
8446 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008447
8448 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008449 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8450 image_create_info.pNext = NULL;
8451 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8452 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8453 image_create_info.extent.width = 32;
8454 image_create_info.extent.height = 1;
8455 image_create_info.extent.depth = 1;
8456 image_create_info.mipLevels = 1;
8457 image_create_info.arrayLayers = 1;
8458 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8459 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8460 // Note: Some implementations expect color attachment usage for any
8461 // multisample surface
8462 image_create_info.usage =
8463 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8464 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008465
Karl Schultz6addd812016-02-02 17:17:23 -07008466 err =
8467 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008468 ASSERT_VK_SUCCESS(err);
8469
Karl Schultz6addd812016-02-02 17:17:23 -07008470 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8471 // Note: Some implementations expect color attachment usage for any
8472 // multisample surface
8473 image_create_info.usage =
8474 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008475
Karl Schultz6addd812016-02-02 17:17:23 -07008476 err =
8477 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008478 ASSERT_VK_SUCCESS(err);
8479
8480 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008481 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008482 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8483 memAlloc.pNext = NULL;
8484 memAlloc.allocationSize = 0;
8485 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008486
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008487 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008488 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008489 pass =
8490 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008491 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008492 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008493 ASSERT_VK_SUCCESS(err);
8494
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008495 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008496 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008497 pass =
8498 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008499 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008500 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008501 ASSERT_VK_SUCCESS(err);
8502
8503 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8504 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008505 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008506 ASSERT_VK_SUCCESS(err);
8507
8508 BeginCommandBuffer();
8509 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008510 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8511 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008512 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008513 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008514 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008515 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008516 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008517 resolveRegion.srcOffset.x = 0;
8518 resolveRegion.srcOffset.y = 0;
8519 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008520 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008521 resolveRegion.dstSubresource.mipLevel = 0;
8522 resolveRegion.dstSubresource.baseArrayLayer = 0;
8523 resolveRegion.dstSubresource.layerCount = 0;
8524 resolveRegion.dstOffset.x = 0;
8525 resolveRegion.dstOffset.y = 0;
8526 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008527 resolveRegion.extent.width = 1;
8528 resolveRegion.extent.height = 1;
8529 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008530 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8531 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008532 EndCommandBuffer();
8533
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008534 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008535
Chia-I Wuf7458c52015-10-26 21:10:41 +08008536 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008537 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008538 vkFreeMemory(m_device->device(), srcMem, NULL);
8539 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008540}
8541
Karl Schultz6addd812016-02-02 17:17:23 -07008542TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
8543 VkResult err;
8544 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008545
Karl Schultz6addd812016-02-02 17:17:23 -07008546 m_errorMonitor->SetDesiredFailureMsg(
8547 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008548 "vkCmdResolveImage called with unmatched source and dest formats.");
8549
Mike Stroyana3082432015-09-25 13:39:21 -06008550 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008551
8552 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008553 VkImage srcImage;
8554 VkImage dstImage;
8555 VkDeviceMemory srcMem;
8556 VkDeviceMemory destMem;
8557 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008558
8559 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008560 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8561 image_create_info.pNext = NULL;
8562 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8563 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8564 image_create_info.extent.width = 32;
8565 image_create_info.extent.height = 1;
8566 image_create_info.extent.depth = 1;
8567 image_create_info.mipLevels = 1;
8568 image_create_info.arrayLayers = 1;
8569 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8570 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8571 // Note: Some implementations expect color attachment usage for any
8572 // multisample surface
8573 image_create_info.usage =
8574 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8575 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008576
Karl Schultz6addd812016-02-02 17:17:23 -07008577 err =
8578 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008579 ASSERT_VK_SUCCESS(err);
8580
Karl Schultz6addd812016-02-02 17:17:23 -07008581 // Set format to something other than source image
8582 image_create_info.format = VK_FORMAT_R32_SFLOAT;
8583 // Note: Some implementations expect color attachment usage for any
8584 // multisample surface
8585 image_create_info.usage =
8586 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8587 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008588
Karl Schultz6addd812016-02-02 17:17:23 -07008589 err =
8590 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008591 ASSERT_VK_SUCCESS(err);
8592
8593 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008594 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008595 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8596 memAlloc.pNext = NULL;
8597 memAlloc.allocationSize = 0;
8598 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008599
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008600 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008601 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008602 pass =
8603 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008604 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008605 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008606 ASSERT_VK_SUCCESS(err);
8607
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008608 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008609 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008610 pass =
8611 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008612 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008613 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008614 ASSERT_VK_SUCCESS(err);
8615
8616 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8617 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008618 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008619 ASSERT_VK_SUCCESS(err);
8620
8621 BeginCommandBuffer();
8622 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008623 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8624 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008625 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008626 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008627 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008628 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008629 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008630 resolveRegion.srcOffset.x = 0;
8631 resolveRegion.srcOffset.y = 0;
8632 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008633 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008634 resolveRegion.dstSubresource.mipLevel = 0;
8635 resolveRegion.dstSubresource.baseArrayLayer = 0;
8636 resolveRegion.dstSubresource.layerCount = 0;
8637 resolveRegion.dstOffset.x = 0;
8638 resolveRegion.dstOffset.y = 0;
8639 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008640 resolveRegion.extent.width = 1;
8641 resolveRegion.extent.height = 1;
8642 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008643 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8644 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008645 EndCommandBuffer();
8646
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008647 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008648
Chia-I Wuf7458c52015-10-26 21:10:41 +08008649 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008650 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008651 vkFreeMemory(m_device->device(), srcMem, NULL);
8652 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008653}
8654
Karl Schultz6addd812016-02-02 17:17:23 -07008655TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
8656 VkResult err;
8657 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008658
Karl Schultz6addd812016-02-02 17:17:23 -07008659 m_errorMonitor->SetDesiredFailureMsg(
8660 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008661 "vkCmdResolveImage called with unmatched source and dest image types.");
8662
Mike Stroyana3082432015-09-25 13:39:21 -06008663 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008664
8665 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008666 VkImage srcImage;
8667 VkImage dstImage;
8668 VkDeviceMemory srcMem;
8669 VkDeviceMemory destMem;
8670 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008671
8672 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008673 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8674 image_create_info.pNext = NULL;
8675 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8676 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8677 image_create_info.extent.width = 32;
8678 image_create_info.extent.height = 1;
8679 image_create_info.extent.depth = 1;
8680 image_create_info.mipLevels = 1;
8681 image_create_info.arrayLayers = 1;
8682 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8683 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8684 // Note: Some implementations expect color attachment usage for any
8685 // multisample surface
8686 image_create_info.usage =
8687 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8688 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008689
Karl Schultz6addd812016-02-02 17:17:23 -07008690 err =
8691 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008692 ASSERT_VK_SUCCESS(err);
8693
Karl Schultz6addd812016-02-02 17:17:23 -07008694 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8695 // Note: Some implementations expect color attachment usage for any
8696 // multisample surface
8697 image_create_info.usage =
8698 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8699 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008700
Karl Schultz6addd812016-02-02 17:17:23 -07008701 err =
8702 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008703 ASSERT_VK_SUCCESS(err);
8704
8705 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008706 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008707 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8708 memAlloc.pNext = NULL;
8709 memAlloc.allocationSize = 0;
8710 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008711
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008712 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008713 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008714 pass =
8715 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008716 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008717 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008718 ASSERT_VK_SUCCESS(err);
8719
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008720 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008721 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008722 pass =
8723 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008724 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008725 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008726 ASSERT_VK_SUCCESS(err);
8727
8728 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8729 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008730 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008731 ASSERT_VK_SUCCESS(err);
8732
8733 BeginCommandBuffer();
8734 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008735 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8736 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008737 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008738 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008739 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008740 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008741 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008742 resolveRegion.srcOffset.x = 0;
8743 resolveRegion.srcOffset.y = 0;
8744 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008745 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008746 resolveRegion.dstSubresource.mipLevel = 0;
8747 resolveRegion.dstSubresource.baseArrayLayer = 0;
8748 resolveRegion.dstSubresource.layerCount = 0;
8749 resolveRegion.dstOffset.x = 0;
8750 resolveRegion.dstOffset.y = 0;
8751 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008752 resolveRegion.extent.width = 1;
8753 resolveRegion.extent.height = 1;
8754 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008755 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8756 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008757 EndCommandBuffer();
8758
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008759 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008760
Chia-I Wuf7458c52015-10-26 21:10:41 +08008761 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008762 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008763 vkFreeMemory(m_device->device(), srcMem, NULL);
8764 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008765}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008766
Karl Schultz6addd812016-02-02 17:17:23 -07008767TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008768 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07008769 // to using a DS format, then cause it to hit error due to COLOR_BIT not
8770 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008771 // The image format check comes 2nd in validation so we trigger it first,
8772 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07008773 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008774
Karl Schultz6addd812016-02-02 17:17:23 -07008775 m_errorMonitor->SetDesiredFailureMsg(
8776 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008777 "Combination depth/stencil image formats can have only the ");
8778
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008779 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008780
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008781 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008782 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8783 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008784
8785 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008786 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8787 ds_pool_ci.pNext = NULL;
8788 ds_pool_ci.maxSets = 1;
8789 ds_pool_ci.poolSizeCount = 1;
8790 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008791
8792 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008793 err =
8794 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008795 ASSERT_VK_SUCCESS(err);
8796
8797 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008798 dsl_binding.binding = 0;
8799 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8800 dsl_binding.descriptorCount = 1;
8801 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8802 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008803
8804 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008805 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8806 ds_layout_ci.pNext = NULL;
8807 ds_layout_ci.bindingCount = 1;
8808 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008809 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008810 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8811 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008812 ASSERT_VK_SUCCESS(err);
8813
8814 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008815 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008816 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008817 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008818 alloc_info.descriptorPool = ds_pool;
8819 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008820 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8821 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008822 ASSERT_VK_SUCCESS(err);
8823
Karl Schultz6addd812016-02-02 17:17:23 -07008824 VkImage image_bad;
8825 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008826 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07008827 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008828 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07008829 const int32_t tex_width = 32;
8830 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008831
8832 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008833 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8834 image_create_info.pNext = NULL;
8835 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8836 image_create_info.format = tex_format_bad;
8837 image_create_info.extent.width = tex_width;
8838 image_create_info.extent.height = tex_height;
8839 image_create_info.extent.depth = 1;
8840 image_create_info.mipLevels = 1;
8841 image_create_info.arrayLayers = 1;
8842 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8843 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8844 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
8845 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
8846 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008847
Karl Schultz6addd812016-02-02 17:17:23 -07008848 err =
8849 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008850 ASSERT_VK_SUCCESS(err);
8851 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07008852 image_create_info.usage =
8853 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8854 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
8855 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008856 ASSERT_VK_SUCCESS(err);
8857
8858 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008859 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8860 image_view_create_info.image = image_bad;
8861 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8862 image_view_create_info.format = tex_format_bad;
8863 image_view_create_info.subresourceRange.baseArrayLayer = 0;
8864 image_view_create_info.subresourceRange.baseMipLevel = 0;
8865 image_view_create_info.subresourceRange.layerCount = 1;
8866 image_view_create_info.subresourceRange.levelCount = 1;
8867 image_view_create_info.subresourceRange.aspectMask =
8868 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008869
8870 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008871 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8872 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008873
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008874 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008875
Chia-I Wuf7458c52015-10-26 21:10:41 +08008876 vkDestroyImage(m_device->device(), image_bad, NULL);
8877 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008878 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8879 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008880}
Tobin Ehliscde08892015-09-22 10:11:37 -06008881#endif // IMAGE_TESTS
8882
Tony Barbour300a6082015-04-07 13:44:53 -06008883int main(int argc, char **argv) {
8884 int result;
8885
Cody Northrop8e54a402016-03-08 22:25:52 -07008886#ifdef ANDROID
8887 int vulkanSupport = InitVulkan();
8888 if (vulkanSupport == 0)
8889 return 1;
8890#endif
8891
Tony Barbour300a6082015-04-07 13:44:53 -06008892 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06008893 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06008894
8895 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
8896
8897 result = RUN_ALL_TESTS();
8898
Tony Barbour6918cd52015-04-09 12:58:51 -06008899 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06008900 return result;
8901}