blob: f77e7e8e63e038fdf3b864e90e1190be016b6f13 [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
Karl Schultz6addd812016-02-02 17:17:23 -0700615TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
616 VkResult err;
617 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500618
Karl Schultz6addd812016-02-02 17:17:23 -0700619 m_errorMonitor->SetDesiredFailureMsg(
620 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600621 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
622
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500623 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500624
625 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700626 VkImage image;
627 VkDeviceMemory mem;
628 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500629
Karl Schultz6addd812016-02-02 17:17:23 -0700630 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
631 const int32_t tex_width = 32;
632 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500633
Tony Barboureb254902015-07-15 12:50:33 -0600634 VkImageCreateInfo image_create_info = {};
635 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700636 image_create_info.pNext = NULL;
637 image_create_info.imageType = VK_IMAGE_TYPE_2D;
638 image_create_info.format = tex_format;
639 image_create_info.extent.width = tex_width;
640 image_create_info.extent.height = tex_height;
641 image_create_info.extent.depth = 1;
642 image_create_info.mipLevels = 1;
643 image_create_info.arrayLayers = 1;
644 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
645 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
646 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
647 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600648
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800649 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800650 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700651 mem_alloc.pNext = NULL;
652 mem_alloc.allocationSize = 0;
653 // Introduce failure, do NOT set memProps to
654 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
655 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500656
Chia-I Wuf7458c52015-10-26 21:10:41 +0800657 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500658 ASSERT_VK_SUCCESS(err);
659
Karl Schultz6addd812016-02-02 17:17:23 -0700660 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500661
Mark Lobodzinski23065352015-05-29 09:32:35 -0500662 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500663
Karl Schultz6addd812016-02-02 17:17:23 -0700664 pass =
665 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
666 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
667 if (!pass) { // If we can't find any unmappable memory this test doesn't
668 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +0800669 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -0600670 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -0600671 }
Mike Stroyan713b2d72015-08-04 10:49:29 -0600672
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500673 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800674 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500675 ASSERT_VK_SUCCESS(err);
676
677 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -0600678 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500679 ASSERT_VK_SUCCESS(err);
680
681 // Map memory as if to initialize the image
682 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -0700683 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
684 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500685
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200686 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600687
Chia-I Wuf7458c52015-10-26 21:10:41 +0800688 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500689}
690
Karl Schultz6addd812016-02-02 17:17:23 -0700691TEST_F(VkLayerTest, RebindMemory) {
692 VkResult err;
693 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500694
Karl Schultz6addd812016-02-02 17:17:23 -0700695 m_errorMonitor->SetDesiredFailureMsg(
696 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600697 "which has already been bound to mem object");
698
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500699 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500700
701 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700702 VkImage image;
703 VkDeviceMemory mem1;
704 VkDeviceMemory mem2;
705 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500706
Karl Schultz6addd812016-02-02 17:17:23 -0700707 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
708 const int32_t tex_width = 32;
709 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500710
Tony Barboureb254902015-07-15 12:50:33 -0600711 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700712 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
713 image_create_info.pNext = NULL;
714 image_create_info.imageType = VK_IMAGE_TYPE_2D;
715 image_create_info.format = tex_format;
716 image_create_info.extent.width = tex_width;
717 image_create_info.extent.height = tex_height;
718 image_create_info.extent.depth = 1;
719 image_create_info.mipLevels = 1;
720 image_create_info.arrayLayers = 1;
721 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
722 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
723 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
724 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500725
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800726 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700727 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
728 mem_alloc.pNext = NULL;
729 mem_alloc.allocationSize = 0;
730 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -0600731
Karl Schultz6addd812016-02-02 17:17:23 -0700732 // Introduce failure, do NOT set memProps to
733 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -0600734 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800735 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500736 ASSERT_VK_SUCCESS(err);
737
Karl Schultz6addd812016-02-02 17:17:23 -0700738 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500739
740 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -0700741 pass =
742 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -0600743 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500744
745 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800746 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500747 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800748 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500749 ASSERT_VK_SUCCESS(err);
750
751 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -0600752 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500753 ASSERT_VK_SUCCESS(err);
754
Karl Schultz6addd812016-02-02 17:17:23 -0700755 // Introduce validation failure, try to bind a different memory object to
756 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -0600757 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500758
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200759 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600760
Chia-I Wuf7458c52015-10-26 21:10:41 +0800761 vkDestroyImage(m_device->device(), image, NULL);
762 vkFreeMemory(m_device->device(), mem1, NULL);
763 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500764}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500765
Karl Schultz6addd812016-02-02 17:17:23 -0700766TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600767 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600768
Karl Schultz6addd812016-02-02 17:17:23 -0700769 m_errorMonitor->SetDesiredFailureMsg(
770 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
771 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600772
773 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600774 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
775 fenceInfo.pNext = NULL;
776 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -0600777
Tony Barbour300a6082015-04-07 13:44:53 -0600778 ASSERT_NO_FATAL_FAILURE(InitState());
779 ASSERT_NO_FATAL_FAILURE(InitViewport());
780 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
781
Tony Barbourfe3351b2015-07-28 10:17:20 -0600782 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700783 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
784 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600785 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600786
787 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600788
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600789 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800790 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
791 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800792 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600793 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700794 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800795 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800796 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800797 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600798 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600799
800 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -0700801 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600802
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200803 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600804}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600805// This is a positive test. We used to expect error in this case but spec now
806// allows it
Karl Schultz6addd812016-02-02 17:17:23 -0700807TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600808 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600809 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600810 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600811 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
812 fenceInfo.pNext = NULL;
813
Tony Barbour0b4d9562015-04-09 10:48:04 -0600814 ASSERT_NO_FATAL_FAILURE(InitState());
815 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +0800816 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600817 VkResult result = vkResetFences(m_device->device(), 1, fences);
818 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -0600819
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600820 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -0600821}
Tobin Ehlis41376e12015-07-03 08:45:14 -0600822
Chia-I Wu08accc62015-07-07 11:50:03 +0800823/* TODO: Update for changes due to bug-14075 tiling across render passes */
824#if 0
Tobin Ehlis41376e12015-07-03 08:45:14 -0600825TEST_F(VkLayerTest, InvalidUsageBits)
826{
827 // Initiate Draw w/o a PSO bound
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600828
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600830 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -0600831
832 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800833 VkCommandBufferObj commandBuffer(m_device);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600834 BeginCommandBuffer();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600835
836 const VkExtent3D e3d = {
837 .width = 128,
838 .height = 128,
839 .depth = 1,
840 };
841 const VkImageCreateInfo ici = {
842 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
843 .pNext = NULL,
844 .imageType = VK_IMAGE_TYPE_2D,
845 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
846 .extent = e3d,
847 .mipLevels = 1,
848 .arraySize = 1,
Chia-I Wu5c17c962015-10-31 00:31:16 +0800849 .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600850 .tiling = VK_IMAGE_TILING_LINEAR,
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600851 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
Tobin Ehlis41376e12015-07-03 08:45:14 -0600852 .flags = 0,
853 };
854
855 VkImage dsi;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800856 vkCreateImage(m_device->device(), &ici, NULL, &dsi);
Tobin Ehlis41376e12015-07-03 08:45:14 -0600857 VkDepthStencilView dsv;
858 const VkDepthStencilViewCreateInfo dsvci = {
859 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
860 .pNext = NULL,
861 .image = dsi,
862 .mipLevel = 0,
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -0600863 .baseArrayLayer = 0,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600864 .arraySize = 1,
865 .flags = 0,
866 };
Chia-I Wuf7458c52015-10-26 21:10:41 +0800867 vkCreateDepthStencilView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600868
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200869 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600870}
Mark Lobodzinski209b5292015-09-17 09:44:05 -0600871#endif // 0
872#endif // MEM_TRACKER_TESTS
873
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600874#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -0700875TEST_F(VkLayerTest, PipelineNotBound) {
876 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600877
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -0700879 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600880
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600881 ASSERT_NO_FATAL_FAILURE(InitState());
882 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600883
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800884 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700885 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
886 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600887
888 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700889 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
890 ds_pool_ci.pNext = NULL;
891 ds_pool_ci.maxSets = 1;
892 ds_pool_ci.poolSizeCount = 1;
893 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600894
895 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -0700896 err =
897 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600898 ASSERT_VK_SUCCESS(err);
899
900 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700901 dsl_binding.binding = 0;
902 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
903 dsl_binding.descriptorCount = 1;
904 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
905 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600906
907 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700908 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
909 ds_layout_ci.pNext = NULL;
910 ds_layout_ci.bindingCount = 1;
911 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600912
913 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700914 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
915 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600916 ASSERT_VK_SUCCESS(err);
917
918 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800919 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800920 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -0700921 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -0600922 alloc_info.descriptorPool = ds_pool;
923 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700924 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
925 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600926 ASSERT_VK_SUCCESS(err);
927
928 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700929 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
930 pipeline_layout_ci.pNext = NULL;
931 pipeline_layout_ci.setLayoutCount = 1;
932 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600933
934 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700935 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
936 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600937 ASSERT_VK_SUCCESS(err);
938
Mark Youngad779052016-01-06 14:26:04 -0700939 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600940
941 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700942 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
943 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600944
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200945 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600946
Chia-I Wuf7458c52015-10-26 21:10:41 +0800947 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
948 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
949 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -0600950}
951
Karl Schultz6addd812016-02-02 17:17:23 -0700952TEST_F(VkLayerTest, BindInvalidMemory) {
953 VkResult err;
954 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -0600955
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -0700957 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600958
Tobin Ehlisec598302015-09-15 15:02:17 -0600959 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -0600960
961 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700962 VkImage image;
963 VkDeviceMemory mem;
964 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -0600965
Karl Schultz6addd812016-02-02 17:17:23 -0700966 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
967 const int32_t tex_width = 32;
968 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -0600969
970 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700971 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
972 image_create_info.pNext = NULL;
973 image_create_info.imageType = VK_IMAGE_TYPE_2D;
974 image_create_info.format = tex_format;
975 image_create_info.extent.width = tex_width;
976 image_create_info.extent.height = tex_height;
977 image_create_info.extent.depth = 1;
978 image_create_info.mipLevels = 1;
979 image_create_info.arrayLayers = 1;
980 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
981 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
982 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
983 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -0600984
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800985 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700986 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
987 mem_alloc.pNext = NULL;
988 mem_alloc.allocationSize = 0;
989 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -0600990
Chia-I Wuf7458c52015-10-26 21:10:41 +0800991 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -0600992 ASSERT_VK_SUCCESS(err);
993
Karl Schultz6addd812016-02-02 17:17:23 -0700994 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -0600995
996 mem_alloc.allocationSize = mem_reqs.size;
997
Karl Schultz6addd812016-02-02 17:17:23 -0700998 pass =
999 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001000 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001001
1002 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001003 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001004 ASSERT_VK_SUCCESS(err);
1005
1006 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001007 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001008
1009 // Try to bind free memory that has been freed
1010 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1011 // This may very well return an error.
1012 (void)err;
1013
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001014 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001015
Chia-I Wuf7458c52015-10-26 21:10:41 +08001016 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001017}
1018
Karl Schultz6addd812016-02-02 17:17:23 -07001019TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1020 VkResult err;
1021 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001022
Karl Schultz6addd812016-02-02 17:17:23 -07001023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1024 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001025
Tobin Ehlisec598302015-09-15 15:02:17 -06001026 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001027
Karl Schultz6addd812016-02-02 17:17:23 -07001028 // Create an image object, allocate memory, destroy the object and then try
1029 // to bind it
1030 VkImage image;
1031 VkDeviceMemory mem;
1032 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001033
Karl Schultz6addd812016-02-02 17:17:23 -07001034 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1035 const int32_t tex_width = 32;
1036 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001037
1038 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001039 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1040 image_create_info.pNext = NULL;
1041 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1042 image_create_info.format = tex_format;
1043 image_create_info.extent.width = tex_width;
1044 image_create_info.extent.height = tex_height;
1045 image_create_info.extent.depth = 1;
1046 image_create_info.mipLevels = 1;
1047 image_create_info.arrayLayers = 1;
1048 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1049 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1050 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1051 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001052
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001053 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001054 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1055 mem_alloc.pNext = NULL;
1056 mem_alloc.allocationSize = 0;
1057 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001058
Chia-I Wuf7458c52015-10-26 21:10:41 +08001059 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001060 ASSERT_VK_SUCCESS(err);
1061
Karl Schultz6addd812016-02-02 17:17:23 -07001062 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001063
1064 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001065 pass =
1066 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001067 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001068
1069 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001070 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001071 ASSERT_VK_SUCCESS(err);
1072
1073 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001074 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001075 ASSERT_VK_SUCCESS(err);
1076
1077 // Now Try to bind memory to this destroyed object
1078 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1079 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001080 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001081
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001082 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001083
Chia-I Wuf7458c52015-10-26 21:10:41 +08001084 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001085}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001086
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001087#endif // OBJ_TRACKER_TESTS
1088
Tobin Ehlis0788f522015-05-26 16:11:58 -06001089#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001090
1091// This is a positive test. No errors should be generated.
1092TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
1093
1094 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1095 "submitted on separate queues followed by a QueueWaitIdle.");
1096
Dustin Graves48458142016-04-29 16:11:55 -06001097 if ((m_device->queue_props.empty()) ||
1098 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001099 return;
1100
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001101 m_errorMonitor->ExpectSuccess();
1102
1103 VkSemaphore semaphore;
1104 VkSemaphoreCreateInfo semaphore_create_info{};
1105 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1106 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1107 &semaphore);
1108
1109 VkCommandPool command_pool;
1110 VkCommandPoolCreateInfo pool_create_info{};
1111 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1112 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1113 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1114 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1115 &command_pool);
1116
1117 VkCommandBuffer command_buffer[2];
1118 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1119 command_buffer_allocate_info.sType =
1120 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1121 command_buffer_allocate_info.commandPool = command_pool;
1122 command_buffer_allocate_info.commandBufferCount = 2;
1123 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1124 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1125 command_buffer);
1126
1127 VkQueue queue = VK_NULL_HANDLE;
1128 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1129 1, &queue);
1130
1131 {
1132 VkCommandBufferBeginInfo begin_info{};
1133 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1134 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1135
1136 vkCmdPipelineBarrier(command_buffer[0],
1137 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1138 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1139 0, nullptr, 0, nullptr);
1140
1141 VkViewport viewport{};
1142 viewport.maxDepth = 1.0f;
1143 viewport.minDepth = 0.0f;
1144 viewport.width = 512;
1145 viewport.height = 512;
1146 viewport.x = 0;
1147 viewport.y = 0;
1148 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1149 vkEndCommandBuffer(command_buffer[0]);
1150 }
1151 {
1152 VkCommandBufferBeginInfo begin_info{};
1153 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1154 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1155
1156 VkViewport viewport{};
1157 viewport.maxDepth = 1.0f;
1158 viewport.minDepth = 0.0f;
1159 viewport.width = 512;
1160 viewport.height = 512;
1161 viewport.x = 0;
1162 viewport.y = 0;
1163 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1164 vkEndCommandBuffer(command_buffer[1]);
1165 }
1166 {
1167 VkSubmitInfo submit_info{};
1168 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1169 submit_info.commandBufferCount = 1;
1170 submit_info.pCommandBuffers = &command_buffer[0];
1171 submit_info.signalSemaphoreCount = 1;
1172 submit_info.pSignalSemaphores = &semaphore;
1173 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1174 }
1175 {
1176 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1177 VkSubmitInfo submit_info{};
1178 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1179 submit_info.commandBufferCount = 1;
1180 submit_info.pCommandBuffers = &command_buffer[1];
1181 submit_info.waitSemaphoreCount = 1;
1182 submit_info.pWaitSemaphores = &semaphore;
1183 submit_info.pWaitDstStageMask = flags;
1184 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1185 }
1186
1187 vkQueueWaitIdle(m_device->m_queue);
1188
1189 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1190 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1191 &command_buffer[0]);
1192 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1193
1194 m_errorMonitor->VerifyNotFound();
1195}
1196
1197// This is a positive test. No errors should be generated.
1198TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
1199
1200 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1201 "submitted on separate queues, the second having a fence"
1202 "followed by a QueueWaitIdle.");
1203
Dustin Graves48458142016-04-29 16:11:55 -06001204 if ((m_device->queue_props.empty()) ||
1205 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001206 return;
1207
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001208 m_errorMonitor->ExpectSuccess();
1209
1210 VkFence fence;
1211 VkFenceCreateInfo fence_create_info{};
1212 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1213 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1214
1215 VkSemaphore semaphore;
1216 VkSemaphoreCreateInfo semaphore_create_info{};
1217 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1218 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1219 &semaphore);
1220
1221 VkCommandPool command_pool;
1222 VkCommandPoolCreateInfo pool_create_info{};
1223 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1224 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1225 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1226 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1227 &command_pool);
1228
1229 VkCommandBuffer command_buffer[2];
1230 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1231 command_buffer_allocate_info.sType =
1232 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1233 command_buffer_allocate_info.commandPool = command_pool;
1234 command_buffer_allocate_info.commandBufferCount = 2;
1235 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1236 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1237 command_buffer);
1238
1239 VkQueue queue = VK_NULL_HANDLE;
1240 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1241 1, &queue);
1242
1243 {
1244 VkCommandBufferBeginInfo begin_info{};
1245 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1246 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1247
1248 vkCmdPipelineBarrier(command_buffer[0],
1249 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1250 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1251 0, nullptr, 0, nullptr);
1252
1253 VkViewport viewport{};
1254 viewport.maxDepth = 1.0f;
1255 viewport.minDepth = 0.0f;
1256 viewport.width = 512;
1257 viewport.height = 512;
1258 viewport.x = 0;
1259 viewport.y = 0;
1260 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1261 vkEndCommandBuffer(command_buffer[0]);
1262 }
1263 {
1264 VkCommandBufferBeginInfo begin_info{};
1265 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1266 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1267
1268 VkViewport viewport{};
1269 viewport.maxDepth = 1.0f;
1270 viewport.minDepth = 0.0f;
1271 viewport.width = 512;
1272 viewport.height = 512;
1273 viewport.x = 0;
1274 viewport.y = 0;
1275 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1276 vkEndCommandBuffer(command_buffer[1]);
1277 }
1278 {
1279 VkSubmitInfo submit_info{};
1280 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1281 submit_info.commandBufferCount = 1;
1282 submit_info.pCommandBuffers = &command_buffer[0];
1283 submit_info.signalSemaphoreCount = 1;
1284 submit_info.pSignalSemaphores = &semaphore;
1285 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1286 }
1287 {
1288 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1289 VkSubmitInfo submit_info{};
1290 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1291 submit_info.commandBufferCount = 1;
1292 submit_info.pCommandBuffers = &command_buffer[1];
1293 submit_info.waitSemaphoreCount = 1;
1294 submit_info.pWaitSemaphores = &semaphore;
1295 submit_info.pWaitDstStageMask = flags;
1296 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1297 }
1298
1299 vkQueueWaitIdle(m_device->m_queue);
1300
1301 vkDestroyFence(m_device->device(), fence, nullptr);
1302 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1303 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1304 &command_buffer[0]);
1305 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1306
1307 m_errorMonitor->VerifyNotFound();
1308}
1309
1310// This is a positive test. No errors should be generated.
1311TEST_F(VkLayerTest,
1312 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
1313
1314 TEST_DESCRIPTION(
1315 "Two command buffers, each in a separate QueueSubmit call "
1316 "submitted on separate queues, the second having a fence"
1317 "followed by two consecutive WaitForFences calls on the same fence.");
1318
Dustin Graves48458142016-04-29 16:11:55 -06001319 if ((m_device->queue_props.empty()) ||
1320 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001321 return;
1322
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001323 m_errorMonitor->ExpectSuccess();
1324
1325 VkFence fence;
1326 VkFenceCreateInfo fence_create_info{};
1327 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1328 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1329
1330 VkSemaphore semaphore;
1331 VkSemaphoreCreateInfo semaphore_create_info{};
1332 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1333 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1334 &semaphore);
1335
1336 VkCommandPool command_pool;
1337 VkCommandPoolCreateInfo pool_create_info{};
1338 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1339 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1340 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1341 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1342 &command_pool);
1343
1344 VkCommandBuffer command_buffer[2];
1345 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1346 command_buffer_allocate_info.sType =
1347 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1348 command_buffer_allocate_info.commandPool = command_pool;
1349 command_buffer_allocate_info.commandBufferCount = 2;
1350 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1351 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1352 command_buffer);
1353
1354 VkQueue queue = VK_NULL_HANDLE;
1355 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1356 1, &queue);
1357
1358 {
1359 VkCommandBufferBeginInfo begin_info{};
1360 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1361 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1362
1363 vkCmdPipelineBarrier(command_buffer[0],
1364 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1365 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1366 0, nullptr, 0, nullptr);
1367
1368 VkViewport viewport{};
1369 viewport.maxDepth = 1.0f;
1370 viewport.minDepth = 0.0f;
1371 viewport.width = 512;
1372 viewport.height = 512;
1373 viewport.x = 0;
1374 viewport.y = 0;
1375 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1376 vkEndCommandBuffer(command_buffer[0]);
1377 }
1378 {
1379 VkCommandBufferBeginInfo begin_info{};
1380 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1381 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1382
1383 VkViewport viewport{};
1384 viewport.maxDepth = 1.0f;
1385 viewport.minDepth = 0.0f;
1386 viewport.width = 512;
1387 viewport.height = 512;
1388 viewport.x = 0;
1389 viewport.y = 0;
1390 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1391 vkEndCommandBuffer(command_buffer[1]);
1392 }
1393 {
1394 VkSubmitInfo submit_info{};
1395 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1396 submit_info.commandBufferCount = 1;
1397 submit_info.pCommandBuffers = &command_buffer[0];
1398 submit_info.signalSemaphoreCount = 1;
1399 submit_info.pSignalSemaphores = &semaphore;
1400 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1401 }
1402 {
1403 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1404 VkSubmitInfo submit_info{};
1405 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1406 submit_info.commandBufferCount = 1;
1407 submit_info.pCommandBuffers = &command_buffer[1];
1408 submit_info.waitSemaphoreCount = 1;
1409 submit_info.pWaitSemaphores = &semaphore;
1410 submit_info.pWaitDstStageMask = flags;
1411 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1412 }
1413
1414 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1415 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1416
1417 vkDestroyFence(m_device->device(), fence, nullptr);
1418 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1419 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1420 &command_buffer[0]);
1421 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1422
1423 m_errorMonitor->VerifyNotFound();
1424}
1425
1426// This is a positive test. No errors should be generated.
1427TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
1428
1429 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1430 "submitted on separate queues, the second having a fence, "
1431 "followed by a WaitForFences call.");
1432
Dustin Graves48458142016-04-29 16:11:55 -06001433 if ((m_device->queue_props.empty()) ||
1434 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001435 return;
1436
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001437 m_errorMonitor->ExpectSuccess();
1438
1439 VkFence fence;
1440 VkFenceCreateInfo fence_create_info{};
1441 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1442 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1443
1444 VkSemaphore semaphore;
1445 VkSemaphoreCreateInfo semaphore_create_info{};
1446 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1447 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1448 &semaphore);
1449
1450 VkCommandPool command_pool;
1451 VkCommandPoolCreateInfo pool_create_info{};
1452 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1453 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1454 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1455 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1456 &command_pool);
1457
1458 VkCommandBuffer command_buffer[2];
1459 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1460 command_buffer_allocate_info.sType =
1461 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1462 command_buffer_allocate_info.commandPool = command_pool;
1463 command_buffer_allocate_info.commandBufferCount = 2;
1464 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1465 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1466 command_buffer);
1467
1468 VkQueue queue = VK_NULL_HANDLE;
1469 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1470 1, &queue);
1471
1472
1473 {
1474 VkCommandBufferBeginInfo begin_info{};
1475 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1476 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1477
1478 vkCmdPipelineBarrier(command_buffer[0],
1479 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1480 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1481 0, nullptr, 0, nullptr);
1482
1483 VkViewport viewport{};
1484 viewport.maxDepth = 1.0f;
1485 viewport.minDepth = 0.0f;
1486 viewport.width = 512;
1487 viewport.height = 512;
1488 viewport.x = 0;
1489 viewport.y = 0;
1490 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1491 vkEndCommandBuffer(command_buffer[0]);
1492 }
1493 {
1494 VkCommandBufferBeginInfo begin_info{};
1495 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1496 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1497
1498 VkViewport viewport{};
1499 viewport.maxDepth = 1.0f;
1500 viewport.minDepth = 0.0f;
1501 viewport.width = 512;
1502 viewport.height = 512;
1503 viewport.x = 0;
1504 viewport.y = 0;
1505 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1506 vkEndCommandBuffer(command_buffer[1]);
1507 }
1508 {
1509 VkSubmitInfo submit_info{};
1510 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1511 submit_info.commandBufferCount = 1;
1512 submit_info.pCommandBuffers = &command_buffer[0];
1513 submit_info.signalSemaphoreCount = 1;
1514 submit_info.pSignalSemaphores = &semaphore;
1515 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1516 }
1517 {
1518 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1519 VkSubmitInfo submit_info{};
1520 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1521 submit_info.commandBufferCount = 1;
1522 submit_info.pCommandBuffers = &command_buffer[1];
1523 submit_info.waitSemaphoreCount = 1;
1524 submit_info.pWaitSemaphores = &semaphore;
1525 submit_info.pWaitDstStageMask = flags;
1526 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1527 }
1528
1529 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1530
1531 vkDestroyFence(m_device->device(), fence, nullptr);
1532 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1533 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1534 &command_buffer[0]);
1535 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1536
1537 m_errorMonitor->VerifyNotFound();
1538}
1539
1540// This is a positive test. No errors should be generated.
1541TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
1542
1543 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1544 "on the same queue, sharing a signal/wait semaphore, the "
1545 "second having a fence, "
1546 "followed by a WaitForFences call.");
1547
1548 m_errorMonitor->ExpectSuccess();
1549
1550 VkFence fence;
1551 VkFenceCreateInfo fence_create_info{};
1552 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1553 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1554
1555 VkSemaphore semaphore;
1556 VkSemaphoreCreateInfo semaphore_create_info{};
1557 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1558 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1559 &semaphore);
1560
1561 VkCommandPool command_pool;
1562 VkCommandPoolCreateInfo pool_create_info{};
1563 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1564 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1565 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1566 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1567 &command_pool);
1568
1569 VkCommandBuffer command_buffer[2];
1570 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1571 command_buffer_allocate_info.sType =
1572 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1573 command_buffer_allocate_info.commandPool = command_pool;
1574 command_buffer_allocate_info.commandBufferCount = 2;
1575 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1576 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1577 command_buffer);
1578
1579 {
1580 VkCommandBufferBeginInfo begin_info{};
1581 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1582 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1583
1584 vkCmdPipelineBarrier(command_buffer[0],
1585 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1586 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1587 0, nullptr, 0, nullptr);
1588
1589 VkViewport viewport{};
1590 viewport.maxDepth = 1.0f;
1591 viewport.minDepth = 0.0f;
1592 viewport.width = 512;
1593 viewport.height = 512;
1594 viewport.x = 0;
1595 viewport.y = 0;
1596 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1597 vkEndCommandBuffer(command_buffer[0]);
1598 }
1599 {
1600 VkCommandBufferBeginInfo begin_info{};
1601 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1602 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1603
1604 VkViewport viewport{};
1605 viewport.maxDepth = 1.0f;
1606 viewport.minDepth = 0.0f;
1607 viewport.width = 512;
1608 viewport.height = 512;
1609 viewport.x = 0;
1610 viewport.y = 0;
1611 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1612 vkEndCommandBuffer(command_buffer[1]);
1613 }
1614 {
1615 VkSubmitInfo submit_info{};
1616 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1617 submit_info.commandBufferCount = 1;
1618 submit_info.pCommandBuffers = &command_buffer[0];
1619 submit_info.signalSemaphoreCount = 1;
1620 submit_info.pSignalSemaphores = &semaphore;
1621 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1622 }
1623 {
1624 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1625 VkSubmitInfo submit_info{};
1626 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1627 submit_info.commandBufferCount = 1;
1628 submit_info.pCommandBuffers = &command_buffer[1];
1629 submit_info.waitSemaphoreCount = 1;
1630 submit_info.pWaitSemaphores = &semaphore;
1631 submit_info.pWaitDstStageMask = flags;
1632 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1633 }
1634
1635 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1636
1637 vkDestroyFence(m_device->device(), fence, nullptr);
1638 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1639 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1640 &command_buffer[0]);
1641 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1642
1643 m_errorMonitor->VerifyNotFound();
1644}
1645
1646// This is a positive test. No errors should be generated.
1647TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
1648
1649 TEST_DESCRIPTION(
1650 "Two command buffers, each in a separate QueueSubmit call "
1651 "on the same queue, no fences, followed by a third QueueSubmit with NO "
1652 "SubmitInfos but with a fence, followed by a WaitForFences call.");
1653
1654 m_errorMonitor->ExpectSuccess();
1655
1656 VkFence fence;
1657 VkFenceCreateInfo fence_create_info{};
1658 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1659 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1660
1661 VkCommandPool command_pool;
1662 VkCommandPoolCreateInfo pool_create_info{};
1663 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1664 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1665 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1666 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1667 &command_pool);
1668
1669 VkCommandBuffer command_buffer[2];
1670 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1671 command_buffer_allocate_info.sType =
1672 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1673 command_buffer_allocate_info.commandPool = command_pool;
1674 command_buffer_allocate_info.commandBufferCount = 2;
1675 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1676 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1677 command_buffer);
1678
1679 {
1680 VkCommandBufferBeginInfo begin_info{};
1681 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1682 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1683
1684 vkCmdPipelineBarrier(command_buffer[0],
1685 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1686 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1687 0, nullptr, 0, nullptr);
1688
1689 VkViewport viewport{};
1690 viewport.maxDepth = 1.0f;
1691 viewport.minDepth = 0.0f;
1692 viewport.width = 512;
1693 viewport.height = 512;
1694 viewport.x = 0;
1695 viewport.y = 0;
1696 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1697 vkEndCommandBuffer(command_buffer[0]);
1698 }
1699 {
1700 VkCommandBufferBeginInfo begin_info{};
1701 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1702 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1703
1704 VkViewport viewport{};
1705 viewport.maxDepth = 1.0f;
1706 viewport.minDepth = 0.0f;
1707 viewport.width = 512;
1708 viewport.height = 512;
1709 viewport.x = 0;
1710 viewport.y = 0;
1711 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1712 vkEndCommandBuffer(command_buffer[1]);
1713 }
1714 {
1715 VkSubmitInfo submit_info{};
1716 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1717 submit_info.commandBufferCount = 1;
1718 submit_info.pCommandBuffers = &command_buffer[0];
1719 submit_info.signalSemaphoreCount = 0;
1720 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
1721 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1722 }
1723 {
1724 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1725 VkSubmitInfo submit_info{};
1726 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1727 submit_info.commandBufferCount = 1;
1728 submit_info.pCommandBuffers = &command_buffer[1];
1729 submit_info.waitSemaphoreCount = 0;
1730 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
1731 submit_info.pWaitDstStageMask = flags;
1732 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1733 }
1734
1735 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
1736
1737 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1738
1739 vkDestroyFence(m_device->device(), fence, nullptr);
1740 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1741 &command_buffer[0]);
1742 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1743
1744 m_errorMonitor->VerifyNotFound();
1745}
1746
1747// This is a positive test. No errors should be generated.
1748TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
1749
1750 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1751 "on the same queue, the second having a fence, followed "
1752 "by a WaitForFences call.");
1753
1754 m_errorMonitor->ExpectSuccess();
1755
1756 VkFence fence;
1757 VkFenceCreateInfo fence_create_info{};
1758 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1759 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1760
1761 VkCommandPool command_pool;
1762 VkCommandPoolCreateInfo pool_create_info{};
1763 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1764 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1765 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1766 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1767 &command_pool);
1768
1769 VkCommandBuffer command_buffer[2];
1770 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1771 command_buffer_allocate_info.sType =
1772 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1773 command_buffer_allocate_info.commandPool = command_pool;
1774 command_buffer_allocate_info.commandBufferCount = 2;
1775 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1776 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1777 command_buffer);
1778
1779 {
1780 VkCommandBufferBeginInfo begin_info{};
1781 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1782 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1783
1784 vkCmdPipelineBarrier(command_buffer[0],
1785 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1786 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1787 0, nullptr, 0, nullptr);
1788
1789 VkViewport viewport{};
1790 viewport.maxDepth = 1.0f;
1791 viewport.minDepth = 0.0f;
1792 viewport.width = 512;
1793 viewport.height = 512;
1794 viewport.x = 0;
1795 viewport.y = 0;
1796 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1797 vkEndCommandBuffer(command_buffer[0]);
1798 }
1799 {
1800 VkCommandBufferBeginInfo begin_info{};
1801 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1802 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1803
1804 VkViewport viewport{};
1805 viewport.maxDepth = 1.0f;
1806 viewport.minDepth = 0.0f;
1807 viewport.width = 512;
1808 viewport.height = 512;
1809 viewport.x = 0;
1810 viewport.y = 0;
1811 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1812 vkEndCommandBuffer(command_buffer[1]);
1813 }
1814 {
1815 VkSubmitInfo submit_info{};
1816 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1817 submit_info.commandBufferCount = 1;
1818 submit_info.pCommandBuffers = &command_buffer[0];
1819 submit_info.signalSemaphoreCount = 0;
1820 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
1821 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1822 }
1823 {
1824 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1825 VkSubmitInfo submit_info{};
1826 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1827 submit_info.commandBufferCount = 1;
1828 submit_info.pCommandBuffers = &command_buffer[1];
1829 submit_info.waitSemaphoreCount = 0;
1830 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
1831 submit_info.pWaitDstStageMask = flags;
1832 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1833 }
1834
1835 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1836
1837 vkDestroyFence(m_device->device(), fence, nullptr);
1838 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1839 &command_buffer[0]);
1840 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1841
1842 m_errorMonitor->VerifyNotFound();
1843}
1844
1845// This is a positive test. No errors should be generated.
1846TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
1847
1848 TEST_DESCRIPTION(
1849 "Two command buffers each in a separate SubmitInfo sent in a single "
1850 "QueueSubmit call followed by a WaitForFences call.");
1851
1852 m_errorMonitor->ExpectSuccess();
1853
1854 VkFence fence;
1855 VkFenceCreateInfo fence_create_info{};
1856 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1857 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1858
1859 VkSemaphore semaphore;
1860 VkSemaphoreCreateInfo semaphore_create_info{};
1861 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1862 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1863 &semaphore);
1864
1865 VkCommandPool command_pool;
1866 VkCommandPoolCreateInfo pool_create_info{};
1867 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1868 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1869 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1870 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1871 &command_pool);
1872
1873 VkCommandBuffer command_buffer[2];
1874 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1875 command_buffer_allocate_info.sType =
1876 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1877 command_buffer_allocate_info.commandPool = command_pool;
1878 command_buffer_allocate_info.commandBufferCount = 2;
1879 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1880 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1881 command_buffer);
1882
1883 {
1884 VkCommandBufferBeginInfo begin_info{};
1885 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1886 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1887
1888 vkCmdPipelineBarrier(command_buffer[0],
1889 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1890 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1891 0, nullptr, 0, nullptr);
1892
1893 VkViewport viewport{};
1894 viewport.maxDepth = 1.0f;
1895 viewport.minDepth = 0.0f;
1896 viewport.width = 512;
1897 viewport.height = 512;
1898 viewport.x = 0;
1899 viewport.y = 0;
1900 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1901 vkEndCommandBuffer(command_buffer[0]);
1902 }
1903 {
1904 VkCommandBufferBeginInfo begin_info{};
1905 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1906 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1907
1908 VkViewport viewport{};
1909 viewport.maxDepth = 1.0f;
1910 viewport.minDepth = 0.0f;
1911 viewport.width = 512;
1912 viewport.height = 512;
1913 viewport.x = 0;
1914 viewport.y = 0;
1915 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1916 vkEndCommandBuffer(command_buffer[1]);
1917 }
1918 {
1919 VkSubmitInfo submit_info[2];
1920 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1921
1922 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1923 submit_info[0].pNext = NULL;
1924 submit_info[0].commandBufferCount = 1;
1925 submit_info[0].pCommandBuffers = &command_buffer[0];
1926 submit_info[0].signalSemaphoreCount = 1;
1927 submit_info[0].pSignalSemaphores = &semaphore;
1928 submit_info[0].waitSemaphoreCount = 0;
1929 submit_info[0].pWaitSemaphores = NULL;
1930 submit_info[0].pWaitDstStageMask = 0;
1931
1932 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1933 submit_info[1].pNext = NULL;
1934 submit_info[1].commandBufferCount = 1;
1935 submit_info[1].pCommandBuffers = &command_buffer[1];
1936 submit_info[1].waitSemaphoreCount = 1;
1937 submit_info[1].pWaitSemaphores = &semaphore;
1938 submit_info[1].pWaitDstStageMask = flags;
1939 submit_info[1].signalSemaphoreCount = 0;
1940 submit_info[1].pSignalSemaphores = NULL;
1941 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
1942 }
1943
1944 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1945
1946 vkDestroyFence(m_device->device(), fence, nullptr);
1947 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1948 &command_buffer[0]);
1949 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1950
1951 m_errorMonitor->VerifyNotFound();
1952}
1953
Karl Schultz6addd812016-02-02 17:17:23 -07001954TEST_F(VkLayerTest, LineWidthStateNotBound) {
1955 m_errorMonitor->SetDesiredFailureMsg(
1956 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001957 "Dynamic line width state not set for this command buffer");
1958
Karl Schultz6addd812016-02-02 17:17:23 -07001959 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line "
1960 "width state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001961
Karl Schultz6addd812016-02-02 17:17:23 -07001962 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1963 BsoFailLineWidth);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001964
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001965 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001966}
1967
Karl Schultz6addd812016-02-02 17:17:23 -07001968TEST_F(VkLayerTest, DepthBiasStateNotBound) {
1969 m_errorMonitor->SetDesiredFailureMsg(
1970 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001971 "Dynamic depth bias state not set for this command buffer");
1972
Karl Schultz6addd812016-02-02 17:17:23 -07001973 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1974 "bias state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001975
Karl Schultz6addd812016-02-02 17:17:23 -07001976 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1977 BsoFailDepthBias);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001978
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001979 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001980}
1981
Karl Schultz6addd812016-02-02 17:17:23 -07001982// Disable these two tests until we can sort out how to track multiple layer
1983// errors
1984TEST_F(VkLayerTest, ViewportStateNotBound) {
1985 m_errorMonitor->SetDesiredFailureMsg(
1986 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001987 "Dynamic viewport state not set for this command buffer");
1988
Karl Schultz6addd812016-02-02 17:17:23 -07001989 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1990 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001991
Karl Schultz6addd812016-02-02 17:17:23 -07001992 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1993 BsoFailViewport);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001994
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001995 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001996}
1997
Karl Schultz6addd812016-02-02 17:17:23 -07001998TEST_F(VkLayerTest, ScissorStateNotBound) {
1999 m_errorMonitor->SetDesiredFailureMsg(
2000 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002001 "Dynamic scissor state not set for this command buffer");
2002
Karl Schultz6addd812016-02-02 17:17:23 -07002003 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
2004 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002005
Karl Schultz6addd812016-02-02 17:17:23 -07002006 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2007 BsoFailScissor);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002008
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002009 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002010}
2011
Karl Schultz6addd812016-02-02 17:17:23 -07002012TEST_F(VkLayerTest, BlendStateNotBound) {
2013 m_errorMonitor->SetDesiredFailureMsg(
2014 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7a1d2352016-03-28 11:18:19 -06002015 "Dynamic blend constants state not set for this command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002016
Karl Schultz6addd812016-02-02 17:17:23 -07002017 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend "
2018 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002019
Karl Schultz6addd812016-02-02 17:17:23 -07002020 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2021 BsoFailBlend);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002022
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002023 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002024}
2025
Karl Schultz6addd812016-02-02 17:17:23 -07002026TEST_F(VkLayerTest, DepthBoundsStateNotBound) {
2027 m_errorMonitor->SetDesiredFailureMsg(
2028 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002029 "Dynamic depth bounds state not set for this command buffer");
2030
Karl Schultz6addd812016-02-02 17:17:23 -07002031 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
2032 "bounds state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002033
Karl Schultz6addd812016-02-02 17:17:23 -07002034 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2035 BsoFailDepthBounds);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002036
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002037 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002038}
2039
Karl Schultz6addd812016-02-02 17:17:23 -07002040TEST_F(VkLayerTest, StencilReadMaskNotSet) {
2041 m_errorMonitor->SetDesiredFailureMsg(
2042 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002043 "Dynamic stencil read mask state not set for this command buffer");
2044
Tobin Ehlis963a4042015-09-29 08:18:34 -06002045 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002046
Karl Schultz6addd812016-02-02 17:17:23 -07002047 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2048 "read mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002049
Karl Schultz6addd812016-02-02 17:17:23 -07002050 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2051 BsoFailStencilReadMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002052
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002053 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002054}
2055
Karl Schultz6addd812016-02-02 17:17:23 -07002056TEST_F(VkLayerTest, StencilWriteMaskNotSet) {
2057 m_errorMonitor->SetDesiredFailureMsg(
2058 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002059 "Dynamic stencil write mask state not set for this command buffer");
2060
Tobin Ehlis963a4042015-09-29 08:18:34 -06002061 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002062
Karl Schultz6addd812016-02-02 17:17:23 -07002063 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2064 "write mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002065
Karl Schultz6addd812016-02-02 17:17:23 -07002066 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2067 BsoFailStencilWriteMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002068
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002069 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002070}
2071
Karl Schultz6addd812016-02-02 17:17:23 -07002072TEST_F(VkLayerTest, StencilReferenceNotSet) {
2073 m_errorMonitor->SetDesiredFailureMsg(
2074 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002075 "Dynamic stencil reference state not set for this command buffer");
2076
Karl Schultz6addd812016-02-02 17:17:23 -07002077 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2078 "reference is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002079
Karl Schultz6addd812016-02-02 17:17:23 -07002080 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2081 BsoFailStencilReference);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002082
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002083 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002084}
2085
Karl Schultz6addd812016-02-02 17:17:23 -07002086TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002087 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002088
Karl Schultz6addd812016-02-02 17:17:23 -07002089 m_errorMonitor->SetDesiredFailureMsg(
2090 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2091 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2092 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002093
2094 VkFenceCreateInfo fenceInfo = {};
2095 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2096 fenceInfo.pNext = NULL;
2097 fenceInfo.flags = 0;
2098
2099 ASSERT_NO_FATAL_FAILURE(InitState());
2100 ASSERT_NO_FATAL_FAILURE(InitViewport());
2101 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2102
Karl Schultz6addd812016-02-02 17:17:23 -07002103 // We luck out b/c by default the framework creates CB w/ the
2104 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002105 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002106 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2107 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002108 EndCommandBuffer();
2109
2110 testFence.init(*m_device, fenceInfo);
2111
2112 // Bypass framework since it does the waits automatically
2113 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002114 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002115 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2116 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002117 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002118 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002119 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002120 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002121 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002122 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002123 submit_info.pSignalSemaphores = NULL;
2124
Karl Schultz6addd812016-02-02 17:17:23 -07002125 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2126 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002127
Karl Schultz6addd812016-02-02 17:17:23 -07002128 // Cause validation error by re-submitting cmd buffer that should only be
2129 // submitted once
2130 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002131
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002132 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002133}
2134
Karl Schultz6addd812016-02-02 17:17:23 -07002135TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002136 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002137 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002138
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002139 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002140 "Unable to allocate 1 descriptors of "
2141 "type "
2142 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002143
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002144 ASSERT_NO_FATAL_FAILURE(InitState());
2145 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002146
Karl Schultz6addd812016-02-02 17:17:23 -07002147 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
2148 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002149 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002150 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2151 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002152
2153 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002154 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2155 ds_pool_ci.pNext = NULL;
2156 ds_pool_ci.flags = 0;
2157 ds_pool_ci.maxSets = 1;
2158 ds_pool_ci.poolSizeCount = 1;
2159 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002160
2161 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002162 err =
2163 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002164 ASSERT_VK_SUCCESS(err);
2165
2166 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002167 dsl_binding.binding = 0;
2168 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2169 dsl_binding.descriptorCount = 1;
2170 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2171 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002172
2173 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002174 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2175 ds_layout_ci.pNext = NULL;
2176 ds_layout_ci.bindingCount = 1;
2177 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002178
2179 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002180 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2181 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002182 ASSERT_VK_SUCCESS(err);
2183
2184 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002185 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002186 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002187 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002188 alloc_info.descriptorPool = ds_pool;
2189 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002190 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2191 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002192
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002193 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002194
Chia-I Wuf7458c52015-10-26 21:10:41 +08002195 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2196 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002197}
2198
Karl Schultz6addd812016-02-02 17:17:23 -07002199TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
2200 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06002201
Karl Schultz6addd812016-02-02 17:17:23 -07002202 m_errorMonitor->SetDesiredFailureMsg(
2203 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2204 "It is invalid to call vkFreeDescriptorSets() with a pool created "
2205 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002206
Tobin Ehlise735c692015-10-08 13:13:50 -06002207 ASSERT_NO_FATAL_FAILURE(InitState());
2208 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06002209
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002210 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002211 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2212 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06002213
2214 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002215 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2216 ds_pool_ci.pNext = NULL;
2217 ds_pool_ci.maxSets = 1;
2218 ds_pool_ci.poolSizeCount = 1;
2219 ds_pool_ci.flags = 0;
2220 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
2221 // app can only call vkResetDescriptorPool on this pool.;
2222 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06002223
2224 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002225 err =
2226 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06002227 ASSERT_VK_SUCCESS(err);
2228
2229 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002230 dsl_binding.binding = 0;
2231 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2232 dsl_binding.descriptorCount = 1;
2233 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2234 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06002235
2236 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002237 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2238 ds_layout_ci.pNext = NULL;
2239 ds_layout_ci.bindingCount = 1;
2240 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06002241
2242 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002243 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2244 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06002245 ASSERT_VK_SUCCESS(err);
2246
2247 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002248 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002249 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002250 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002251 alloc_info.descriptorPool = ds_pool;
2252 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002253 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2254 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06002255 ASSERT_VK_SUCCESS(err);
2256
2257 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002258 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06002259
Chia-I Wuf7458c52015-10-26 21:10:41 +08002260 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2261 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06002262}
2263
Karl Schultz6addd812016-02-02 17:17:23 -07002264TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002265 // Attempt to clear Descriptor Pool with bad object.
2266 // ObjectTracker should catch this.
2267 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2268 "Invalid VkDescriptorPool Object 0xbaad6001");
2269 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
2270 vkResetDescriptorPool(device(), badPool, 0);
2271 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002272}
2273
Karl Schultz6addd812016-02-02 17:17:23 -07002274TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002275 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
2276 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002277 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06002278 // call vkCmdBindDescriptorSets w/ false Descriptor Set
2279 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
2280 VkResult err;
2281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2282 "Invalid VkDescriptorSet Object 0xbaad6001");
2283
2284 ASSERT_NO_FATAL_FAILURE(InitState());
2285
2286 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
2287 layout_bindings[0].binding = 0;
2288 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2289 layout_bindings[0].descriptorCount = 1;
2290 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2291 layout_bindings[0].pImmutableSamplers = NULL;
2292
2293 VkDescriptorSetLayout descriptor_set_layout;
2294 VkDescriptorSetLayoutCreateInfo dslci = {};
2295 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2296 dslci.pNext = NULL;
2297 dslci.bindingCount = 1;
2298 dslci.pBindings = layout_bindings;
2299 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002300 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002301
2302 VkPipelineLayout pipeline_layout;
2303 VkPipelineLayoutCreateInfo plci = {};
2304 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2305 plci.pNext = NULL;
2306 plci.setLayoutCount = 1;
2307 plci.pSetLayouts = &descriptor_set_layout;
2308 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002309 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002310
2311 BeginCommandBuffer();
2312 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2313 pipeline_layout, 0, 1, &badSet, 0, NULL);
2314 m_errorMonitor->VerifyFound();
2315 EndCommandBuffer();
2316 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
2317 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002318}
2319
Karl Schultz6addd812016-02-02 17:17:23 -07002320TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002321 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
2322 // ObjectTracker should catch this.
2323 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
2324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2325 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
2326
2327 VkPipelineLayout pipeline_layout;
2328 VkPipelineLayoutCreateInfo plci = {};
2329 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2330 plci.pNext = NULL;
2331 plci.setLayoutCount = 1;
2332 plci.pSetLayouts = &bad_layout;
2333 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
2334
2335 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002336}
2337
Karl Schultz6addd812016-02-02 17:17:23 -07002338TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002339 // Attempt to bind an invalid Pipeline to a valid Command Buffer
2340 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002341 // Create a valid cmd buffer
2342 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06002343 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
2344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2345 "Invalid VkPipeline Object 0xbaad6001");
2346 ASSERT_NO_FATAL_FAILURE(InitState());
2347 BeginCommandBuffer();
2348 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2349 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
2350 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002351}
2352
Karl Schultz6addd812016-02-02 17:17:23 -07002353TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
2354 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
2355 // CommandBuffer
2356 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002357
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002358 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002359 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002360
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002361 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06002362 ASSERT_NO_FATAL_FAILURE(InitViewport());
2363 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002364 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002365 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2366 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002367
2368 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002369 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2370 ds_pool_ci.pNext = NULL;
2371 ds_pool_ci.maxSets = 1;
2372 ds_pool_ci.poolSizeCount = 1;
2373 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06002374
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002375 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002376 err =
2377 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002378 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002379
Tony Barboureb254902015-07-15 12:50:33 -06002380 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002381 dsl_binding.binding = 0;
2382 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2383 dsl_binding.descriptorCount = 1;
2384 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2385 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002386
Tony Barboureb254902015-07-15 12:50:33 -06002387 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002388 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2389 ds_layout_ci.pNext = NULL;
2390 ds_layout_ci.bindingCount = 1;
2391 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002392 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002393 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2394 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002395 ASSERT_VK_SUCCESS(err);
2396
2397 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002398 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002399 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002400 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002401 alloc_info.descriptorPool = ds_pool;
2402 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002403 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2404 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002405 ASSERT_VK_SUCCESS(err);
2406
Tony Barboureb254902015-07-15 12:50:33 -06002407 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002408 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2409 pipeline_layout_ci.pNext = NULL;
2410 pipeline_layout_ci.setLayoutCount = 1;
2411 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002412
2413 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002414 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2415 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002416 ASSERT_VK_SUCCESS(err);
2417
Karl Schultz6addd812016-02-02 17:17:23 -07002418 VkShaderObj vs(m_device, bindStateVertShaderText,
2419 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06002420 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07002421 // on more devices
2422 VkShaderObj fs(m_device, bindStateFragShaderText,
2423 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002424
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002425 VkPipelineObj pipe(m_device);
2426 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06002427 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06002428 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002429 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06002430
2431 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002432 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2433 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2434 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2435 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2436 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002437
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002438 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002439
Chia-I Wuf7458c52015-10-26 21:10:41 +08002440 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2441 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2442 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002443}
2444
Karl Schultz6addd812016-02-02 17:17:23 -07002445TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002446 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07002447 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002448
Karl Schultz6addd812016-02-02 17:17:23 -07002449 m_errorMonitor->SetDesiredFailureMsg(
2450 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002451 "Attempt to update descriptor with invalid bufferView ");
2452
2453 ASSERT_NO_FATAL_FAILURE(InitState());
2454 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002455 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2456 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002457
2458 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002459 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2460 ds_pool_ci.pNext = NULL;
2461 ds_pool_ci.maxSets = 1;
2462 ds_pool_ci.poolSizeCount = 1;
2463 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002464
2465 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002466 err =
2467 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002468 ASSERT_VK_SUCCESS(err);
2469
2470 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002471 dsl_binding.binding = 0;
2472 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2473 dsl_binding.descriptorCount = 1;
2474 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2475 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002476
2477 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002478 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2479 ds_layout_ci.pNext = NULL;
2480 ds_layout_ci.bindingCount = 1;
2481 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002482 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002483 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2484 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002485 ASSERT_VK_SUCCESS(err);
2486
2487 VkDescriptorSet descriptorSet;
2488 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002489 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002490 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002491 alloc_info.descriptorPool = ds_pool;
2492 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002493 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2494 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002495 ASSERT_VK_SUCCESS(err);
2496
Karl Schultz6addd812016-02-02 17:17:23 -07002497 VkBufferView view =
2498 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002499 VkWriteDescriptorSet descriptor_write;
2500 memset(&descriptor_write, 0, sizeof(descriptor_write));
2501 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2502 descriptor_write.dstSet = descriptorSet;
2503 descriptor_write.dstBinding = 0;
2504 descriptor_write.descriptorCount = 1;
2505 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2506 descriptor_write.pTexelBufferView = &view;
2507
2508 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2509
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002510 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002511
2512 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2513 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2514}
2515
Karl Schultz6addd812016-02-02 17:17:23 -07002516TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
2517 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
2518 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07002519 // 1. No dynamicOffset supplied
2520 // 2. Too many dynamicOffsets supplied
2521 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07002522 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002524 " requires 1 dynamicOffsets, but only "
2525 "0 dynamicOffsets are left in "
2526 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002527
2528 ASSERT_NO_FATAL_FAILURE(InitState());
2529 ASSERT_NO_FATAL_FAILURE(InitViewport());
2530 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2531
2532 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002533 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2534 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002535
2536 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002537 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2538 ds_pool_ci.pNext = NULL;
2539 ds_pool_ci.maxSets = 1;
2540 ds_pool_ci.poolSizeCount = 1;
2541 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002542
2543 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002544 err =
2545 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002546 ASSERT_VK_SUCCESS(err);
2547
2548 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002549 dsl_binding.binding = 0;
2550 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2551 dsl_binding.descriptorCount = 1;
2552 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2553 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002554
2555 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002556 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2557 ds_layout_ci.pNext = NULL;
2558 ds_layout_ci.bindingCount = 1;
2559 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002560 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002561 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2562 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002563 ASSERT_VK_SUCCESS(err);
2564
2565 VkDescriptorSet descriptorSet;
2566 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002567 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002568 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002569 alloc_info.descriptorPool = ds_pool;
2570 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002571 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2572 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002573 ASSERT_VK_SUCCESS(err);
2574
2575 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002576 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2577 pipeline_layout_ci.pNext = NULL;
2578 pipeline_layout_ci.setLayoutCount = 1;
2579 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002580
2581 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002582 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2583 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002584 ASSERT_VK_SUCCESS(err);
2585
2586 // Create a buffer to update the descriptor with
2587 uint32_t qfi = 0;
2588 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002589 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2590 buffCI.size = 1024;
2591 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2592 buffCI.queueFamilyIndexCount = 1;
2593 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002594
2595 VkBuffer dyub;
2596 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2597 ASSERT_VK_SUCCESS(err);
2598 // Correctly update descriptor to avoid "NOT_UPDATED" error
2599 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002600 buffInfo.buffer = dyub;
2601 buffInfo.offset = 0;
2602 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002603
2604 VkWriteDescriptorSet descriptor_write;
2605 memset(&descriptor_write, 0, sizeof(descriptor_write));
2606 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2607 descriptor_write.dstSet = descriptorSet;
2608 descriptor_write.dstBinding = 0;
2609 descriptor_write.descriptorCount = 1;
2610 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2611 descriptor_write.pBufferInfo = &buffInfo;
2612
2613 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2614
2615 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002616 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2617 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2618 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002619 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002620 uint32_t pDynOff[2] = {512, 756};
2621 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07002622 m_errorMonitor->SetDesiredFailureMsg(
2623 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002624 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07002625 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2626 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2627 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12002628 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002629 // Finally cause error due to dynamicOffset being too big
Karl Schultz6addd812016-02-02 17:17:23 -07002630 m_errorMonitor->SetDesiredFailureMsg(
2631 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002632 " from its update, this oversteps its buffer (");
2633 // Create PSO to be used for draw-time errors below
2634 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002635 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002636 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002637 "out gl_PerVertex { \n"
2638 " vec4 gl_Position;\n"
2639 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002640 "void main(){\n"
2641 " gl_Position = vec4(1);\n"
2642 "}\n";
2643 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002644 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002645 "\n"
2646 "layout(location=0) out vec4 x;\n"
2647 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2648 "void main(){\n"
2649 " x = vec4(bar.y);\n"
2650 "}\n";
2651 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2652 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2653 VkPipelineObj pipe(m_device);
2654 pipe.AddShader(&vs);
2655 pipe.AddShader(&fs);
2656 pipe.AddColorAttachment();
2657 pipe.CreateVKPipeline(pipeline_layout, renderPass());
2658
Karl Schultz6addd812016-02-02 17:17:23 -07002659 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2660 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2661 // This update should succeed, but offset size of 512 will overstep buffer
2662 // /w range 1024 & size 1024
2663 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2664 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2665 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07002666 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002667 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002668
2669 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2670 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2671}
2672
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002673TEST_F(VkLayerTest, InvalidPushConstants) {
2674 // Hit push constant error cases:
2675 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
2676 // 2. Incorrectly set push constant size to 0
2677 // 3. Incorrectly set push constant size to non-multiple of 4
2678 // 4. Attempt push constant update that exceeds maxPushConstantSize
2679 VkResult err;
2680 m_errorMonitor->SetDesiredFailureMsg(
2681 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2682 "vkCreatePipelineLayout() call has push constants with offset ");
2683
2684 ASSERT_NO_FATAL_FAILURE(InitState());
2685 ASSERT_NO_FATAL_FAILURE(InitViewport());
2686 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2687
2688 VkPushConstantRange pc_range = {};
2689 pc_range.size = 0xFFFFFFFFu;
2690 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2691 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
2692 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2693 pipeline_layout_ci.pushConstantRangeCount = 1;
2694 pipeline_layout_ci.pPushConstantRanges = &pc_range;
2695
2696 VkPipelineLayout pipeline_layout;
2697 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2698 &pipeline_layout);
2699
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002700 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002701 // Now cause errors due to size 0 and non-4 byte aligned size
2702 pc_range.size = 0;
2703 m_errorMonitor->SetDesiredFailureMsg(
2704 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2705 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
2706 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2707 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002708 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002709 pc_range.size = 1;
2710 m_errorMonitor->SetDesiredFailureMsg(
2711 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2712 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
2713 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2714 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002715 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002716 // Cause error due to bad size in vkCmdPushConstants() call
2717 m_errorMonitor->SetDesiredFailureMsg(
2718 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2719 "vkCmdPushConstants() call has push constants with offset ");
2720 pipeline_layout_ci.pushConstantRangeCount = 0;
2721 pipeline_layout_ci.pPushConstantRanges = NULL;
2722 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2723 &pipeline_layout);
2724 ASSERT_VK_SUCCESS(err);
2725 BeginCommandBuffer();
2726 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
2727 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002728 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002729 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2730}
2731
Karl Schultz6addd812016-02-02 17:17:23 -07002732TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002733 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07002734 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002735
2736 ASSERT_NO_FATAL_FAILURE(InitState());
2737 ASSERT_NO_FATAL_FAILURE(InitViewport());
2738 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2739
2740 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
2741 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002742 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2743 ds_type_count[0].descriptorCount = 10;
2744 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2745 ds_type_count[1].descriptorCount = 2;
2746 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2747 ds_type_count[2].descriptorCount = 2;
2748 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
2749 ds_type_count[3].descriptorCount = 5;
2750 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
2751 // type
2752 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
2753 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
2754 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002755
2756 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002757 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2758 ds_pool_ci.pNext = NULL;
2759 ds_pool_ci.maxSets = 5;
2760 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
2761 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002762
2763 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002764 err =
2765 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002766 ASSERT_VK_SUCCESS(err);
2767
2768 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
2769 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002770 dsl_binding[0].binding = 0;
2771 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2772 dsl_binding[0].descriptorCount = 5;
2773 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
2774 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002775
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002776 // Create layout identical to set0 layout but w/ different stageFlags
2777 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002778 dsl_fs_stage_only.binding = 0;
2779 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2780 dsl_fs_stage_only.descriptorCount = 5;
2781 dsl_fs_stage_only.stageFlags =
2782 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
2783 // bind time
2784 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002785 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002786 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2787 ds_layout_ci.pNext = NULL;
2788 ds_layout_ci.bindingCount = 1;
2789 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002790 static const uint32_t NUM_LAYOUTS = 4;
2791 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002792 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002793 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
2794 // layout for error case
2795 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2796 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002797 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002798 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002799 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2800 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002801 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002802 dsl_binding[0].binding = 0;
2803 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002804 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002805 dsl_binding[1].binding = 1;
2806 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2807 dsl_binding[1].descriptorCount = 2;
2808 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
2809 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002810 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002811 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07002812 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2813 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002814 ASSERT_VK_SUCCESS(err);
2815 dsl_binding[0].binding = 0;
2816 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002817 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002818 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07002819 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2820 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002821 ASSERT_VK_SUCCESS(err);
2822 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002823 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07002824 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2825 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002826 ASSERT_VK_SUCCESS(err);
2827
2828 static const uint32_t NUM_SETS = 4;
2829 VkDescriptorSet descriptorSet[NUM_SETS] = {};
2830 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002831 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002832 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002833 alloc_info.descriptorPool = ds_pool;
2834 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002835 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2836 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002837 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002838 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002839 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002840 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002841 err =
2842 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002843 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002844
2845 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002846 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2847 pipeline_layout_ci.pNext = NULL;
2848 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
2849 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002850
2851 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002852 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2853 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002854 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002855 // Create pipelineLayout with only one setLayout
2856 pipeline_layout_ci.setLayoutCount = 1;
2857 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002858 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2859 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002860 ASSERT_VK_SUCCESS(err);
2861 // Create pipelineLayout with 2 descriptor setLayout at index 0
2862 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
2863 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07002864 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2865 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002866 ASSERT_VK_SUCCESS(err);
2867 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
2868 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
2869 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07002870 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2871 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002872 ASSERT_VK_SUCCESS(err);
2873 // Create pipelineLayout with UB type, but stageFlags for FS only
2874 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
2875 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002876 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2877 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002878 ASSERT_VK_SUCCESS(err);
2879 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
2880 VkDescriptorSetLayout pl_bad_s0[2] = {};
2881 pl_bad_s0[0] = ds_layout_fs_only;
2882 pl_bad_s0[1] = ds_layout[1];
2883 pipeline_layout_ci.setLayoutCount = 2;
2884 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
2885 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07002886 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2887 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002888 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002889
2890 // Create a buffer to update the descriptor with
2891 uint32_t qfi = 0;
2892 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002893 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2894 buffCI.size = 1024;
2895 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2896 buffCI.queueFamilyIndexCount = 1;
2897 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002898
2899 VkBuffer dyub;
2900 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2901 ASSERT_VK_SUCCESS(err);
2902 // Correctly update descriptor to avoid "NOT_UPDATED" error
2903 static const uint32_t NUM_BUFFS = 5;
2904 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002905 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002906 buffInfo[i].buffer = dyub;
2907 buffInfo[i].offset = 0;
2908 buffInfo[i].range = 1024;
2909 }
Karl Schultz6addd812016-02-02 17:17:23 -07002910 VkImage image;
2911 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2912 const int32_t tex_width = 32;
2913 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002914 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002915 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2916 image_create_info.pNext = NULL;
2917 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2918 image_create_info.format = tex_format;
2919 image_create_info.extent.width = tex_width;
2920 image_create_info.extent.height = tex_height;
2921 image_create_info.extent.depth = 1;
2922 image_create_info.mipLevels = 1;
2923 image_create_info.arrayLayers = 1;
2924 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2925 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2926 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2927 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002928 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2929 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002930
Karl Schultz6addd812016-02-02 17:17:23 -07002931 VkMemoryRequirements memReqs;
2932 VkDeviceMemory imageMem;
2933 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002934 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002935 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2936 memAlloc.pNext = NULL;
2937 memAlloc.allocationSize = 0;
2938 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002939 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
2940 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002941 pass =
2942 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002943 ASSERT_TRUE(pass);
2944 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
2945 ASSERT_VK_SUCCESS(err);
2946 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
2947 ASSERT_VK_SUCCESS(err);
2948
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002949 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002950 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2951 image_view_create_info.image = image;
2952 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
2953 image_view_create_info.format = tex_format;
2954 image_view_create_info.subresourceRange.layerCount = 1;
2955 image_view_create_info.subresourceRange.baseMipLevel = 0;
2956 image_view_create_info.subresourceRange.levelCount = 1;
2957 image_view_create_info.subresourceRange.aspectMask =
2958 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002959
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002960 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07002961 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
2962 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002963 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002964 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002965 imageInfo[0].imageView = view;
2966 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2967 imageInfo[1].imageView = view;
2968 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002969 imageInfo[2].imageView = view;
2970 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2971 imageInfo[3].imageView = view;
2972 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002973
2974 static const uint32_t NUM_SET_UPDATES = 3;
2975 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
2976 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2977 descriptor_write[0].dstSet = descriptorSet[0];
2978 descriptor_write[0].dstBinding = 0;
2979 descriptor_write[0].descriptorCount = 5;
2980 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2981 descriptor_write[0].pBufferInfo = buffInfo;
2982 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2983 descriptor_write[1].dstSet = descriptorSet[1];
2984 descriptor_write[1].dstBinding = 0;
2985 descriptor_write[1].descriptorCount = 2;
2986 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2987 descriptor_write[1].pImageInfo = imageInfo;
2988 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2989 descriptor_write[2].dstSet = descriptorSet[1];
2990 descriptor_write[2].dstBinding = 1;
2991 descriptor_write[2].descriptorCount = 2;
2992 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002993 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002994
2995 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002996
Tobin Ehlis88452832015-12-03 09:40:56 -07002997 // Create PSO to be used for draw-time errors below
2998 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002999 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003000 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003001 "out gl_PerVertex {\n"
3002 " vec4 gl_Position;\n"
3003 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003004 "void main(){\n"
3005 " gl_Position = vec4(1);\n"
3006 "}\n";
3007 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003008 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003009 "\n"
3010 "layout(location=0) out vec4 x;\n"
3011 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3012 "void main(){\n"
3013 " x = vec4(bar.y);\n"
3014 "}\n";
3015 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3016 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003017 VkPipelineObj pipe(m_device);
3018 pipe.AddShader(&vs);
3019 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07003020 pipe.AddColorAttachment();
3021 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003022
3023 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003024
Karl Schultz6addd812016-02-02 17:17:23 -07003025 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3026 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3027 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3028 // of PSO
3029 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3030 // cmd_pipeline.c
3031 // due to the fact that cmd_alloc_dset_data() has not been called in
3032 // cmd_bind_graphics_pipeline()
3033 // TODO : Want to cause various binding incompatibility issues here to test
3034 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003035 // First cause various verify_layout_compatibility() fails
3036 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003037 // verify_set_layout_compatibility fail cases:
3038 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3040 " due to: invalid VkPipelineLayout ");
3041 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3042 VK_PIPELINE_BIND_POINT_GRAPHICS,
3043 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3044 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003045 m_errorMonitor->VerifyFound();
3046
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003047 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3049 " attempting to bind set to index 1");
3050 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3051 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3052 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003053 m_errorMonitor->VerifyFound();
3054
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003055 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003056 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3057 // descriptors
3058 m_errorMonitor->SetDesiredFailureMsg(
3059 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003060 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003061 vkCmdBindDescriptorSets(
3062 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3063 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003064 m_errorMonitor->VerifyFound();
3065
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003066 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3067 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003068 m_errorMonitor->SetDesiredFailureMsg(
3069 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003070 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07003071 vkCmdBindDescriptorSets(
3072 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3073 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003074 m_errorMonitor->VerifyFound();
3075
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003076 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3077 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003078 m_errorMonitor->SetDesiredFailureMsg(
3079 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003080 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003081 vkCmdBindDescriptorSets(
3082 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3083 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003084 m_errorMonitor->VerifyFound();
3085
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003086 // Cause INFO messages due to disturbing previously bound Sets
3087 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003088 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3089 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3090 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003091 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07003092 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003093 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003094 " previously bound as set #0 was disturbed ");
3095 vkCmdBindDescriptorSets(
3096 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3097 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003098 m_errorMonitor->VerifyFound();
3099
Karl Schultz6addd812016-02-02 17:17:23 -07003100 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3101 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3102 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003103 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003105 " newly bound as set #0 so set #1 and "
3106 "any subsequent sets were disturbed ");
3107 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3108 VK_PIPELINE_BIND_POINT_GRAPHICS,
3109 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003110 m_errorMonitor->VerifyFound();
3111
Tobin Ehlis88452832015-12-03 09:40:56 -07003112 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07003113 // 1. Error due to not binding required set (we actually use same code as
3114 // above to disturb set0)
3115 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3116 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3117 2, &descriptorSet[0], 0, NULL);
3118 vkCmdBindDescriptorSets(
3119 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3120 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
3121 m_errorMonitor->SetDesiredFailureMsg(
3122 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3123 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07003124 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003125 m_errorMonitor->VerifyFound();
3126
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003127 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003128 // 2. Error due to bound set not being compatible with PSO's
3129 // VkPipelineLayout (diff stageFlags in this case)
3130 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3131 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3132 2, &descriptorSet[0], 0, NULL);
3133 m_errorMonitor->SetDesiredFailureMsg(
3134 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3135 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07003136 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003137 m_errorMonitor->VerifyFound();
3138
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003139 // Remaining clean-up
3140 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003141 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003142 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
3143 }
3144 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
3145 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
3146 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003147 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3148 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3149}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003150
Karl Schultz6addd812016-02-02 17:17:23 -07003151TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003152
Karl Schultz6addd812016-02-02 17:17:23 -07003153 m_errorMonitor->SetDesiredFailureMsg(
3154 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003155 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003156
3157 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003158 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003159 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003160 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003161
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003162 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003163}
3164
Karl Schultz6addd812016-02-02 17:17:23 -07003165TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3166 VkResult err;
3167 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003168
Karl Schultz6addd812016-02-02 17:17:23 -07003169 m_errorMonitor->SetDesiredFailureMsg(
3170 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003171 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003172
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003173 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003174
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003175 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003176 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003177 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003178 cmd.commandPool = m_commandPool;
3179 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003180 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003181
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003182 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003183 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003184
3185 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003186 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003187 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003188 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003189 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003190 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3191 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003192 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003193
3194 // The error should be caught by validation of the BeginCommandBuffer call
3195 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3196
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003197 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003198 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003199}
3200
Karl Schultz6addd812016-02-02 17:17:23 -07003201TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003202 // Cause error due to Begin while recording CB
3203 // Then cause 2 errors for attempting to reset CB w/o having
3204 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3205 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003207 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003208
3209 ASSERT_NO_FATAL_FAILURE(InitState());
3210
3211 // Calls AllocateCommandBuffers
3212 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3213
Karl Schultz6addd812016-02-02 17:17:23 -07003214 // Force the failure by setting the Renderpass and Framebuffer fields with
3215 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003216 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003217 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003218 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3219 cmd_buf_info.pNext = NULL;
3220 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003221 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003222
3223 // Begin CB to transition to recording state
3224 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3225 // Can't re-begin. This should trigger error
3226 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003227 m_errorMonitor->VerifyFound();
3228
Karl Schultz6addd812016-02-02 17:17:23 -07003229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3230 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003231 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3232 // Reset attempt will trigger error due to incorrect CommandPool state
3233 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003234 m_errorMonitor->VerifyFound();
3235
Karl Schultz6addd812016-02-02 17:17:23 -07003236 m_errorMonitor->SetDesiredFailureMsg(
3237 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3238 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003239 // Transition CB to RECORDED state
3240 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3241 // Now attempting to Begin will implicitly reset, which triggers error
3242 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003243 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003244}
3245
Karl Schultz6addd812016-02-02 17:17:23 -07003246TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003247 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003248 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003249
Karl Schultz6addd812016-02-02 17:17:23 -07003250 m_errorMonitor->SetDesiredFailureMsg(
3251 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003252 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3253
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003254 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003255 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003256
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003257 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003258 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3259 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003260
3261 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003262 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3263 ds_pool_ci.pNext = NULL;
3264 ds_pool_ci.maxSets = 1;
3265 ds_pool_ci.poolSizeCount = 1;
3266 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003267
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003268 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003269 err =
3270 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003271 ASSERT_VK_SUCCESS(err);
3272
Tony Barboureb254902015-07-15 12:50:33 -06003273 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003274 dsl_binding.binding = 0;
3275 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3276 dsl_binding.descriptorCount = 1;
3277 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3278 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003279
Tony Barboureb254902015-07-15 12:50:33 -06003280 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003281 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3282 ds_layout_ci.pNext = NULL;
3283 ds_layout_ci.bindingCount = 1;
3284 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003285
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003286 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003287 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3288 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003289 ASSERT_VK_SUCCESS(err);
3290
3291 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003292 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003293 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003294 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003295 alloc_info.descriptorPool = ds_pool;
3296 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003297 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3298 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003299 ASSERT_VK_SUCCESS(err);
3300
Tony Barboureb254902015-07-15 12:50:33 -06003301 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003302 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3303 pipeline_layout_ci.setLayoutCount = 1;
3304 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003305
3306 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003307 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3308 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003309 ASSERT_VK_SUCCESS(err);
3310
Tobin Ehlise68360f2015-10-01 11:15:13 -06003311 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07003312 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06003313
3314 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003315 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3316 vp_state_ci.scissorCount = 1;
3317 vp_state_ci.pScissors = &sc;
3318 vp_state_ci.viewportCount = 1;
3319 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003320
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003321 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3322 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3323 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3324 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3325 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3326 rs_state_ci.depthClampEnable = VK_FALSE;
3327 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3328 rs_state_ci.depthBiasEnable = VK_FALSE;
3329
Tony Barboureb254902015-07-15 12:50:33 -06003330 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003331 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3332 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003333 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003334 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3335 gp_ci.layout = pipeline_layout;
3336 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06003337
3338 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003339 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3340 pc_ci.initialDataSize = 0;
3341 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003342
3343 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003344 VkPipelineCache pipelineCache;
3345
Karl Schultz6addd812016-02-02 17:17:23 -07003346 err =
3347 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06003348 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003349 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3350 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003351
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003352 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003353
Chia-I Wuf7458c52015-10-26 21:10:41 +08003354 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3355 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3356 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3357 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003358}
Tobin Ehlis912df022015-09-17 08:46:18 -06003359/*// TODO : This test should be good, but needs Tess support in compiler to run
3360TEST_F(VkLayerTest, InvalidPatchControlPoints)
3361{
3362 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06003363 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003364
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003366 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
3367primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003368
Tobin Ehlis912df022015-09-17 08:46:18 -06003369 ASSERT_NO_FATAL_FAILURE(InitState());
3370 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06003371
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003372 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06003373 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003374 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003375
3376 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3377 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3378 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003379 ds_pool_ci.poolSizeCount = 1;
3380 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06003381
3382 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003383 err = vkCreateDescriptorPool(m_device->device(),
3384VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06003385 ASSERT_VK_SUCCESS(err);
3386
3387 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08003388 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06003389 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08003390 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003391 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3392 dsl_binding.pImmutableSamplers = NULL;
3393
3394 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003395 ds_layout_ci.sType =
3396VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003397 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003398 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003399 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06003400
3401 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003402 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3403&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003404 ASSERT_VK_SUCCESS(err);
3405
3406 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003407 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
3408VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06003409 ASSERT_VK_SUCCESS(err);
3410
3411 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003412 pipeline_layout_ci.sType =
3413VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003414 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003415 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003416 pipeline_layout_ci.pSetLayouts = &ds_layout;
3417
3418 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003419 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3420&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003421 ASSERT_VK_SUCCESS(err);
3422
3423 VkPipelineShaderStageCreateInfo shaderStages[3];
3424 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
3425
Karl Schultz6addd812016-02-02 17:17:23 -07003426 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
3427this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003428 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07003429 VkShaderObj
3430tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
3431this);
3432 VkShaderObj
3433te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
3434this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003435
Karl Schultz6addd812016-02-02 17:17:23 -07003436 shaderStages[0].sType =
3437VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003438 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003439 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003440 shaderStages[1].sType =
3441VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003442 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003443 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003444 shaderStages[2].sType =
3445VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003446 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003447 shaderStages[2].shader = te.handle();
3448
3449 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003450 iaCI.sType =
3451VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08003452 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06003453
3454 VkPipelineTessellationStateCreateInfo tsCI = {};
3455 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
3456 tsCI.patchControlPoints = 0; // This will cause an error
3457
3458 VkGraphicsPipelineCreateInfo gp_ci = {};
3459 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3460 gp_ci.pNext = NULL;
3461 gp_ci.stageCount = 3;
3462 gp_ci.pStages = shaderStages;
3463 gp_ci.pVertexInputState = NULL;
3464 gp_ci.pInputAssemblyState = &iaCI;
3465 gp_ci.pTessellationState = &tsCI;
3466 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003467 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06003468 gp_ci.pMultisampleState = NULL;
3469 gp_ci.pDepthStencilState = NULL;
3470 gp_ci.pColorBlendState = NULL;
3471 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3472 gp_ci.layout = pipeline_layout;
3473 gp_ci.renderPass = renderPass();
3474
3475 VkPipelineCacheCreateInfo pc_ci = {};
3476 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3477 pc_ci.pNext = NULL;
3478 pc_ci.initialSize = 0;
3479 pc_ci.initialData = 0;
3480 pc_ci.maxSize = 0;
3481
3482 VkPipeline pipeline;
3483 VkPipelineCache pipelineCache;
3484
Karl Schultz6addd812016-02-02 17:17:23 -07003485 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
3486&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06003487 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003488 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3489&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06003490
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003491 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003492
Chia-I Wuf7458c52015-10-26 21:10:41 +08003493 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3494 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3495 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3496 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06003497}
3498*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06003499// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07003500TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07003501 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003502
Karl Schultz6addd812016-02-02 17:17:23 -07003503 m_errorMonitor->SetDesiredFailureMsg(
3504 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003505 "Gfx Pipeline viewport count (1) must match scissor count (0).");
3506
Tobin Ehlise68360f2015-10-01 11:15:13 -06003507 ASSERT_NO_FATAL_FAILURE(InitState());
3508 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003509
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003510 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003511 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3512 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003513
3514 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003515 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3516 ds_pool_ci.maxSets = 1;
3517 ds_pool_ci.poolSizeCount = 1;
3518 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003519
3520 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003521 err =
3522 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003523 ASSERT_VK_SUCCESS(err);
3524
3525 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003526 dsl_binding.binding = 0;
3527 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3528 dsl_binding.descriptorCount = 1;
3529 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003530
3531 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003532 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3533 ds_layout_ci.bindingCount = 1;
3534 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003535
3536 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003537 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3538 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003539 ASSERT_VK_SUCCESS(err);
3540
3541 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003542 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003543 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003544 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003545 alloc_info.descriptorPool = ds_pool;
3546 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003547 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3548 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003549 ASSERT_VK_SUCCESS(err);
3550
3551 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003552 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3553 pipeline_layout_ci.setLayoutCount = 1;
3554 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003555
3556 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003557 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3558 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003559 ASSERT_VK_SUCCESS(err);
3560
3561 VkViewport vp = {}; // Just need dummy vp to point to
3562
3563 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003564 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3565 vp_state_ci.scissorCount = 0;
3566 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
3567 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003568
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003569 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3570 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3571 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3572 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3573 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3574 rs_state_ci.depthClampEnable = VK_FALSE;
3575 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3576 rs_state_ci.depthBiasEnable = VK_FALSE;
3577
Cody Northropeb3a6c12015-10-05 14:44:45 -06003578 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003579 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003580
Karl Schultz6addd812016-02-02 17:17:23 -07003581 VkShaderObj vs(m_device, bindStateVertShaderText,
3582 VK_SHADER_STAGE_VERTEX_BIT, this);
3583 VkShaderObj fs(m_device, bindStateFragShaderText,
3584 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003585 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003586 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003587 shaderStages[0] = vs.GetStageCreateInfo();
3588 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003589
3590 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003591 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3592 gp_ci.stageCount = 2;
3593 gp_ci.pStages = shaderStages;
3594 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003595 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003596 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3597 gp_ci.layout = pipeline_layout;
3598 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003599
3600 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003601 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003602
3603 VkPipeline pipeline;
3604 VkPipelineCache pipelineCache;
3605
Karl Schultz6addd812016-02-02 17:17:23 -07003606 err =
3607 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003608 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003609 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3610 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003611
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003612 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003613
Chia-I Wuf7458c52015-10-26 21:10:41 +08003614 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3615 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3616 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3617 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003618}
Karl Schultz6addd812016-02-02 17:17:23 -07003619// Don't set viewport state in PSO. This is an error b/c we always need this
3620// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06003621// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07003622TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06003623 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003624 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003625
Karl Schultz6addd812016-02-02 17:17:23 -07003626 m_errorMonitor->SetDesiredFailureMsg(
3627 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003628 "Gfx Pipeline pViewportState is null. Even if ");
3629
Tobin Ehlise68360f2015-10-01 11:15:13 -06003630 ASSERT_NO_FATAL_FAILURE(InitState());
3631 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003632
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003633 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003634 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3635 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003636
3637 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003638 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3639 ds_pool_ci.maxSets = 1;
3640 ds_pool_ci.poolSizeCount = 1;
3641 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003642
3643 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003644 err =
3645 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003646 ASSERT_VK_SUCCESS(err);
3647
3648 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003649 dsl_binding.binding = 0;
3650 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3651 dsl_binding.descriptorCount = 1;
3652 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003653
3654 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003655 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3656 ds_layout_ci.bindingCount = 1;
3657 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003658
3659 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003660 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3661 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003662 ASSERT_VK_SUCCESS(err);
3663
3664 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003665 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003666 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003667 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003668 alloc_info.descriptorPool = ds_pool;
3669 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003670 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3671 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003672 ASSERT_VK_SUCCESS(err);
3673
3674 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003675 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3676 pipeline_layout_ci.setLayoutCount = 1;
3677 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003678
3679 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003680 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3681 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003682 ASSERT_VK_SUCCESS(err);
3683
3684 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3685 // Set scissor as dynamic to avoid second error
3686 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003687 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3688 dyn_state_ci.dynamicStateCount = 1;
3689 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003690
Cody Northropeb3a6c12015-10-05 14:44:45 -06003691 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003692 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003693
Karl Schultz6addd812016-02-02 17:17:23 -07003694 VkShaderObj vs(m_device, bindStateVertShaderText,
3695 VK_SHADER_STAGE_VERTEX_BIT, this);
3696 VkShaderObj fs(m_device, bindStateFragShaderText,
3697 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003698 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003699 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003700 shaderStages[0] = vs.GetStageCreateInfo();
3701 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003702
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003703
3704 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3705 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3706 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3707 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3708 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3709 rs_state_ci.depthClampEnable = VK_FALSE;
3710 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3711 rs_state_ci.depthBiasEnable = VK_FALSE;
3712
Tobin Ehlise68360f2015-10-01 11:15:13 -06003713 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003714 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3715 gp_ci.stageCount = 2;
3716 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003717 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003718 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
3719 // should cause validation error
3720 gp_ci.pDynamicState = &dyn_state_ci;
3721 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3722 gp_ci.layout = pipeline_layout;
3723 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003724
3725 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003726 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003727
3728 VkPipeline pipeline;
3729 VkPipelineCache pipelineCache;
3730
Karl Schultz6addd812016-02-02 17:17:23 -07003731 err =
3732 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003733 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003734 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3735 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003736
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003737 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003738
Chia-I Wuf7458c52015-10-26 21:10:41 +08003739 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3740 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3741 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3742 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003743}
3744// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07003745// Then run second test where dynamic scissor count doesn't match PSO scissor
3746// count
3747TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
3748 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003749
Karl Schultz6addd812016-02-02 17:17:23 -07003750 m_errorMonitor->SetDesiredFailureMsg(
3751 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003752 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
3753
Tobin Ehlise68360f2015-10-01 11:15:13 -06003754 ASSERT_NO_FATAL_FAILURE(InitState());
3755 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003756
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003757 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003758 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3759 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003760
3761 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003762 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3763 ds_pool_ci.maxSets = 1;
3764 ds_pool_ci.poolSizeCount = 1;
3765 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003766
3767 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003768 err =
3769 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003770 ASSERT_VK_SUCCESS(err);
3771
3772 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003773 dsl_binding.binding = 0;
3774 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3775 dsl_binding.descriptorCount = 1;
3776 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003777
3778 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003779 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3780 ds_layout_ci.bindingCount = 1;
3781 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003782
3783 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003784 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3785 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003786 ASSERT_VK_SUCCESS(err);
3787
3788 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003789 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003790 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003791 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003792 alloc_info.descriptorPool = ds_pool;
3793 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003794 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3795 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003796 ASSERT_VK_SUCCESS(err);
3797
3798 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003799 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3800 pipeline_layout_ci.setLayoutCount = 1;
3801 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003802
3803 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003804 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3805 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003806 ASSERT_VK_SUCCESS(err);
3807
3808 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003809 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3810 vp_state_ci.viewportCount = 1;
3811 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
3812 vp_state_ci.scissorCount = 1;
3813 vp_state_ci.pScissors =
3814 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06003815
3816 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3817 // Set scissor as dynamic to avoid that error
3818 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003819 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3820 dyn_state_ci.dynamicStateCount = 1;
3821 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003822
Cody Northropeb3a6c12015-10-05 14:44:45 -06003823 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003824 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003825
Karl Schultz6addd812016-02-02 17:17:23 -07003826 VkShaderObj vs(m_device, bindStateVertShaderText,
3827 VK_SHADER_STAGE_VERTEX_BIT, this);
3828 VkShaderObj fs(m_device, bindStateFragShaderText,
3829 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003830 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003831 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003832 shaderStages[0] = vs.GetStageCreateInfo();
3833 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003834
Cody Northropf6622dc2015-10-06 10:33:21 -06003835 VkPipelineVertexInputStateCreateInfo vi_ci = {};
3836 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3837 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003838 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06003839 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003840 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06003841 vi_ci.pVertexAttributeDescriptions = nullptr;
3842
3843 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
3844 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
3845 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3846
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003847 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003848 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06003849 rs_ci.pNext = nullptr;
3850
Mark Youngc89c6312016-03-31 16:03:20 -06003851 VkPipelineColorBlendAttachmentState att = {};
3852 att.blendEnable = VK_FALSE;
3853 att.colorWriteMask = 0xf;
3854
Cody Northropf6622dc2015-10-06 10:33:21 -06003855 VkPipelineColorBlendStateCreateInfo cb_ci = {};
3856 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
3857 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06003858 cb_ci.attachmentCount = 1;
3859 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06003860
Tobin Ehlise68360f2015-10-01 11:15:13 -06003861 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003862 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3863 gp_ci.stageCount = 2;
3864 gp_ci.pStages = shaderStages;
3865 gp_ci.pVertexInputState = &vi_ci;
3866 gp_ci.pInputAssemblyState = &ia_ci;
3867 gp_ci.pViewportState = &vp_state_ci;
3868 gp_ci.pRasterizationState = &rs_ci;
3869 gp_ci.pColorBlendState = &cb_ci;
3870 gp_ci.pDynamicState = &dyn_state_ci;
3871 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3872 gp_ci.layout = pipeline_layout;
3873 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003874
3875 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003876 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003877
3878 VkPipeline pipeline;
3879 VkPipelineCache pipelineCache;
3880
Karl Schultz6addd812016-02-02 17:17:23 -07003881 err =
3882 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003883 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003884 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3885 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003886
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003887 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003888
Tobin Ehlisd332f282015-10-02 11:00:56 -06003889 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07003890 // First need to successfully create the PSO from above by setting
3891 // pViewports
3892 m_errorMonitor->SetDesiredFailureMsg(
3893 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3894 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
3895 "scissorCount is 1. These counts must match.");
3896
3897 VkViewport vp = {}; // Just need dummy vp to point to
3898 vp_state_ci.pViewports = &vp;
3899 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3900 &gp_ci, NULL, &pipeline);
3901 ASSERT_VK_SUCCESS(err);
3902 BeginCommandBuffer();
3903 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3904 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3905 VkRect2D scissors[2] = {}; // don't care about data
3906 // Count of 2 doesn't match PSO count of 1
3907 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
3908 Draw(1, 0, 0, 0);
3909
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003910 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07003911
3912 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3913 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3914 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3915 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3916}
3917// Create PSO w/o non-zero scissorCount but no scissor data
3918// Then run second test where dynamic viewportCount doesn't match PSO
3919// viewportCount
3920TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
3921 VkResult err;
3922
3923 m_errorMonitor->SetDesiredFailureMsg(
3924 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3925 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
3926
3927 ASSERT_NO_FATAL_FAILURE(InitState());
3928 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3929
3930 VkDescriptorPoolSize ds_type_count = {};
3931 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3932 ds_type_count.descriptorCount = 1;
3933
3934 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3935 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3936 ds_pool_ci.maxSets = 1;
3937 ds_pool_ci.poolSizeCount = 1;
3938 ds_pool_ci.pPoolSizes = &ds_type_count;
3939
3940 VkDescriptorPool ds_pool;
3941 err =
3942 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
3943 ASSERT_VK_SUCCESS(err);
3944
3945 VkDescriptorSetLayoutBinding dsl_binding = {};
3946 dsl_binding.binding = 0;
3947 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3948 dsl_binding.descriptorCount = 1;
3949 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3950
3951 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3952 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3953 ds_layout_ci.bindingCount = 1;
3954 ds_layout_ci.pBindings = &dsl_binding;
3955
3956 VkDescriptorSetLayout ds_layout;
3957 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3958 &ds_layout);
3959 ASSERT_VK_SUCCESS(err);
3960
3961 VkDescriptorSet descriptorSet;
3962 VkDescriptorSetAllocateInfo alloc_info = {};
3963 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3964 alloc_info.descriptorSetCount = 1;
3965 alloc_info.descriptorPool = ds_pool;
3966 alloc_info.pSetLayouts = &ds_layout;
3967 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3968 &descriptorSet);
3969 ASSERT_VK_SUCCESS(err);
3970
3971 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3972 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3973 pipeline_layout_ci.setLayoutCount = 1;
3974 pipeline_layout_ci.pSetLayouts = &ds_layout;
3975
3976 VkPipelineLayout pipeline_layout;
3977 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3978 &pipeline_layout);
3979 ASSERT_VK_SUCCESS(err);
3980
3981 VkPipelineViewportStateCreateInfo vp_state_ci = {};
3982 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3983 vp_state_ci.scissorCount = 1;
3984 vp_state_ci.pScissors =
3985 NULL; // Null scissor w/ count of 1 should cause error
3986 vp_state_ci.viewportCount = 1;
3987 vp_state_ci.pViewports =
3988 NULL; // vp is dynamic (below) so this won't cause error
3989
3990 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
3991 // Set scissor as dynamic to avoid that error
3992 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
3993 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3994 dyn_state_ci.dynamicStateCount = 1;
3995 dyn_state_ci.pDynamicStates = &vp_state;
3996
3997 VkPipelineShaderStageCreateInfo shaderStages[2];
3998 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
3999
4000 VkShaderObj vs(m_device, bindStateVertShaderText,
4001 VK_SHADER_STAGE_VERTEX_BIT, this);
4002 VkShaderObj fs(m_device, bindStateFragShaderText,
4003 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004004 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004005 // but add it to be able to run on more devices
4006 shaderStages[0] = vs.GetStageCreateInfo();
4007 shaderStages[1] = fs.GetStageCreateInfo();
4008
4009 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4010 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4011 vi_ci.pNext = nullptr;
4012 vi_ci.vertexBindingDescriptionCount = 0;
4013 vi_ci.pVertexBindingDescriptions = nullptr;
4014 vi_ci.vertexAttributeDescriptionCount = 0;
4015 vi_ci.pVertexAttributeDescriptions = nullptr;
4016
4017 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4018 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4019 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4020
4021 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4022 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4023 rs_ci.pNext = nullptr;
4024
Mark Youngc89c6312016-03-31 16:03:20 -06004025 VkPipelineColorBlendAttachmentState att = {};
4026 att.blendEnable = VK_FALSE;
4027 att.colorWriteMask = 0xf;
4028
Karl Schultz6addd812016-02-02 17:17:23 -07004029 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4030 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4031 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004032 cb_ci.attachmentCount = 1;
4033 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004034
4035 VkGraphicsPipelineCreateInfo gp_ci = {};
4036 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4037 gp_ci.stageCount = 2;
4038 gp_ci.pStages = shaderStages;
4039 gp_ci.pVertexInputState = &vi_ci;
4040 gp_ci.pInputAssemblyState = &ia_ci;
4041 gp_ci.pViewportState = &vp_state_ci;
4042 gp_ci.pRasterizationState = &rs_ci;
4043 gp_ci.pColorBlendState = &cb_ci;
4044 gp_ci.pDynamicState = &dyn_state_ci;
4045 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4046 gp_ci.layout = pipeline_layout;
4047 gp_ci.renderPass = renderPass();
4048
4049 VkPipelineCacheCreateInfo pc_ci = {};
4050 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4051
4052 VkPipeline pipeline;
4053 VkPipelineCache pipelineCache;
4054
4055 err =
4056 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4057 ASSERT_VK_SUCCESS(err);
4058 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4059 &gp_ci, NULL, &pipeline);
4060
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004061 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004062
4063 // Now hit second fail case where we set scissor w/ different count than PSO
4064 // First need to successfully create the PSO from above by setting
4065 // pViewports
4066 m_errorMonitor->SetDesiredFailureMsg(
4067 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4068 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4069 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004070
Tobin Ehlisd332f282015-10-02 11:00:56 -06004071 VkRect2D sc = {}; // Just need dummy vp to point to
4072 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004073 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4074 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004075 ASSERT_VK_SUCCESS(err);
4076 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004077 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4078 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004079 VkViewport viewports[2] = {}; // don't care about data
4080 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004081 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004082 Draw(1, 0, 0, 0);
4083
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004084 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004085
Chia-I Wuf7458c52015-10-26 21:10:41 +08004086 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4087 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4088 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4089 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004090}
4091
Mark Young7394fdd2016-03-31 14:56:43 -06004092TEST_F(VkLayerTest, PSOLineWidthInvalid) {
4093 VkResult err;
4094
4095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4096 "Attempt to set lineWidth to 0");
4097
4098 ASSERT_NO_FATAL_FAILURE(InitState());
4099 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4100
4101 VkDescriptorPoolSize ds_type_count = {};
4102 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4103 ds_type_count.descriptorCount = 1;
4104
4105 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4106 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4107 ds_pool_ci.maxSets = 1;
4108 ds_pool_ci.poolSizeCount = 1;
4109 ds_pool_ci.pPoolSizes = &ds_type_count;
4110
4111 VkDescriptorPool ds_pool;
4112 err =
4113 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4114 ASSERT_VK_SUCCESS(err);
4115
4116 VkDescriptorSetLayoutBinding dsl_binding = {};
4117 dsl_binding.binding = 0;
4118 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4119 dsl_binding.descriptorCount = 1;
4120 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4121
4122 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4123 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4124 ds_layout_ci.bindingCount = 1;
4125 ds_layout_ci.pBindings = &dsl_binding;
4126
4127 VkDescriptorSetLayout ds_layout;
4128 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4129 &ds_layout);
4130 ASSERT_VK_SUCCESS(err);
4131
4132 VkDescriptorSet descriptorSet;
4133 VkDescriptorSetAllocateInfo alloc_info = {};
4134 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4135 alloc_info.descriptorSetCount = 1;
4136 alloc_info.descriptorPool = ds_pool;
4137 alloc_info.pSetLayouts = &ds_layout;
4138 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4139 &descriptorSet);
4140 ASSERT_VK_SUCCESS(err);
4141
4142 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4143 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4144 pipeline_layout_ci.setLayoutCount = 1;
4145 pipeline_layout_ci.pSetLayouts = &ds_layout;
4146
4147 VkPipelineLayout pipeline_layout;
4148 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4149 &pipeline_layout);
4150 ASSERT_VK_SUCCESS(err);
4151
4152 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4153 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4154 vp_state_ci.scissorCount = 1;
4155 vp_state_ci.pScissors = NULL;
4156 vp_state_ci.viewportCount = 1;
4157 vp_state_ci.pViewports = NULL;
4158
4159 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
4160 VK_DYNAMIC_STATE_SCISSOR,
4161 VK_DYNAMIC_STATE_LINE_WIDTH};
4162 // Set scissor as dynamic to avoid that error
4163 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4164 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4165 dyn_state_ci.dynamicStateCount = 2;
4166 dyn_state_ci.pDynamicStates = dynamic_states;
4167
4168 VkPipelineShaderStageCreateInfo shaderStages[2];
4169 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4170
4171 VkShaderObj vs(m_device, bindStateVertShaderText,
4172 VK_SHADER_STAGE_VERTEX_BIT, this);
4173 VkShaderObj fs(m_device, bindStateFragShaderText,
4174 VK_SHADER_STAGE_FRAGMENT_BIT,
4175 this); // TODO - We shouldn't need a fragment shader
4176 // but add it to be able to run on more devices
4177 shaderStages[0] = vs.GetStageCreateInfo();
4178 shaderStages[1] = fs.GetStageCreateInfo();
4179
4180 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4181 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4182 vi_ci.pNext = nullptr;
4183 vi_ci.vertexBindingDescriptionCount = 0;
4184 vi_ci.pVertexBindingDescriptions = nullptr;
4185 vi_ci.vertexAttributeDescriptionCount = 0;
4186 vi_ci.pVertexAttributeDescriptions = nullptr;
4187
4188 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4189 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4190 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4191
4192 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4193 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4194 rs_ci.pNext = nullptr;
4195
4196 // Check too low (line width of 0.0f).
4197 rs_ci.lineWidth = 0.0f;
4198
4199 VkPipelineColorBlendAttachmentState att = {};
4200 att.blendEnable = VK_FALSE;
4201 att.colorWriteMask = 0xf;
4202
4203 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4204 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4205 cb_ci.pNext = nullptr;
4206 cb_ci.attachmentCount = 1;
4207 cb_ci.pAttachments = &att;
4208
4209 VkGraphicsPipelineCreateInfo gp_ci = {};
4210 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4211 gp_ci.stageCount = 2;
4212 gp_ci.pStages = shaderStages;
4213 gp_ci.pVertexInputState = &vi_ci;
4214 gp_ci.pInputAssemblyState = &ia_ci;
4215 gp_ci.pViewportState = &vp_state_ci;
4216 gp_ci.pRasterizationState = &rs_ci;
4217 gp_ci.pColorBlendState = &cb_ci;
4218 gp_ci.pDynamicState = &dyn_state_ci;
4219 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4220 gp_ci.layout = pipeline_layout;
4221 gp_ci.renderPass = renderPass();
4222
4223 VkPipelineCacheCreateInfo pc_ci = {};
4224 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4225
4226 VkPipeline pipeline;
4227 VkPipelineCache pipelineCache;
4228
4229 err =
4230 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4231 ASSERT_VK_SUCCESS(err);
4232 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4233 &gp_ci, NULL, &pipeline);
4234
4235 m_errorMonitor->VerifyFound();
4236
4237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4238 "Attempt to set lineWidth to 65536");
4239
4240 // Check too high (line width of 65536.0f).
4241 rs_ci.lineWidth = 65536.0f;
4242
4243 err =
4244 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4245 ASSERT_VK_SUCCESS(err);
4246 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4247 &gp_ci, NULL, &pipeline);
4248
4249 m_errorMonitor->VerifyFound();
4250
4251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4252 "Attempt to set lineWidth to 0");
4253
4254 dyn_state_ci.dynamicStateCount = 3;
4255
4256 rs_ci.lineWidth = 1.0f;
4257
4258 err =
4259 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4260 ASSERT_VK_SUCCESS(err);
4261 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4262 &gp_ci, NULL, &pipeline);
4263 BeginCommandBuffer();
4264 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4265 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4266
4267 // Check too low with dynamic setting.
4268 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 0.0f);
4269 m_errorMonitor->VerifyFound();
4270
4271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4272 "Attempt to set lineWidth to 65536");
4273
4274 // Check too high with dynamic setting.
4275 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
4276 m_errorMonitor->VerifyFound();
4277 EndCommandBuffer();
4278
4279 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4280 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4281 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4282 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4283}
4284
Karl Schultz6addd812016-02-02 17:17:23 -07004285TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004286 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004287 m_errorMonitor->SetDesiredFailureMsg(
4288 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004289 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004290
4291 ASSERT_NO_FATAL_FAILURE(InitState());
4292 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004293
Tony Barbourfe3351b2015-07-28 10:17:20 -06004294 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004295 // Don't care about RenderPass handle b/c error should be flagged before
4296 // that
4297 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
4298 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004299
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004300 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004301}
4302
Karl Schultz6addd812016-02-02 17:17:23 -07004303TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004304 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004305 m_errorMonitor->SetDesiredFailureMsg(
4306 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004307 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004308
4309 ASSERT_NO_FATAL_FAILURE(InitState());
4310 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004311
Tony Barbourfe3351b2015-07-28 10:17:20 -06004312 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004313 // Just create a dummy Renderpass that's non-NULL so we can get to the
4314 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06004315 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004316 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4317 rp_begin.pNext = NULL;
4318 rp_begin.renderPass = renderPass();
4319 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004320
Karl Schultz6addd812016-02-02 17:17:23 -07004321 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
4322 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004323
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004324 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004325}
4326
Karl Schultz6addd812016-02-02 17:17:23 -07004327TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004328 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004329 m_errorMonitor->SetDesiredFailureMsg(
4330 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004331 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004332
4333 ASSERT_NO_FATAL_FAILURE(InitState());
4334 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004335
4336 // Renderpass is started here
4337 BeginCommandBuffer();
4338
4339 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004340 vk_testing::Buffer dstBuffer;
4341 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004342
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004343 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004344
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004345 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004346}
4347
Karl Schultz6addd812016-02-02 17:17:23 -07004348TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004349 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004350 m_errorMonitor->SetDesiredFailureMsg(
4351 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004352 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004353
4354 ASSERT_NO_FATAL_FAILURE(InitState());
4355 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004356
4357 // Renderpass is started here
4358 BeginCommandBuffer();
4359
4360 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004361 vk_testing::Buffer dstBuffer;
4362 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004363
Karl Schultz6addd812016-02-02 17:17:23 -07004364 VkDeviceSize dstOffset = 0;
4365 VkDeviceSize dataSize = 1024;
4366 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004367
Karl Schultz6addd812016-02-02 17:17:23 -07004368 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
4369 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004370
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004371 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004372}
4373
Karl Schultz6addd812016-02-02 17:17:23 -07004374TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004375 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004376 m_errorMonitor->SetDesiredFailureMsg(
4377 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004378 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004379
4380 ASSERT_NO_FATAL_FAILURE(InitState());
4381 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004382
4383 // Renderpass is started here
4384 BeginCommandBuffer();
4385
Michael Lentine0a369f62016-02-03 16:51:46 -06004386 VkClearColorValue clear_color;
4387 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07004388 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
4389 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4390 const int32_t tex_width = 32;
4391 const int32_t tex_height = 32;
4392 VkImageCreateInfo image_create_info = {};
4393 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4394 image_create_info.pNext = NULL;
4395 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4396 image_create_info.format = tex_format;
4397 image_create_info.extent.width = tex_width;
4398 image_create_info.extent.height = tex_height;
4399 image_create_info.extent.depth = 1;
4400 image_create_info.mipLevels = 1;
4401 image_create_info.arrayLayers = 1;
4402 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4403 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4404 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004405
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004406 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004407 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4408 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004409
Karl Schultz6addd812016-02-02 17:17:23 -07004410 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4411 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004412
Karl Schultz6addd812016-02-02 17:17:23 -07004413 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4414 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004415
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004416 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004417}
4418
Karl Schultz6addd812016-02-02 17:17:23 -07004419TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004420 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004421 m_errorMonitor->SetDesiredFailureMsg(
4422 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004423 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004424
4425 ASSERT_NO_FATAL_FAILURE(InitState());
4426 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004427
4428 // Renderpass is started here
4429 BeginCommandBuffer();
4430
4431 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07004432 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004433 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
4434 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4435 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
4436 image_create_info.extent.width = 64;
4437 image_create_info.extent.height = 64;
4438 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4439 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004440
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004441 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004442 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4443 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004444
Karl Schultz6addd812016-02-02 17:17:23 -07004445 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4446 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004447
Karl Schultz6addd812016-02-02 17:17:23 -07004448 vkCmdClearDepthStencilImage(
4449 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4450 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
4451 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004452
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004453 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004454}
4455
Karl Schultz6addd812016-02-02 17:17:23 -07004456TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004457 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004458 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004459
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004461 "vkCmdClearAttachments: This call "
4462 "must be issued inside an active "
4463 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004464
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004465 ASSERT_NO_FATAL_FAILURE(InitState());
4466 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004467
4468 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004469 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004470 ASSERT_VK_SUCCESS(err);
4471
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004472 VkClearAttachment color_attachment;
4473 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4474 color_attachment.clearValue.color.float32[0] = 0;
4475 color_attachment.clearValue.color.float32[1] = 0;
4476 color_attachment.clearValue.color.float32[2] = 0;
4477 color_attachment.clearValue.color.float32[3] = 0;
4478 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004479 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
4480 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4481 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004482
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004483 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004484}
4485
Karl Schultz9e66a292016-04-21 15:57:51 -06004486TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
4487 // Try to add a buffer memory barrier with no buffer.
4488 m_errorMonitor->SetDesiredFailureMsg(
4489 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4490 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
4491
4492 ASSERT_NO_FATAL_FAILURE(InitState());
4493 BeginCommandBuffer();
4494
4495 VkBufferMemoryBarrier buf_barrier = {};
4496 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
4497 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4498 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4499 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4500 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4501 buf_barrier.buffer = VK_NULL_HANDLE;
4502 buf_barrier.offset = 0;
4503 buf_barrier.size = VK_WHOLE_SIZE;
4504 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4505 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
4506 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
4507
4508 m_errorMonitor->VerifyFound();
4509}
4510
Karl Schultz6addd812016-02-02 17:17:23 -07004511TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004512 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004513 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004514
Karl Schultz6addd812016-02-02 17:17:23 -07004515 m_errorMonitor->SetDesiredFailureMsg(
4516 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004517 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
4518
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004519 ASSERT_NO_FATAL_FAILURE(InitState());
4520 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004521 uint32_t qfi = 0;
4522 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004523 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4524 buffCI.size = 1024;
4525 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4526 buffCI.queueFamilyIndexCount = 1;
4527 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004528
4529 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004530 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004531 ASSERT_VK_SUCCESS(err);
4532
4533 BeginCommandBuffer();
4534 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004535 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4536 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004537 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07004538 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
4539 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004540
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004541 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004542
Chia-I Wuf7458c52015-10-26 21:10:41 +08004543 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004544}
4545
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004546TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
4547 // Create an out-of-range queueFamilyIndex
4548 m_errorMonitor->SetDesiredFailureMsg(
4549 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06004550 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004551
4552 ASSERT_NO_FATAL_FAILURE(InitState());
4553 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4554 VkBufferCreateInfo buffCI = {};
4555 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4556 buffCI.size = 1024;
4557 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4558 buffCI.queueFamilyIndexCount = 1;
4559 // Introduce failure by specifying invalid queue_family_index
4560 uint32_t qfi = 777;
4561 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06004562 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004563
4564 VkBuffer ib;
4565 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
4566
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004567 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004568}
4569
Karl Schultz6addd812016-02-02 17:17:23 -07004570TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
4571 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
4572 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004573
Karl Schultz6addd812016-02-02 17:17:23 -07004574 m_errorMonitor->SetDesiredFailureMsg(
4575 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004576 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004577
4578 ASSERT_NO_FATAL_FAILURE(InitState());
4579 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004580
4581 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004582 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004583 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
4584 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004585
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004586 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004587}
4588
Karl Schultz6addd812016-02-02 17:17:23 -07004589TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004590 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07004591 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004592
Karl Schultz6addd812016-02-02 17:17:23 -07004593 m_errorMonitor->SetDesiredFailureMsg(
4594 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
4595 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
4596 "does not match ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004597
Tobin Ehlis3b780662015-05-28 12:11:26 -06004598 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004599 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004600 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004601 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4602 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004603
4604 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004605 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4606 ds_pool_ci.pNext = NULL;
4607 ds_pool_ci.maxSets = 1;
4608 ds_pool_ci.poolSizeCount = 1;
4609 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004610
Tobin Ehlis3b780662015-05-28 12:11:26 -06004611 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004612 err =
4613 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004614 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004615 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004616 dsl_binding.binding = 0;
4617 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4618 dsl_binding.descriptorCount = 1;
4619 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4620 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004621
Tony Barboureb254902015-07-15 12:50:33 -06004622 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004623 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4624 ds_layout_ci.pNext = NULL;
4625 ds_layout_ci.bindingCount = 1;
4626 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004627
Tobin Ehlis3b780662015-05-28 12:11:26 -06004628 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004629 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4630 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004631 ASSERT_VK_SUCCESS(err);
4632
4633 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004634 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004635 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004636 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004637 alloc_info.descriptorPool = ds_pool;
4638 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004639 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4640 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004641 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004642
Tony Barboureb254902015-07-15 12:50:33 -06004643 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004644 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4645 sampler_ci.pNext = NULL;
4646 sampler_ci.magFilter = VK_FILTER_NEAREST;
4647 sampler_ci.minFilter = VK_FILTER_NEAREST;
4648 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4649 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4650 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4651 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4652 sampler_ci.mipLodBias = 1.0;
4653 sampler_ci.anisotropyEnable = VK_FALSE;
4654 sampler_ci.maxAnisotropy = 1;
4655 sampler_ci.compareEnable = VK_FALSE;
4656 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4657 sampler_ci.minLod = 1.0;
4658 sampler_ci.maxLod = 1.0;
4659 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4660 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski52ac6582015-09-01 15:42:56 -06004661
Tobin Ehlis3b780662015-05-28 12:11:26 -06004662 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004663 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004664 ASSERT_VK_SUCCESS(err);
4665
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004666 VkDescriptorImageInfo info = {};
4667 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004668
4669 VkWriteDescriptorSet descriptor_write;
4670 memset(&descriptor_write, 0, sizeof(descriptor_write));
4671 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004672 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004673 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004674 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004675 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004676 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004677
4678 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4679
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004680 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004681
Chia-I Wuf7458c52015-10-26 21:10:41 +08004682 vkDestroySampler(m_device->device(), sampler, NULL);
4683 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4684 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004685}
4686
Karl Schultz6addd812016-02-02 17:17:23 -07004687TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004688 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07004689 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004690
Karl Schultz6addd812016-02-02 17:17:23 -07004691 m_errorMonitor->SetDesiredFailureMsg(
4692 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
4693 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
4694 "is out of bounds for matching binding");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004695
Tobin Ehlis3b780662015-05-28 12:11:26 -06004696 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004697 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004698 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004699 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4700 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004701
4702 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004703 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4704 ds_pool_ci.pNext = NULL;
4705 ds_pool_ci.maxSets = 1;
4706 ds_pool_ci.poolSizeCount = 1;
4707 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004708
Tobin Ehlis3b780662015-05-28 12:11:26 -06004709 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004710 err =
4711 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004712 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004713
Tony Barboureb254902015-07-15 12:50:33 -06004714 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004715 dsl_binding.binding = 0;
4716 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4717 dsl_binding.descriptorCount = 1;
4718 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4719 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06004720
4721 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004722 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4723 ds_layout_ci.pNext = NULL;
4724 ds_layout_ci.bindingCount = 1;
4725 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004726
Tobin Ehlis3b780662015-05-28 12:11:26 -06004727 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004728 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4729 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004730 ASSERT_VK_SUCCESS(err);
4731
4732 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004733 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004734 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004735 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004736 alloc_info.descriptorPool = ds_pool;
4737 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004738 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4739 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004740 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004741
Tony Barboureb254902015-07-15 12:50:33 -06004742 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004743 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4744 sampler_ci.pNext = NULL;
4745 sampler_ci.magFilter = VK_FILTER_NEAREST;
4746 sampler_ci.minFilter = VK_FILTER_NEAREST;
4747 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4748 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4749 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4750 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4751 sampler_ci.mipLodBias = 1.0;
4752 sampler_ci.anisotropyEnable = VK_FALSE;
4753 sampler_ci.maxAnisotropy = 1;
4754 sampler_ci.compareEnable = VK_FALSE;
4755 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4756 sampler_ci.minLod = 1.0;
4757 sampler_ci.maxLod = 1.0;
4758 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4759 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06004760
Tobin Ehlis3b780662015-05-28 12:11:26 -06004761 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004762 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004763 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004764
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004765 VkDescriptorImageInfo info = {};
4766 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004767
4768 VkWriteDescriptorSet descriptor_write;
4769 memset(&descriptor_write, 0, sizeof(descriptor_write));
4770 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004771 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004772 descriptor_write.dstArrayElement =
4773 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08004774 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004775 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004776 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004777 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004778
4779 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4780
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004781 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004782
Chia-I Wuf7458c52015-10-26 21:10:41 +08004783 vkDestroySampler(m_device->device(), sampler, NULL);
4784 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4785 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004786}
4787
Karl Schultz6addd812016-02-02 17:17:23 -07004788TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
4789 // Create layout w/ count of 1 and attempt update to that layout w/ binding
4790 // index 2
4791 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004792
Karl Schultz6addd812016-02-02 17:17:23 -07004793 m_errorMonitor->SetDesiredFailureMsg(
4794 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004795 " does not have binding to match update binding ");
4796
Tobin Ehlis3b780662015-05-28 12:11:26 -06004797 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004798 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004799 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004800 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4801 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004802
4803 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004804 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4805 ds_pool_ci.pNext = NULL;
4806 ds_pool_ci.maxSets = 1;
4807 ds_pool_ci.poolSizeCount = 1;
4808 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004809
Tobin Ehlis3b780662015-05-28 12:11:26 -06004810 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004811 err =
4812 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004813 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004814
Tony Barboureb254902015-07-15 12:50:33 -06004815 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004816 dsl_binding.binding = 0;
4817 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4818 dsl_binding.descriptorCount = 1;
4819 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4820 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06004821
4822 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004823 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4824 ds_layout_ci.pNext = NULL;
4825 ds_layout_ci.bindingCount = 1;
4826 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004827 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004828 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4829 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004830 ASSERT_VK_SUCCESS(err);
4831
4832 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004833 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004834 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004835 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004836 alloc_info.descriptorPool = ds_pool;
4837 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004838 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4839 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004840 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004841
Tony Barboureb254902015-07-15 12:50:33 -06004842 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004843 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4844 sampler_ci.pNext = NULL;
4845 sampler_ci.magFilter = VK_FILTER_NEAREST;
4846 sampler_ci.minFilter = VK_FILTER_NEAREST;
4847 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4848 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4849 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4850 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4851 sampler_ci.mipLodBias = 1.0;
4852 sampler_ci.anisotropyEnable = VK_FALSE;
4853 sampler_ci.maxAnisotropy = 1;
4854 sampler_ci.compareEnable = VK_FALSE;
4855 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4856 sampler_ci.minLod = 1.0;
4857 sampler_ci.maxLod = 1.0;
4858 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4859 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06004860
Tobin Ehlis3b780662015-05-28 12:11:26 -06004861 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004862 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004863 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004864
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004865 VkDescriptorImageInfo info = {};
4866 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004867
4868 VkWriteDescriptorSet descriptor_write;
4869 memset(&descriptor_write, 0, sizeof(descriptor_write));
4870 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004871 descriptor_write.dstSet = descriptorSet;
4872 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004873 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004874 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004875 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004876 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004877
4878 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4879
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004880 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004881
Chia-I Wuf7458c52015-10-26 21:10:41 +08004882 vkDestroySampler(m_device->device(), sampler, NULL);
4883 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4884 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004885}
4886
Karl Schultz6addd812016-02-02 17:17:23 -07004887TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
4888 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
4889 // types
4890 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004891
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004893 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004894
Tobin Ehlis3b780662015-05-28 12:11:26 -06004895 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004896
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004897 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004898 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4899 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004900
4901 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004902 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4903 ds_pool_ci.pNext = NULL;
4904 ds_pool_ci.maxSets = 1;
4905 ds_pool_ci.poolSizeCount = 1;
4906 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004907
Tobin Ehlis3b780662015-05-28 12:11:26 -06004908 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004909 err =
4910 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004911 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004912 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004913 dsl_binding.binding = 0;
4914 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4915 dsl_binding.descriptorCount = 1;
4916 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4917 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004918
Tony Barboureb254902015-07-15 12:50:33 -06004919 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004920 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4921 ds_layout_ci.pNext = NULL;
4922 ds_layout_ci.bindingCount = 1;
4923 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004924
Tobin Ehlis3b780662015-05-28 12:11:26 -06004925 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004926 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4927 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004928 ASSERT_VK_SUCCESS(err);
4929
4930 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004931 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004932 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004933 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004934 alloc_info.descriptorPool = ds_pool;
4935 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004936 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4937 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004938 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004939
Tony Barboureb254902015-07-15 12:50:33 -06004940 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004941 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4942 sampler_ci.pNext = NULL;
4943 sampler_ci.magFilter = VK_FILTER_NEAREST;
4944 sampler_ci.minFilter = VK_FILTER_NEAREST;
4945 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4946 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4947 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4948 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4949 sampler_ci.mipLodBias = 1.0;
4950 sampler_ci.anisotropyEnable = VK_FALSE;
4951 sampler_ci.maxAnisotropy = 1;
4952 sampler_ci.compareEnable = VK_FALSE;
4953 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4954 sampler_ci.minLod = 1.0;
4955 sampler_ci.maxLod = 1.0;
4956 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4957 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004958 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004959 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004960 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004961
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004962 VkDescriptorImageInfo info = {};
4963 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004964
4965 VkWriteDescriptorSet descriptor_write;
4966 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07004967 descriptor_write.sType =
4968 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004969 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004970 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004971 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004972 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004973 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004974
4975 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4976
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004977 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004978
Chia-I Wuf7458c52015-10-26 21:10:41 +08004979 vkDestroySampler(m_device->device(), sampler, NULL);
4980 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4981 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004982}
4983
Karl Schultz6addd812016-02-02 17:17:23 -07004984TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004985 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07004986 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004987
Karl Schultz6addd812016-02-02 17:17:23 -07004988 m_errorMonitor->SetDesiredFailureMsg(
4989 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004990 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
4991
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004992 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004993 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
4994 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004995 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004996 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
4997 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004998
4999 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005000 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5001 ds_pool_ci.pNext = NULL;
5002 ds_pool_ci.maxSets = 1;
5003 ds_pool_ci.poolSizeCount = 1;
5004 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005005
5006 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005007 err =
5008 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005009 ASSERT_VK_SUCCESS(err);
5010
5011 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005012 dsl_binding.binding = 0;
5013 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5014 dsl_binding.descriptorCount = 1;
5015 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5016 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005017
5018 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005019 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5020 ds_layout_ci.pNext = NULL;
5021 ds_layout_ci.bindingCount = 1;
5022 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005023 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005024 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5025 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005026 ASSERT_VK_SUCCESS(err);
5027
5028 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005029 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005030 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005031 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005032 alloc_info.descriptorPool = ds_pool;
5033 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005034 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5035 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005036 ASSERT_VK_SUCCESS(err);
5037
Karl Schultz6addd812016-02-02 17:17:23 -07005038 VkSampler sampler =
5039 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005040
5041 VkDescriptorImageInfo descriptor_info;
5042 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5043 descriptor_info.sampler = sampler;
5044
5045 VkWriteDescriptorSet descriptor_write;
5046 memset(&descriptor_write, 0, sizeof(descriptor_write));
5047 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005048 descriptor_write.dstSet = descriptorSet;
5049 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005050 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005051 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5052 descriptor_write.pImageInfo = &descriptor_info;
5053
5054 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5055
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005056 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005057
Chia-I Wuf7458c52015-10-26 21:10:41 +08005058 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5059 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005060}
5061
Karl Schultz6addd812016-02-02 17:17:23 -07005062TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
5063 // Create a single combined Image/Sampler descriptor and send it an invalid
5064 // imageView
5065 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005066
Karl Schultz6addd812016-02-02 17:17:23 -07005067 m_errorMonitor->SetDesiredFailureMsg(
5068 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005069 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
5070
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005071 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005072 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005073 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5074 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005075
5076 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005077 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5078 ds_pool_ci.pNext = NULL;
5079 ds_pool_ci.maxSets = 1;
5080 ds_pool_ci.poolSizeCount = 1;
5081 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005082
5083 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005084 err =
5085 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005086 ASSERT_VK_SUCCESS(err);
5087
5088 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005089 dsl_binding.binding = 0;
5090 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5091 dsl_binding.descriptorCount = 1;
5092 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5093 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005094
5095 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005096 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5097 ds_layout_ci.pNext = NULL;
5098 ds_layout_ci.bindingCount = 1;
5099 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005100 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005101 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5102 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005103 ASSERT_VK_SUCCESS(err);
5104
5105 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005106 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005107 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005108 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005109 alloc_info.descriptorPool = ds_pool;
5110 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005111 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5112 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005113 ASSERT_VK_SUCCESS(err);
5114
5115 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005116 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5117 sampler_ci.pNext = NULL;
5118 sampler_ci.magFilter = VK_FILTER_NEAREST;
5119 sampler_ci.minFilter = VK_FILTER_NEAREST;
5120 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5121 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5122 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5123 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5124 sampler_ci.mipLodBias = 1.0;
5125 sampler_ci.anisotropyEnable = VK_FALSE;
5126 sampler_ci.maxAnisotropy = 1;
5127 sampler_ci.compareEnable = VK_FALSE;
5128 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5129 sampler_ci.minLod = 1.0;
5130 sampler_ci.maxLod = 1.0;
5131 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5132 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005133
5134 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005135 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005136 ASSERT_VK_SUCCESS(err);
5137
Karl Schultz6addd812016-02-02 17:17:23 -07005138 VkImageView view =
5139 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005140
5141 VkDescriptorImageInfo descriptor_info;
5142 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5143 descriptor_info.sampler = sampler;
5144 descriptor_info.imageView = view;
5145
5146 VkWriteDescriptorSet descriptor_write;
5147 memset(&descriptor_write, 0, sizeof(descriptor_write));
5148 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005149 descriptor_write.dstSet = descriptorSet;
5150 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005151 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005152 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5153 descriptor_write.pImageInfo = &descriptor_info;
5154
5155 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5156
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005157 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005158
Chia-I Wuf7458c52015-10-26 21:10:41 +08005159 vkDestroySampler(m_device->device(), sampler, NULL);
5160 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5161 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005162}
5163
Karl Schultz6addd812016-02-02 17:17:23 -07005164TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
5165 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
5166 // into the other
5167 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005168
Karl Schultz6addd812016-02-02 17:17:23 -07005169 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06005170 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5171 "Copy descriptor update index 0, has src update descriptor "
5172 "type VK_DESCRIPTOR_TYPE_SAMPLER that does not match overlapping "
5173 "dest ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005174
Tobin Ehlis04356f92015-10-27 16:35:27 -06005175 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005176 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005177 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005178 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5179 ds_type_count[0].descriptorCount = 1;
5180 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
5181 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005182
5183 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005184 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5185 ds_pool_ci.pNext = NULL;
5186 ds_pool_ci.maxSets = 1;
5187 ds_pool_ci.poolSizeCount = 2;
5188 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005189
5190 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005191 err =
5192 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005193 ASSERT_VK_SUCCESS(err);
5194 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005195 dsl_binding[0].binding = 0;
5196 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5197 dsl_binding[0].descriptorCount = 1;
5198 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
5199 dsl_binding[0].pImmutableSamplers = NULL;
5200 dsl_binding[1].binding = 1;
5201 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5202 dsl_binding[1].descriptorCount = 1;
5203 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
5204 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005205
5206 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005207 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5208 ds_layout_ci.pNext = NULL;
5209 ds_layout_ci.bindingCount = 2;
5210 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005211
5212 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005213 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5214 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005215 ASSERT_VK_SUCCESS(err);
5216
5217 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005218 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005219 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005220 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005221 alloc_info.descriptorPool = ds_pool;
5222 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005223 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5224 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005225 ASSERT_VK_SUCCESS(err);
5226
5227 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005228 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5229 sampler_ci.pNext = NULL;
5230 sampler_ci.magFilter = VK_FILTER_NEAREST;
5231 sampler_ci.minFilter = VK_FILTER_NEAREST;
5232 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5233 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5234 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5235 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5236 sampler_ci.mipLodBias = 1.0;
5237 sampler_ci.anisotropyEnable = VK_FALSE;
5238 sampler_ci.maxAnisotropy = 1;
5239 sampler_ci.compareEnable = VK_FALSE;
5240 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5241 sampler_ci.minLod = 1.0;
5242 sampler_ci.maxLod = 1.0;
5243 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5244 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005245
5246 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005247 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005248 ASSERT_VK_SUCCESS(err);
5249
5250 VkDescriptorImageInfo info = {};
5251 info.sampler = sampler;
5252
5253 VkWriteDescriptorSet descriptor_write;
5254 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
5255 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005256 descriptor_write.dstSet = descriptorSet;
5257 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08005258 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005259 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5260 descriptor_write.pImageInfo = &info;
5261 // This write update should succeed
5262 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5263 // Now perform a copy update that fails due to type mismatch
5264 VkCopyDescriptorSet copy_ds_update;
5265 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5266 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5267 copy_ds_update.srcSet = descriptorSet;
5268 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005269 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005270 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08005271 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005272 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5273
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005274 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005275 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005276 m_errorMonitor->SetDesiredFailureMsg(
5277 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005278 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis04356f92015-10-27 16:35:27 -06005279 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5280 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5281 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005282 copy_ds_update.srcBinding =
5283 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005284 copy_ds_update.dstSet = descriptorSet;
5285 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005286 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005287 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5288
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005289 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005290
Tobin Ehlis04356f92015-10-27 16:35:27 -06005291 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005292 m_errorMonitor->SetDesiredFailureMsg(
5293 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005294 "Copy descriptor src update is out of bounds for matching binding 1 ");
5295
Tobin Ehlis04356f92015-10-27 16:35:27 -06005296 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5297 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5298 copy_ds_update.srcSet = descriptorSet;
5299 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005300 copy_ds_update.dstSet = descriptorSet;
5301 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005302 copy_ds_update.descriptorCount =
5303 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06005304 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5305
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005306 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005307
Chia-I Wuf7458c52015-10-26 21:10:41 +08005308 vkDestroySampler(m_device->device(), sampler, NULL);
5309 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5310 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005311}
5312
Karl Schultz6addd812016-02-02 17:17:23 -07005313TEST_F(VkLayerTest, NumSamplesMismatch) {
5314 // Create CommandBuffer where MSAA samples doesn't match RenderPass
5315 // sampleCount
5316 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005317
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005318 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005319 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005320
Tobin Ehlis3b780662015-05-28 12:11:26 -06005321 ASSERT_NO_FATAL_FAILURE(InitState());
5322 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005323 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06005324 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005325 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005326
5327 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005328 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5329 ds_pool_ci.pNext = NULL;
5330 ds_pool_ci.maxSets = 1;
5331 ds_pool_ci.poolSizeCount = 1;
5332 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005333
Tobin Ehlis3b780662015-05-28 12:11:26 -06005334 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005335 err =
5336 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005337 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005338
Tony Barboureb254902015-07-15 12:50:33 -06005339 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08005340 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06005341 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08005342 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005343 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5344 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005345
Tony Barboureb254902015-07-15 12:50:33 -06005346 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5347 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5348 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005349 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07005350 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005351
Tobin Ehlis3b780662015-05-28 12:11:26 -06005352 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005353 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5354 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005355 ASSERT_VK_SUCCESS(err);
5356
5357 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005358 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005359 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005360 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005361 alloc_info.descriptorPool = ds_pool;
5362 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005363 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5364 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005365 ASSERT_VK_SUCCESS(err);
5366
Tony Barboureb254902015-07-15 12:50:33 -06005367 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005368 pipe_ms_state_ci.sType =
5369 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5370 pipe_ms_state_ci.pNext = NULL;
5371 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5372 pipe_ms_state_ci.sampleShadingEnable = 0;
5373 pipe_ms_state_ci.minSampleShading = 1.0;
5374 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005375
Tony Barboureb254902015-07-15 12:50:33 -06005376 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005377 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5378 pipeline_layout_ci.pNext = NULL;
5379 pipeline_layout_ci.setLayoutCount = 1;
5380 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005381
5382 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005383 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5384 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005385 ASSERT_VK_SUCCESS(err);
5386
Karl Schultz6addd812016-02-02 17:17:23 -07005387 VkShaderObj vs(m_device, bindStateVertShaderText,
5388 VK_SHADER_STAGE_VERTEX_BIT, this);
5389 VkShaderObj fs(m_device, bindStateFragShaderText,
5390 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005391 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005392 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005393 VkPipelineObj pipe(m_device);
5394 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005395 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005396 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005397 pipe.SetMSAA(&pipe_ms_state_ci);
5398 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005399
Tony Barbourfe3351b2015-07-28 10:17:20 -06005400 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005401 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5402 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005403
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005404 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005405
Chia-I Wuf7458c52015-10-26 21:10:41 +08005406 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5407 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5408 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005409}
Tobin Ehlis0f10db52016-04-04 10:00:21 -06005410#ifdef ADD_BACK_IN_WHEN_CHECK_IS_BACK // TODO : Re-enable when GH256 fixed
Mark Youngc89c6312016-03-31 16:03:20 -06005411TEST_F(VkLayerTest, NumBlendAttachMismatch) {
5412 // Create Pipeline where the number of blend attachments doesn't match the
5413 // number of color attachments. In this case, we don't add any color
5414 // blend attachments even though we have a color attachment.
5415 VkResult err;
5416
5417 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5418 "Mismatch between blend state attachment");
5419
5420 ASSERT_NO_FATAL_FAILURE(InitState());
5421 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5422 VkDescriptorPoolSize ds_type_count = {};
5423 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5424 ds_type_count.descriptorCount = 1;
5425
5426 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5427 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5428 ds_pool_ci.pNext = NULL;
5429 ds_pool_ci.maxSets = 1;
5430 ds_pool_ci.poolSizeCount = 1;
5431 ds_pool_ci.pPoolSizes = &ds_type_count;
5432
5433 VkDescriptorPool ds_pool;
5434 err =
5435 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5436 ASSERT_VK_SUCCESS(err);
5437
5438 VkDescriptorSetLayoutBinding dsl_binding = {};
5439 dsl_binding.binding = 0;
5440 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5441 dsl_binding.descriptorCount = 1;
5442 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5443 dsl_binding.pImmutableSamplers = NULL;
5444
5445 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5446 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5447 ds_layout_ci.pNext = NULL;
5448 ds_layout_ci.bindingCount = 1;
5449 ds_layout_ci.pBindings = &dsl_binding;
5450
5451 VkDescriptorSetLayout ds_layout;
5452 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5453 &ds_layout);
5454 ASSERT_VK_SUCCESS(err);
5455
5456 VkDescriptorSet descriptorSet;
5457 VkDescriptorSetAllocateInfo alloc_info = {};
5458 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5459 alloc_info.descriptorSetCount = 1;
5460 alloc_info.descriptorPool = ds_pool;
5461 alloc_info.pSetLayouts = &ds_layout;
5462 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5463 &descriptorSet);
5464 ASSERT_VK_SUCCESS(err);
5465
5466 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
5467 pipe_ms_state_ci.sType =
5468 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5469 pipe_ms_state_ci.pNext = NULL;
5470 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
5471 pipe_ms_state_ci.sampleShadingEnable = 0;
5472 pipe_ms_state_ci.minSampleShading = 1.0;
5473 pipe_ms_state_ci.pSampleMask = NULL;
5474
5475 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5476 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5477 pipeline_layout_ci.pNext = NULL;
5478 pipeline_layout_ci.setLayoutCount = 1;
5479 pipeline_layout_ci.pSetLayouts = &ds_layout;
5480
5481 VkPipelineLayout pipeline_layout;
5482 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5483 &pipeline_layout);
5484 ASSERT_VK_SUCCESS(err);
5485
5486 VkShaderObj vs(m_device, bindStateVertShaderText,
5487 VK_SHADER_STAGE_VERTEX_BIT, this);
5488 VkShaderObj fs(m_device, bindStateFragShaderText,
5489 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005490 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06005491 // but add it to be able to run on more devices
5492 VkPipelineObj pipe(m_device);
5493 pipe.AddShader(&vs);
5494 pipe.AddShader(&fs);
5495 pipe.SetMSAA(&pipe_ms_state_ci);
5496 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5497
5498 BeginCommandBuffer();
5499 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5500 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5501
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005502 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06005503
5504 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5505 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5506 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5507}
Tony Barbour4e81a202016-04-04 11:09:40 -06005508#endif //ADD_BACK_IN_WHEN_CHECK_IS_BACK
Karl Schultz6addd812016-02-02 17:17:23 -07005509TEST_F(VkLayerTest, ClearCmdNoDraw) {
5510 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
5511 // to issuing a Draw
5512 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005513
Karl Schultz6addd812016-02-02 17:17:23 -07005514 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07005515 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005516 "vkCmdClearAttachments() issued on CB object ");
5517
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005518 ASSERT_NO_FATAL_FAILURE(InitState());
5519 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005520
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005521 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005522 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5523 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005524
5525 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005526 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5527 ds_pool_ci.pNext = NULL;
5528 ds_pool_ci.maxSets = 1;
5529 ds_pool_ci.poolSizeCount = 1;
5530 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005531
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005532 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005533 err =
5534 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005535 ASSERT_VK_SUCCESS(err);
5536
Tony Barboureb254902015-07-15 12:50:33 -06005537 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005538 dsl_binding.binding = 0;
5539 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5540 dsl_binding.descriptorCount = 1;
5541 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5542 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005543
Tony Barboureb254902015-07-15 12:50:33 -06005544 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005545 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5546 ds_layout_ci.pNext = NULL;
5547 ds_layout_ci.bindingCount = 1;
5548 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005549
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005550 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005551 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5552 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005553 ASSERT_VK_SUCCESS(err);
5554
5555 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005556 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005557 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005558 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005559 alloc_info.descriptorPool = ds_pool;
5560 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005561 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5562 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005563 ASSERT_VK_SUCCESS(err);
5564
Tony Barboureb254902015-07-15 12:50:33 -06005565 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005566 pipe_ms_state_ci.sType =
5567 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5568 pipe_ms_state_ci.pNext = NULL;
5569 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5570 pipe_ms_state_ci.sampleShadingEnable = 0;
5571 pipe_ms_state_ci.minSampleShading = 1.0;
5572 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005573
Tony Barboureb254902015-07-15 12:50:33 -06005574 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005575 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5576 pipeline_layout_ci.pNext = NULL;
5577 pipeline_layout_ci.setLayoutCount = 1;
5578 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005579
5580 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005581 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5582 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005583 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005584
Karl Schultz6addd812016-02-02 17:17:23 -07005585 VkShaderObj vs(m_device, bindStateVertShaderText,
5586 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06005587 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07005588 // on more devices
5589 VkShaderObj fs(m_device, bindStateFragShaderText,
5590 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005591
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005592 VkPipelineObj pipe(m_device);
5593 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005594 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005595 pipe.SetMSAA(&pipe_ms_state_ci);
5596 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005597
5598 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005599
Karl Schultz6addd812016-02-02 17:17:23 -07005600 // Main thing we care about for this test is that the VkImage obj we're
5601 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005602 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005603 VkClearAttachment color_attachment;
5604 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5605 color_attachment.clearValue.color.float32[0] = 1.0;
5606 color_attachment.clearValue.color.float32[1] = 1.0;
5607 color_attachment.clearValue.color.float32[2] = 1.0;
5608 color_attachment.clearValue.color.float32[3] = 1.0;
5609 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005610 VkClearRect clear_rect = {
5611 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005612
Karl Schultz6addd812016-02-02 17:17:23 -07005613 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5614 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005615
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005616 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005617
Chia-I Wuf7458c52015-10-26 21:10:41 +08005618 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5619 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5620 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005621}
5622
Karl Schultz6addd812016-02-02 17:17:23 -07005623TEST_F(VkLayerTest, VtxBufferBadIndex) {
5624 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005625
Karl Schultz6addd812016-02-02 17:17:23 -07005626 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005627 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07005628 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005629
Tobin Ehlis502480b2015-06-24 15:53:07 -06005630 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06005631 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06005632 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005633
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005634 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005635 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5636 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005637
5638 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005639 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5640 ds_pool_ci.pNext = NULL;
5641 ds_pool_ci.maxSets = 1;
5642 ds_pool_ci.poolSizeCount = 1;
5643 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005644
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005645 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005646 err =
5647 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005648 ASSERT_VK_SUCCESS(err);
5649
Tony Barboureb254902015-07-15 12:50:33 -06005650 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005651 dsl_binding.binding = 0;
5652 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5653 dsl_binding.descriptorCount = 1;
5654 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5655 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005656
Tony Barboureb254902015-07-15 12:50:33 -06005657 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005658 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5659 ds_layout_ci.pNext = NULL;
5660 ds_layout_ci.bindingCount = 1;
5661 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005662
Tobin Ehlis502480b2015-06-24 15:53:07 -06005663 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005664 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5665 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005666 ASSERT_VK_SUCCESS(err);
5667
5668 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005669 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005670 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005671 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005672 alloc_info.descriptorPool = ds_pool;
5673 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005674 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5675 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005676 ASSERT_VK_SUCCESS(err);
5677
Tony Barboureb254902015-07-15 12:50:33 -06005678 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005679 pipe_ms_state_ci.sType =
5680 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5681 pipe_ms_state_ci.pNext = NULL;
5682 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
5683 pipe_ms_state_ci.sampleShadingEnable = 0;
5684 pipe_ms_state_ci.minSampleShading = 1.0;
5685 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005686
Tony Barboureb254902015-07-15 12:50:33 -06005687 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005688 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5689 pipeline_layout_ci.pNext = NULL;
5690 pipeline_layout_ci.setLayoutCount = 1;
5691 pipeline_layout_ci.pSetLayouts = &ds_layout;
5692 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005693
Karl Schultz6addd812016-02-02 17:17:23 -07005694 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5695 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005696 ASSERT_VK_SUCCESS(err);
5697
Karl Schultz6addd812016-02-02 17:17:23 -07005698 VkShaderObj vs(m_device, bindStateVertShaderText,
5699 VK_SHADER_STAGE_VERTEX_BIT, this);
5700 VkShaderObj fs(m_device, bindStateFragShaderText,
5701 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005702 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005703 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005704 VkPipelineObj pipe(m_device);
5705 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005706 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005707 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005708 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005709 pipe.SetViewport(m_viewports);
5710 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005711 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005712
5713 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005714 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5715 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06005716 // Don't care about actual data, just need to get to draw to flag error
5717 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07005718 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
5719 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06005720 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06005721 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005722
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005723 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005724
Chia-I Wuf7458c52015-10-26 21:10:41 +08005725 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5726 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5727 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005728}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005729#endif // DRAW_STATE_TESTS
5730
Tobin Ehlis0788f522015-05-26 16:11:58 -06005731#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06005732#if GTEST_IS_THREADSAFE
5733struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005734 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005735 VkEvent event;
5736 bool bailout;
5737};
5738
Karl Schultz6addd812016-02-02 17:17:23 -07005739extern "C" void *AddToCommandBuffer(void *arg) {
5740 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005741
Karl Schultz6addd812016-02-02 17:17:23 -07005742 for (int i = 0; i < 10000; i++) {
5743 vkCmdSetEvent(data->commandBuffer, data->event,
5744 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005745 if (data->bailout) {
5746 break;
5747 }
5748 }
5749 return NULL;
5750}
5751
Karl Schultz6addd812016-02-02 17:17:23 -07005752TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005753 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005754
Karl Schultz6addd812016-02-02 17:17:23 -07005755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5756 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005757
Mike Stroyanaccf7692015-05-12 16:00:45 -06005758 ASSERT_NO_FATAL_FAILURE(InitState());
5759 ASSERT_NO_FATAL_FAILURE(InitViewport());
5760 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5761
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005762 // Calls AllocateCommandBuffers
5763 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06005764
5765 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005766 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005767
5768 VkEventCreateInfo event_info;
5769 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005770 VkResult err;
5771
5772 memset(&event_info, 0, sizeof(event_info));
5773 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5774
Chia-I Wuf7458c52015-10-26 21:10:41 +08005775 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005776 ASSERT_VK_SUCCESS(err);
5777
Mike Stroyanaccf7692015-05-12 16:00:45 -06005778 err = vkResetEvent(device(), event);
5779 ASSERT_VK_SUCCESS(err);
5780
5781 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005782 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005783 data.event = event;
5784 data.bailout = false;
5785 m_errorMonitor->SetBailout(&data.bailout);
5786 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005787 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005788 // Add many entries to command buffer from this thread at the same time.
5789 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06005790
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005791 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005792 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005793
Mike Stroyan10b8cb72016-01-22 15:22:03 -07005794 m_errorMonitor->SetBailout(NULL);
5795
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005796 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005797
Chia-I Wuf7458c52015-10-26 21:10:41 +08005798 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005799}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005800#endif // GTEST_IS_THREADSAFE
5801#endif // THREADING_TESTS
5802
Chris Forbes9f7ff632015-05-25 11:13:08 +12005803#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07005804TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12005806 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005807
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005808 ASSERT_NO_FATAL_FAILURE(InitState());
5809 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5810
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005811 VkShaderModule module;
5812 VkShaderModuleCreateInfo moduleCreateInfo;
5813 struct icd_spv_header spv;
5814
5815 spv.magic = ICD_SPV_MAGIC;
5816 spv.version = ICD_SPV_VERSION;
5817 spv.gen_magic = 0;
5818
5819 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
5820 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07005821 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005822 moduleCreateInfo.codeSize = 4;
5823 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005824 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005825
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005826 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005827}
5828
Karl Schultz6addd812016-02-02 17:17:23 -07005829TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12005831 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005832
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005833 ASSERT_NO_FATAL_FAILURE(InitState());
5834 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5835
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005836 VkShaderModule module;
5837 VkShaderModuleCreateInfo moduleCreateInfo;
5838 struct icd_spv_header spv;
5839
5840 spv.magic = ~ICD_SPV_MAGIC;
5841 spv.version = ICD_SPV_VERSION;
5842 spv.gen_magic = 0;
5843
5844 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
5845 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07005846 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005847 moduleCreateInfo.codeSize = sizeof(spv) + 10;
5848 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005849 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005850
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005851 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005852}
5853
Chris Forbesb4afd0f2016-04-04 10:48:35 +12005854#if 0
5855// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07005856TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12005858 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005859
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005860 ASSERT_NO_FATAL_FAILURE(InitState());
5861 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5862
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005863 VkShaderModule module;
5864 VkShaderModuleCreateInfo moduleCreateInfo;
5865 struct icd_spv_header spv;
5866
5867 spv.magic = ICD_SPV_MAGIC;
5868 spv.version = ~ICD_SPV_VERSION;
5869 spv.gen_magic = 0;
5870
5871 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
5872 moduleCreateInfo.pNext = NULL;
5873
Karl Schultz6addd812016-02-02 17:17:23 -07005874 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005875 moduleCreateInfo.codeSize = sizeof(spv) + 10;
5876 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005877 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005878
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005879 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005880}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12005881#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005882
Karl Schultz6addd812016-02-02 17:17:23 -07005883TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005885 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005886
Chris Forbes9f7ff632015-05-25 11:13:08 +12005887 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005888 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12005889
5890 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005891 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005892 "\n"
5893 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005894 "out gl_PerVertex {\n"
5895 " vec4 gl_Position;\n"
5896 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005897 "void main(){\n"
5898 " gl_Position = vec4(1);\n"
5899 " x = 0;\n"
5900 "}\n";
5901 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005902 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005903 "\n"
5904 "layout(location=0) out vec4 color;\n"
5905 "void main(){\n"
5906 " color = vec4(1);\n"
5907 "}\n";
5908
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005909 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5910 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12005911
5912 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005913 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12005914 pipe.AddShader(&vs);
5915 pipe.AddShader(&fs);
5916
Chris Forbes9f7ff632015-05-25 11:13:08 +12005917 VkDescriptorSetObj descriptorSet(m_device);
5918 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005919 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12005920
Tony Barbour5781e8f2015-08-04 16:23:11 -06005921 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12005922
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005923 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12005924}
Chris Forbes9f7ff632015-05-25 11:13:08 +12005925
Karl Schultz6addd812016-02-02 17:17:23 -07005926TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005928 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005929
Chris Forbes59cb88d2015-05-25 11:13:13 +12005930 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005931 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12005932
5933 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005934 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005935 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005936 "out gl_PerVertex {\n"
5937 " vec4 gl_Position;\n"
5938 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005939 "void main(){\n"
5940 " gl_Position = vec4(1);\n"
5941 "}\n";
5942 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005943 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005944 "\n"
5945 "layout(location=0) in float x;\n"
5946 "layout(location=0) out vec4 color;\n"
5947 "void main(){\n"
5948 " color = vec4(x);\n"
5949 "}\n";
5950
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005951 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5952 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12005953
5954 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005955 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12005956 pipe.AddShader(&vs);
5957 pipe.AddShader(&fs);
5958
Chris Forbes59cb88d2015-05-25 11:13:13 +12005959 VkDescriptorSetObj descriptorSet(m_device);
5960 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005961 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12005962
Tony Barbour5781e8f2015-08-04 16:23:11 -06005963 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12005964
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005965 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12005966}
5967
Karl Schultz6addd812016-02-02 17:17:23 -07005968TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13005969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005970 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13005971
5972 ASSERT_NO_FATAL_FAILURE(InitState());
5973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5974
5975 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005976 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13005977 "\n"
5978 "out gl_PerVertex {\n"
5979 " vec4 gl_Position;\n"
5980 "};\n"
5981 "void main(){\n"
5982 " gl_Position = vec4(1);\n"
5983 "}\n";
5984 char const *fsSource =
5985 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13005986 "\n"
5987 "in block { layout(location=0) float x; } ins;\n"
5988 "layout(location=0) out vec4 color;\n"
5989 "void main(){\n"
5990 " color = vec4(ins.x);\n"
5991 "}\n";
5992
5993 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5994 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5995
5996 VkPipelineObj pipe(m_device);
5997 pipe.AddColorAttachment();
5998 pipe.AddShader(&vs);
5999 pipe.AddShader(&fs);
6000
6001 VkDescriptorSetObj descriptorSet(m_device);
6002 descriptorSet.AppendDummy();
6003 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6004
6005 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6006
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006007 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006008}
6009
Karl Schultz6addd812016-02-02 17:17:23 -07006010TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13006011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13006012 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07006013 "output arr[2] of float32' vs 'ptr to "
6014 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13006015
6016 ASSERT_NO_FATAL_FAILURE(InitState());
6017 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6018
6019 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006020 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006021 "\n"
6022 "layout(location=0) out float x[2];\n"
6023 "out gl_PerVertex {\n"
6024 " vec4 gl_Position;\n"
6025 "};\n"
6026 "void main(){\n"
6027 " x[0] = 0; x[1] = 0;\n"
6028 " gl_Position = vec4(1);\n"
6029 "}\n";
6030 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006031 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006032 "\n"
6033 "layout(location=0) in float x[3];\n"
6034 "layout(location=0) out vec4 color;\n"
6035 "void main(){\n"
6036 " color = vec4(x[0] + x[1] + x[2]);\n"
6037 "}\n";
6038
6039 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6040 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6041
6042 VkPipelineObj pipe(m_device);
6043 pipe.AddColorAttachment();
6044 pipe.AddShader(&vs);
6045 pipe.AddShader(&fs);
6046
6047 VkDescriptorSetObj descriptorSet(m_device);
6048 descriptorSet.AppendDummy();
6049 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6050
6051 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6052
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006053 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13006054}
6055
Karl Schultz6addd812016-02-02 17:17:23 -07006056TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006058 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006059
Chris Forbesb56af562015-05-25 11:13:17 +12006060 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006061 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12006062
6063 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006064 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006065 "\n"
6066 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006067 "out gl_PerVertex {\n"
6068 " vec4 gl_Position;\n"
6069 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006070 "void main(){\n"
6071 " x = 0;\n"
6072 " gl_Position = vec4(1);\n"
6073 "}\n";
6074 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006075 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006076 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006077 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12006078 "layout(location=0) out vec4 color;\n"
6079 "void main(){\n"
6080 " color = vec4(x);\n"
6081 "}\n";
6082
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006083 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6084 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12006085
6086 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006087 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12006088 pipe.AddShader(&vs);
6089 pipe.AddShader(&fs);
6090
Chris Forbesb56af562015-05-25 11:13:17 +12006091 VkDescriptorSetObj descriptorSet(m_device);
6092 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006093 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12006094
Tony Barbour5781e8f2015-08-04 16:23:11 -06006095 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12006096
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006097 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12006098}
6099
Karl Schultz6addd812016-02-02 17:17:23 -07006100TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006102 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006103
6104 ASSERT_NO_FATAL_FAILURE(InitState());
6105 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6106
6107 char const *vsSource =
6108 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006109 "\n"
6110 "out block { layout(location=0) int x; } outs;\n"
6111 "out gl_PerVertex {\n"
6112 " vec4 gl_Position;\n"
6113 "};\n"
6114 "void main(){\n"
6115 " outs.x = 0;\n"
6116 " gl_Position = vec4(1);\n"
6117 "}\n";
6118 char const *fsSource =
6119 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006120 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006121 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13006122 "layout(location=0) out vec4 color;\n"
6123 "void main(){\n"
6124 " color = vec4(ins.x);\n"
6125 "}\n";
6126
6127 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6128 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6129
6130 VkPipelineObj pipe(m_device);
6131 pipe.AddColorAttachment();
6132 pipe.AddShader(&vs);
6133 pipe.AddShader(&fs);
6134
6135 VkDescriptorSetObj descriptorSet(m_device);
6136 descriptorSet.AppendDummy();
6137 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6138
6139 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6140
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006141 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006142}
6143
6144TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
6145 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6146 "location 0.0 which is not written by vertex shader");
6147
6148 ASSERT_NO_FATAL_FAILURE(InitState());
6149 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6150
6151 char const *vsSource =
6152 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006153 "\n"
6154 "out block { layout(location=1) float x; } outs;\n"
6155 "out gl_PerVertex {\n"
6156 " vec4 gl_Position;\n"
6157 "};\n"
6158 "void main(){\n"
6159 " outs.x = 0;\n"
6160 " gl_Position = vec4(1);\n"
6161 "}\n";
6162 char const *fsSource =
6163 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006164 "\n"
6165 "in block { layout(location=0) float x; } ins;\n"
6166 "layout(location=0) out vec4 color;\n"
6167 "void main(){\n"
6168 " color = vec4(ins.x);\n"
6169 "}\n";
6170
6171 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6172 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6173
6174 VkPipelineObj pipe(m_device);
6175 pipe.AddColorAttachment();
6176 pipe.AddShader(&vs);
6177 pipe.AddShader(&fs);
6178
6179 VkDescriptorSetObj descriptorSet(m_device);
6180 descriptorSet.AppendDummy();
6181 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6182
6183 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6184
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006185 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006186}
6187
6188TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
6189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6190 "location 0.1 which is not written by vertex shader");
6191
6192 ASSERT_NO_FATAL_FAILURE(InitState());
6193 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6194
6195 char const *vsSource =
6196 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006197 "\n"
6198 "out block { layout(location=0, component=0) float x; } outs;\n"
6199 "out gl_PerVertex {\n"
6200 " vec4 gl_Position;\n"
6201 "};\n"
6202 "void main(){\n"
6203 " outs.x = 0;\n"
6204 " gl_Position = vec4(1);\n"
6205 "}\n";
6206 char const *fsSource =
6207 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006208 "\n"
6209 "in block { layout(location=0, component=1) float x; } ins;\n"
6210 "layout(location=0) out vec4 color;\n"
6211 "void main(){\n"
6212 " color = vec4(ins.x);\n"
6213 "}\n";
6214
6215 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6216 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6217
6218 VkPipelineObj pipe(m_device);
6219 pipe.AddColorAttachment();
6220 pipe.AddShader(&vs);
6221 pipe.AddShader(&fs);
6222
6223 VkDescriptorSetObj descriptorSet(m_device);
6224 descriptorSet.AppendDummy();
6225 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6226
6227 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6228
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006229 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006230}
6231
Karl Schultz6addd812016-02-02 17:17:23 -07006232TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006234 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006235
Chris Forbesde136e02015-05-25 11:13:28 +12006236 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006237 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12006238
6239 VkVertexInputBindingDescription input_binding;
6240 memset(&input_binding, 0, sizeof(input_binding));
6241
6242 VkVertexInputAttributeDescription input_attrib;
6243 memset(&input_attrib, 0, sizeof(input_attrib));
6244 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6245
6246 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006247 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006248 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006249 "out gl_PerVertex {\n"
6250 " vec4 gl_Position;\n"
6251 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006252 "void main(){\n"
6253 " gl_Position = vec4(1);\n"
6254 "}\n";
6255 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006256 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006257 "\n"
6258 "layout(location=0) out vec4 color;\n"
6259 "void main(){\n"
6260 " color = vec4(1);\n"
6261 "}\n";
6262
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006263 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6264 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12006265
6266 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006267 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12006268 pipe.AddShader(&vs);
6269 pipe.AddShader(&fs);
6270
6271 pipe.AddVertexInputBindings(&input_binding, 1);
6272 pipe.AddVertexInputAttribs(&input_attrib, 1);
6273
Chris Forbesde136e02015-05-25 11:13:28 +12006274 VkDescriptorSetObj descriptorSet(m_device);
6275 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006276 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12006277
Tony Barbour5781e8f2015-08-04 16:23:11 -06006278 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12006279
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006280 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12006281}
6282
Karl Schultz6addd812016-02-02 17:17:23 -07006283TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006284 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006285 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13006286
6287 ASSERT_NO_FATAL_FAILURE(InitState());
6288 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6289
6290 VkVertexInputBindingDescription input_binding;
6291 memset(&input_binding, 0, sizeof(input_binding));
6292
6293 VkVertexInputAttributeDescription input_attrib;
6294 memset(&input_attrib, 0, sizeof(input_attrib));
6295 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6296
6297 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006298 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006299 "\n"
6300 "layout(location=1) in float x;\n"
6301 "out gl_PerVertex {\n"
6302 " vec4 gl_Position;\n"
6303 "};\n"
6304 "void main(){\n"
6305 " gl_Position = vec4(x);\n"
6306 "}\n";
6307 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006308 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006309 "\n"
6310 "layout(location=0) out vec4 color;\n"
6311 "void main(){\n"
6312 " color = vec4(1);\n"
6313 "}\n";
6314
6315 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6316 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6317
6318 VkPipelineObj pipe(m_device);
6319 pipe.AddColorAttachment();
6320 pipe.AddShader(&vs);
6321 pipe.AddShader(&fs);
6322
6323 pipe.AddVertexInputBindings(&input_binding, 1);
6324 pipe.AddVertexInputAttribs(&input_attrib, 1);
6325
6326 VkDescriptorSetObj descriptorSet(m_device);
6327 descriptorSet.AppendDummy();
6328 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6329
6330 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6331
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006332 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13006333}
6334
Karl Schultz6addd812016-02-02 17:17:23 -07006335TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
6336 m_errorMonitor->SetDesiredFailureMsg(
6337 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006338 "VS consumes input at location 0 but not provided");
6339
Chris Forbes62e8e502015-05-25 11:13:29 +12006340 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006341 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12006342
6343 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006344 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006345 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006346 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07006347 "out gl_PerVertex {\n"
6348 " vec4 gl_Position;\n"
6349 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006350 "void main(){\n"
6351 " gl_Position = x;\n"
6352 "}\n";
6353 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006354 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006355 "\n"
6356 "layout(location=0) out vec4 color;\n"
6357 "void main(){\n"
6358 " color = vec4(1);\n"
6359 "}\n";
6360
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006361 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6362 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12006363
6364 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006365 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12006366 pipe.AddShader(&vs);
6367 pipe.AddShader(&fs);
6368
Chris Forbes62e8e502015-05-25 11:13:29 +12006369 VkDescriptorSetObj descriptorSet(m_device);
6370 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006371 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12006372
Tony Barbour5781e8f2015-08-04 16:23:11 -06006373 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12006374
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006375 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12006376}
6377
Karl Schultz6addd812016-02-02 17:17:23 -07006378TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
6379 m_errorMonitor->SetDesiredFailureMsg(
6380 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006381 "location 0 does not match VS input type");
6382
Chris Forbesc97d98e2015-05-25 11:13:31 +12006383 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006384 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006385
6386 VkVertexInputBindingDescription input_binding;
6387 memset(&input_binding, 0, sizeof(input_binding));
6388
6389 VkVertexInputAttributeDescription input_attrib;
6390 memset(&input_attrib, 0, sizeof(input_attrib));
6391 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6392
6393 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006394 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006395 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006396 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006397 "out gl_PerVertex {\n"
6398 " vec4 gl_Position;\n"
6399 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006400 "void main(){\n"
6401 " gl_Position = vec4(x);\n"
6402 "}\n";
6403 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006404 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006405 "\n"
6406 "layout(location=0) out vec4 color;\n"
6407 "void main(){\n"
6408 " color = vec4(1);\n"
6409 "}\n";
6410
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006411 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6412 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006413
6414 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006415 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006416 pipe.AddShader(&vs);
6417 pipe.AddShader(&fs);
6418
6419 pipe.AddVertexInputBindings(&input_binding, 1);
6420 pipe.AddVertexInputAttribs(&input_attrib, 1);
6421
Chris Forbesc97d98e2015-05-25 11:13:31 +12006422 VkDescriptorSetObj descriptorSet(m_device);
6423 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006424 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006425
Tony Barbour5781e8f2015-08-04 16:23:11 -06006426 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006427
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006428 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006429}
6430
Chris Forbesc68b43c2016-04-06 11:18:47 +12006431TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
6432 m_errorMonitor->SetDesiredFailureMsg(
6433 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6434 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
6435
6436 ASSERT_NO_FATAL_FAILURE(InitState());
6437 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6438
6439 char const *vsSource =
6440 "#version 450\n"
6441 "\n"
6442 "out gl_PerVertex {\n"
6443 " vec4 gl_Position;\n"
6444 "};\n"
6445 "void main(){\n"
6446 " gl_Position = vec4(1);\n"
6447 "}\n";
6448 char const *fsSource =
6449 "#version 450\n"
6450 "\n"
6451 "layout(location=0) out vec4 color;\n"
6452 "void main(){\n"
6453 " color = vec4(1);\n"
6454 "}\n";
6455
6456 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6457 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6458
6459 VkPipelineObj pipe(m_device);
6460 pipe.AddColorAttachment();
6461 pipe.AddShader(&vs);
6462 pipe.AddShader(&vs);
6463 pipe.AddShader(&fs);
6464
6465 VkDescriptorSetObj descriptorSet(m_device);
6466 descriptorSet.AppendDummy();
6467 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6468
6469 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6470
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006471 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12006472}
6473
Karl Schultz6addd812016-02-02 17:17:23 -07006474TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006475 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006476
6477 ASSERT_NO_FATAL_FAILURE(InitState());
6478 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6479
6480 VkVertexInputBindingDescription input_binding;
6481 memset(&input_binding, 0, sizeof(input_binding));
6482
6483 VkVertexInputAttributeDescription input_attribs[2];
6484 memset(input_attribs, 0, sizeof(input_attribs));
6485
6486 for (int i = 0; i < 2; i++) {
6487 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6488 input_attribs[i].location = i;
6489 }
6490
6491 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006492 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006493 "\n"
6494 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006495 "out gl_PerVertex {\n"
6496 " vec4 gl_Position;\n"
6497 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006498 "void main(){\n"
6499 " gl_Position = x[0] + x[1];\n"
6500 "}\n";
6501 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006502 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006503 "\n"
6504 "layout(location=0) out vec4 color;\n"
6505 "void main(){\n"
6506 " color = vec4(1);\n"
6507 "}\n";
6508
6509 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6510 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6511
6512 VkPipelineObj pipe(m_device);
6513 pipe.AddColorAttachment();
6514 pipe.AddShader(&vs);
6515 pipe.AddShader(&fs);
6516
6517 pipe.AddVertexInputBindings(&input_binding, 1);
6518 pipe.AddVertexInputAttribs(input_attribs, 2);
6519
6520 VkDescriptorSetObj descriptorSet(m_device);
6521 descriptorSet.AppendDummy();
6522 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6523
6524 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6525
6526 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006527 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006528}
6529
Chris Forbes2682b242015-11-24 11:13:14 +13006530TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
6531{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006532 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006533
6534 ASSERT_NO_FATAL_FAILURE(InitState());
6535 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6536
6537 VkVertexInputBindingDescription input_binding;
6538 memset(&input_binding, 0, sizeof(input_binding));
6539
6540 VkVertexInputAttributeDescription input_attribs[2];
6541 memset(input_attribs, 0, sizeof(input_attribs));
6542
6543 for (int i = 0; i < 2; i++) {
6544 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6545 input_attribs[i].location = i;
6546 }
6547
6548 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006549 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006550 "\n"
6551 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07006552 "out gl_PerVertex {\n"
6553 " vec4 gl_Position;\n"
6554 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006555 "void main(){\n"
6556 " gl_Position = x[0] + x[1];\n"
6557 "}\n";
6558 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006559 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006560 "\n"
6561 "layout(location=0) out vec4 color;\n"
6562 "void main(){\n"
6563 " color = vec4(1);\n"
6564 "}\n";
6565
6566 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6567 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6568
6569 VkPipelineObj pipe(m_device);
6570 pipe.AddColorAttachment();
6571 pipe.AddShader(&vs);
6572 pipe.AddShader(&fs);
6573
6574 pipe.AddVertexInputBindings(&input_binding, 1);
6575 pipe.AddVertexInputAttribs(input_attribs, 2);
6576
6577 VkDescriptorSetObj descriptorSet(m_device);
6578 descriptorSet.AppendDummy();
6579 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6580
6581 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6582
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006583 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006584}
Chris Forbes2682b242015-11-24 11:13:14 +13006585
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006586TEST_F(VkLayerTest, CreatePipelineSimplePositive)
6587{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006588 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006589
6590 ASSERT_NO_FATAL_FAILURE(InitState());
6591 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6592
6593 char const *vsSource =
6594 "#version 450\n"
6595 "out gl_PerVertex {\n"
6596 " vec4 gl_Position;\n"
6597 "};\n"
6598 "void main(){\n"
6599 " gl_Position = vec4(0);\n"
6600 "}\n";
6601 char const *fsSource =
6602 "#version 450\n"
6603 "\n"
6604 "layout(location=0) out vec4 color;\n"
6605 "void main(){\n"
6606 " color = vec4(1);\n"
6607 "}\n";
6608
6609 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6610 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6611
6612 VkPipelineObj pipe(m_device);
6613 pipe.AddColorAttachment();
6614 pipe.AddShader(&vs);
6615 pipe.AddShader(&fs);
6616
6617 VkDescriptorSetObj descriptorSet(m_device);
6618 descriptorSet.AppendDummy();
6619 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6620
6621 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6622
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006623 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006624}
6625
Chris Forbes912c9192016-04-05 17:50:35 +12006626TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
6627{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006628 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12006629
6630 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
6631
6632 ASSERT_NO_FATAL_FAILURE(InitState());
6633 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6634
6635 char const *vsSource =
6636 "#version 450\n"
6637 "out gl_PerVertex {\n"
6638 " vec4 gl_Position;\n"
6639 "};\n"
6640 "layout(location=0) out vec3 x;\n"
6641 "layout(location=1) out ivec3 y;\n"
6642 "layout(location=2) out vec3 z;\n"
6643 "void main(){\n"
6644 " gl_Position = vec4(0);\n"
6645 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
6646 "}\n";
6647 char const *fsSource =
6648 "#version 450\n"
6649 "\n"
6650 "layout(location=0) out vec4 color;\n"
6651 "layout(location=0) in float x;\n"
6652 "layout(location=1) flat in int y;\n"
6653 "layout(location=2) in vec2 z;\n"
6654 "void main(){\n"
6655 " color = vec4(1 + x + y + z.x);\n"
6656 "}\n";
6657
6658 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6659 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6660
6661 VkPipelineObj pipe(m_device);
6662 pipe.AddColorAttachment();
6663 pipe.AddShader(&vs);
6664 pipe.AddShader(&fs);
6665
6666 VkDescriptorSetObj descriptorSet(m_device);
6667 descriptorSet.AppendDummy();
6668 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6669
6670 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6671
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006672 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12006673}
6674
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006675TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
6676{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006677 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006678
6679 ASSERT_NO_FATAL_FAILURE(InitState());
6680 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6681
Chris Forbesc1e852d2016-04-04 19:26:42 +12006682 if (!m_device->phy().features().tessellationShader) {
6683 printf("Device does not support tessellation shaders; skipped.\n");
6684 return;
6685 }
6686
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006687 char const *vsSource =
6688 "#version 450\n"
6689 "void main(){}\n";
6690 char const *tcsSource =
6691 "#version 450\n"
6692 "layout(location=0) out int x[];\n"
6693 "layout(vertices=3) out;\n"
6694 "void main(){\n"
6695 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
6696 " gl_TessLevelInner[0] = 1;\n"
6697 " x[gl_InvocationID] = gl_InvocationID;\n"
6698 "}\n";
6699 char const *tesSource =
6700 "#version 450\n"
6701 "layout(triangles, equal_spacing, cw) in;\n"
6702 "layout(location=0) in int x[];\n"
6703 "out gl_PerVertex { vec4 gl_Position; };\n"
6704 "void main(){\n"
6705 " gl_Position.xyz = gl_TessCoord;\n"
6706 " gl_Position.w = x[0] + x[1] + x[2];\n"
6707 "}\n";
6708 char const *fsSource =
6709 "#version 450\n"
6710 "layout(location=0) out vec4 color;\n"
6711 "void main(){\n"
6712 " color = vec4(1);\n"
6713 "}\n";
6714
6715 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6716 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
6717 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
6718 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6719
6720 VkPipelineInputAssemblyStateCreateInfo iasci{
6721 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
6722 nullptr,
6723 0,
6724 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
6725 VK_FALSE};
6726
Chris Forbesb4cacb62016-04-04 19:15:00 +12006727 VkPipelineTessellationStateCreateInfo tsci{
6728 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
6729 nullptr,
6730 0,
6731 3};
6732
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006733 VkPipelineObj pipe(m_device);
6734 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12006735 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006736 pipe.AddColorAttachment();
6737 pipe.AddShader(&vs);
6738 pipe.AddShader(&tcs);
6739 pipe.AddShader(&tes);
6740 pipe.AddShader(&fs);
6741
6742 VkDescriptorSetObj descriptorSet(m_device);
6743 descriptorSet.AppendDummy();
6744 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6745
6746 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6747
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006748 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006749}
6750
Chris Forbesa0ab8152016-04-20 13:34:27 +12006751TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
6752{
6753 m_errorMonitor->ExpectSuccess();
6754
6755 ASSERT_NO_FATAL_FAILURE(InitState());
6756 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6757
6758 if (!m_device->phy().features().geometryShader) {
6759 printf("Device does not support geometry shaders; skipped.\n");
6760 return;
6761 }
6762
6763 char const *vsSource =
6764 "#version 450\n"
6765 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
6766 "void main(){\n"
6767 " vs_out.x = vec4(1);\n"
6768 "}\n";
6769 char const *gsSource =
6770 "#version 450\n"
6771 "layout(triangles) in;\n"
6772 "layout(triangle_strip, max_vertices=3) out;\n"
6773 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
6774 "out gl_PerVertex { vec4 gl_Position; };\n"
6775 "void main() {\n"
6776 " gl_Position = gs_in[0].x;\n"
6777 " EmitVertex();\n"
6778 "}\n";
6779 char const *fsSource =
6780 "#version 450\n"
6781 "layout(location=0) out vec4 color;\n"
6782 "void main(){\n"
6783 " color = vec4(1);\n"
6784 "}\n";
6785
6786 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6787 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
6788 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6789
6790 VkPipelineObj pipe(m_device);
6791 pipe.AddColorAttachment();
6792 pipe.AddShader(&vs);
6793 pipe.AddShader(&gs);
6794 pipe.AddShader(&fs);
6795
6796 VkDescriptorSetObj descriptorSet(m_device);
6797 descriptorSet.AppendDummy();
6798 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6799
6800 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6801
6802 m_errorMonitor->VerifyNotFound();
6803}
6804
Chris Forbesa0193bc2016-04-04 19:19:47 +12006805TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
6806{
6807 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6808 "is per-vertex in tessellation control shader stage "
6809 "but per-patch in tessellation evaluation shader stage");
6810
6811 ASSERT_NO_FATAL_FAILURE(InitState());
6812 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6813
Chris Forbesc1e852d2016-04-04 19:26:42 +12006814 if (!m_device->phy().features().tessellationShader) {
6815 printf("Device does not support tessellation shaders; skipped.\n");
6816 return;
6817 }
6818
Chris Forbesa0193bc2016-04-04 19:19:47 +12006819 char const *vsSource =
6820 "#version 450\n"
6821 "void main(){}\n";
6822 char const *tcsSource =
6823 "#version 450\n"
6824 "layout(location=0) out int x[];\n"
6825 "layout(vertices=3) out;\n"
6826 "void main(){\n"
6827 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
6828 " gl_TessLevelInner[0] = 1;\n"
6829 " x[gl_InvocationID] = gl_InvocationID;\n"
6830 "}\n";
6831 char const *tesSource =
6832 "#version 450\n"
6833 "layout(triangles, equal_spacing, cw) in;\n"
6834 "layout(location=0) patch in int x;\n"
6835 "out gl_PerVertex { vec4 gl_Position; };\n"
6836 "void main(){\n"
6837 " gl_Position.xyz = gl_TessCoord;\n"
6838 " gl_Position.w = x;\n"
6839 "}\n";
6840 char const *fsSource =
6841 "#version 450\n"
6842 "layout(location=0) out vec4 color;\n"
6843 "void main(){\n"
6844 " color = vec4(1);\n"
6845 "}\n";
6846
6847 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6848 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
6849 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
6850 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6851
6852 VkPipelineInputAssemblyStateCreateInfo iasci{
6853 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
6854 nullptr,
6855 0,
6856 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
6857 VK_FALSE};
6858
6859 VkPipelineTessellationStateCreateInfo tsci{
6860 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
6861 nullptr,
6862 0,
6863 3};
6864
6865 VkPipelineObj pipe(m_device);
6866 pipe.SetInputAssembly(&iasci);
6867 pipe.SetTessellation(&tsci);
6868 pipe.AddColorAttachment();
6869 pipe.AddShader(&vs);
6870 pipe.AddShader(&tcs);
6871 pipe.AddShader(&tes);
6872 pipe.AddShader(&fs);
6873
6874 VkDescriptorSetObj descriptorSet(m_device);
6875 descriptorSet.AppendDummy();
6876 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6877
6878 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6879
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006880 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12006881}
6882
Karl Schultz6addd812016-02-02 17:17:23 -07006883TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
6884 m_errorMonitor->SetDesiredFailureMsg(
6885 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006886 "Duplicate vertex input binding descriptions for binding 0");
6887
Chris Forbes280ba2c2015-06-12 11:16:41 +12006888 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006889 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12006890
6891 /* Two binding descriptions for binding 0 */
6892 VkVertexInputBindingDescription input_bindings[2];
6893 memset(input_bindings, 0, sizeof(input_bindings));
6894
6895 VkVertexInputAttributeDescription input_attrib;
6896 memset(&input_attrib, 0, sizeof(input_attrib));
6897 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6898
6899 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006900 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12006901 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006902 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006903 "out gl_PerVertex {\n"
6904 " vec4 gl_Position;\n"
6905 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12006906 "void main(){\n"
6907 " gl_Position = vec4(x);\n"
6908 "}\n";
6909 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006910 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12006911 "\n"
6912 "layout(location=0) out vec4 color;\n"
6913 "void main(){\n"
6914 " color = vec4(1);\n"
6915 "}\n";
6916
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006917 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6918 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12006919
6920 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006921 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12006922 pipe.AddShader(&vs);
6923 pipe.AddShader(&fs);
6924
6925 pipe.AddVertexInputBindings(input_bindings, 2);
6926 pipe.AddVertexInputAttribs(&input_attrib, 1);
6927
Chris Forbes280ba2c2015-06-12 11:16:41 +12006928 VkDescriptorSetObj descriptorSet(m_device);
6929 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006930 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12006931
Tony Barbour5781e8f2015-08-04 16:23:11 -06006932 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12006933
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006934 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12006935}
Chris Forbes8f68b562015-05-25 11:13:32 +12006936
Chris Forbes35efec72016-04-21 14:32:08 +12006937TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
6938 m_errorMonitor->ExpectSuccess();
6939
6940 ASSERT_NO_FATAL_FAILURE(InitState());
6941 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6942
6943 if (!m_device->phy().features().tessellationShader) {
6944 printf("Device does not support 64bit vertex attributes; skipped.\n");
6945 return;
6946 }
6947
6948 VkVertexInputBindingDescription input_bindings[1];
6949 memset(input_bindings, 0, sizeof(input_bindings));
6950
6951 VkVertexInputAttributeDescription input_attribs[4];
6952 memset(input_attribs, 0, sizeof(input_attribs));
6953 input_attribs[0].location = 0;
6954 input_attribs[0].offset = 0;
6955 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
6956 input_attribs[1].location = 2;
6957 input_attribs[1].offset = 32;
6958 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
6959 input_attribs[2].location = 4;
6960 input_attribs[2].offset = 64;
6961 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
6962 input_attribs[3].location = 6;
6963 input_attribs[3].offset = 96;
6964 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
6965
6966 char const *vsSource =
6967 "#version 450\n"
6968 "\n"
6969 "layout(location=0) in dmat4 x;\n"
6970 "out gl_PerVertex {\n"
6971 " vec4 gl_Position;\n"
6972 "};\n"
6973 "void main(){\n"
6974 " gl_Position = vec4(x[0][0]);\n"
6975 "}\n";
6976 char const *fsSource =
6977 "#version 450\n"
6978 "\n"
6979 "layout(location=0) out vec4 color;\n"
6980 "void main(){\n"
6981 " color = vec4(1);\n"
6982 "}\n";
6983
6984 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6985 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6986
6987 VkPipelineObj pipe(m_device);
6988 pipe.AddColorAttachment();
6989 pipe.AddShader(&vs);
6990 pipe.AddShader(&fs);
6991
6992 pipe.AddVertexInputBindings(input_bindings, 1);
6993 pipe.AddVertexInputAttribs(input_attribs, 4);
6994
6995 VkDescriptorSetObj descriptorSet(m_device);
6996 descriptorSet.AppendDummy();
6997 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6998
6999 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7000
7001 m_errorMonitor->VerifyNotFound();
7002}
7003
Karl Schultz6addd812016-02-02 17:17:23 -07007004TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007006 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007007
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007008 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007009
7010 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007011 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007012 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007013 "out gl_PerVertex {\n"
7014 " vec4 gl_Position;\n"
7015 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007016 "void main(){\n"
7017 " gl_Position = vec4(1);\n"
7018 "}\n";
7019 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007020 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007021 "\n"
7022 "void main(){\n"
7023 "}\n";
7024
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007025 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7026 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007027
7028 VkPipelineObj pipe(m_device);
7029 pipe.AddShader(&vs);
7030 pipe.AddShader(&fs);
7031
Chia-I Wu08accc62015-07-07 11:50:03 +08007032 /* set up CB 0, not written */
7033 pipe.AddColorAttachment();
7034 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007035
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007036 VkDescriptorSetObj descriptorSet(m_device);
7037 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007038 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007039
Tony Barbour5781e8f2015-08-04 16:23:11 -06007040 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007041
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007042 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007043}
7044
Karl Schultz6addd812016-02-02 17:17:23 -07007045TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07007046 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007047 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007048 "FS writes to output location 1 with no matching attachment");
7049
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007050 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007051
7052 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007053 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007054 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007055 "out gl_PerVertex {\n"
7056 " vec4 gl_Position;\n"
7057 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007058 "void main(){\n"
7059 " gl_Position = vec4(1);\n"
7060 "}\n";
7061 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007062 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007063 "\n"
7064 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007065 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007066 "void main(){\n"
7067 " x = vec4(1);\n"
7068 " y = vec4(1);\n"
7069 "}\n";
7070
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007071 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7072 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007073
7074 VkPipelineObj pipe(m_device);
7075 pipe.AddShader(&vs);
7076 pipe.AddShader(&fs);
7077
Chia-I Wu08accc62015-07-07 11:50:03 +08007078 /* set up CB 0, not written */
7079 pipe.AddColorAttachment();
7080 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007081 /* FS writes CB 1, but we don't configure it */
7082
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007083 VkDescriptorSetObj descriptorSet(m_device);
7084 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007085 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007086
Tony Barbour5781e8f2015-08-04 16:23:11 -06007087 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007088
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007089 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007090}
7091
Karl Schultz6addd812016-02-02 17:17:23 -07007092TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007094 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007095
Chris Forbesa36d69e2015-05-25 11:13:44 +12007096 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007097
7098 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007099 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007100 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007101 "out gl_PerVertex {\n"
7102 " vec4 gl_Position;\n"
7103 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007104 "void main(){\n"
7105 " gl_Position = vec4(1);\n"
7106 "}\n";
7107 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007108 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007109 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007110 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12007111 "void main(){\n"
7112 " x = ivec4(1);\n"
7113 "}\n";
7114
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007115 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7116 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007117
7118 VkPipelineObj pipe(m_device);
7119 pipe.AddShader(&vs);
7120 pipe.AddShader(&fs);
7121
Chia-I Wu08accc62015-07-07 11:50:03 +08007122 /* set up CB 0; type is UNORM by default */
7123 pipe.AddColorAttachment();
7124 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007125
Chris Forbesa36d69e2015-05-25 11:13:44 +12007126 VkDescriptorSetObj descriptorSet(m_device);
7127 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007128 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007129
Tony Barbour5781e8f2015-08-04 16:23:11 -06007130 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007131
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007132 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12007133}
Chris Forbes7b1b8932015-06-05 14:43:36 +12007134
Karl Schultz6addd812016-02-02 17:17:23 -07007135TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007137 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007138
Chris Forbes556c76c2015-08-14 12:04:59 +12007139 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12007140
7141 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007142 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007143 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007144 "out gl_PerVertex {\n"
7145 " vec4 gl_Position;\n"
7146 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007147 "void main(){\n"
7148 " gl_Position = vec4(1);\n"
7149 "}\n";
7150 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007151 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007152 "\n"
7153 "layout(location=0) out vec4 x;\n"
7154 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7155 "void main(){\n"
7156 " x = vec4(bar.y);\n"
7157 "}\n";
7158
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007159 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7160 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12007161
Chris Forbes556c76c2015-08-14 12:04:59 +12007162 VkPipelineObj pipe(m_device);
7163 pipe.AddShader(&vs);
7164 pipe.AddShader(&fs);
7165
7166 /* set up CB 0; type is UNORM by default */
7167 pipe.AddColorAttachment();
7168 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7169
7170 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007171 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12007172
7173 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7174
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007175 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12007176}
7177
Chris Forbes5c59e902016-02-26 16:56:09 +13007178TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
7179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7180 "not declared in layout");
7181
7182 ASSERT_NO_FATAL_FAILURE(InitState());
7183
7184 char const *vsSource =
7185 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007186 "\n"
7187 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
7188 "out gl_PerVertex {\n"
7189 " vec4 gl_Position;\n"
7190 "};\n"
7191 "void main(){\n"
7192 " gl_Position = vec4(consts.x);\n"
7193 "}\n";
7194 char const *fsSource =
7195 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007196 "\n"
7197 "layout(location=0) out vec4 x;\n"
7198 "void main(){\n"
7199 " x = vec4(1);\n"
7200 "}\n";
7201
7202 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7203 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7204
7205 VkPipelineObj pipe(m_device);
7206 pipe.AddShader(&vs);
7207 pipe.AddShader(&fs);
7208
7209 /* set up CB 0; type is UNORM by default */
7210 pipe.AddColorAttachment();
7211 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7212
7213 VkDescriptorSetObj descriptorSet(m_device);
7214 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7215
7216 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7217
7218 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007219 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13007220}
7221
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007222#endif // SHADER_CHECKER_TESTS
7223
7224#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06007225TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07007226 m_errorMonitor->SetDesiredFailureMsg(
7227 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007228 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007229
7230 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007231
7232 // Create an image
7233 VkImage image;
7234
Karl Schultz6addd812016-02-02 17:17:23 -07007235 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7236 const int32_t tex_width = 32;
7237 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007238
7239 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007240 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7241 image_create_info.pNext = NULL;
7242 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7243 image_create_info.format = tex_format;
7244 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007245 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07007246 image_create_info.extent.depth = 1;
7247 image_create_info.mipLevels = 1;
7248 image_create_info.arrayLayers = 1;
7249 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7250 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7251 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7252 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007253
7254 // Introduce error by sending down a bogus width extent
7255 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007256 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007257
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007258 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007259}
7260
Mark Youngc48c4c12016-04-11 14:26:49 -06007261TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
7262 m_errorMonitor->SetDesiredFailureMsg(
7263 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7264 "CreateImage extents is 0 for at least one required dimension");
7265
7266 ASSERT_NO_FATAL_FAILURE(InitState());
7267
7268 // Create an image
7269 VkImage image;
7270
7271 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7272 const int32_t tex_width = 32;
7273 const int32_t tex_height = 32;
7274
7275 VkImageCreateInfo image_create_info = {};
7276 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7277 image_create_info.pNext = NULL;
7278 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7279 image_create_info.format = tex_format;
7280 image_create_info.extent.width = tex_width;
7281 image_create_info.extent.height = tex_height;
7282 image_create_info.extent.depth = 1;
7283 image_create_info.mipLevels = 1;
7284 image_create_info.arrayLayers = 1;
7285 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7286 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7287 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7288 image_create_info.flags = 0;
7289
7290 // Introduce error by sending down a bogus width extent
7291 image_create_info.extent.width = 0;
7292 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7293
7294 m_errorMonitor->VerifyFound();
7295}
7296
Karl Schultz6addd812016-02-02 17:17:23 -07007297TEST_F(VkLayerTest, UpdateBufferAlignment) {
7298 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06007299
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007301 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007302
Mike Stroyana3082432015-09-25 13:39:21 -06007303 ASSERT_NO_FATAL_FAILURE(InitState());
7304
7305 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7306 vk_testing::Buffer buffer;
7307 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7308
7309 BeginCommandBuffer();
7310 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007311 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007312 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007313
Mike Stroyana3082432015-09-25 13:39:21 -06007314 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007315 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007316 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007317
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007318 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007319 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007320 EndCommandBuffer();
7321}
7322
Karl Schultz6addd812016-02-02 17:17:23 -07007323TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007325 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06007326
7327 ASSERT_NO_FATAL_FAILURE(InitState());
7328
7329 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7330 vk_testing::Buffer buffer;
7331 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7332
7333 BeginCommandBuffer();
7334 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007335 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007336 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007337
Mike Stroyana3082432015-09-25 13:39:21 -06007338 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007340 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007341
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007342 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007343
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007344 m_errorMonitor->VerifyFound();
7345
Mike Stroyana3082432015-09-25 13:39:21 -06007346 EndCommandBuffer();
7347}
7348
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007349#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12007350
Tobin Ehliscde08892015-09-22 10:11:37 -06007351#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007352TEST_F(VkLayerTest, InvalidImageView) {
7353 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06007354
Karl Schultz6addd812016-02-02 17:17:23 -07007355 m_errorMonitor->SetDesiredFailureMsg(
7356 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007357 "vkCreateImageView called with baseMipLevel 10 ");
7358
Tobin Ehliscde08892015-09-22 10:11:37 -06007359 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06007360
Mike Stroyana3082432015-09-25 13:39:21 -06007361 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07007362 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06007363
Karl Schultz6addd812016-02-02 17:17:23 -07007364 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7365 const int32_t tex_width = 32;
7366 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06007367
7368 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007369 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7370 image_create_info.pNext = NULL;
7371 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7372 image_create_info.format = tex_format;
7373 image_create_info.extent.width = tex_width;
7374 image_create_info.extent.height = tex_height;
7375 image_create_info.extent.depth = 1;
7376 image_create_info.mipLevels = 1;
7377 image_create_info.arrayLayers = 1;
7378 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7379 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7380 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7381 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06007382
Chia-I Wuf7458c52015-10-26 21:10:41 +08007383 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06007384 ASSERT_VK_SUCCESS(err);
7385
7386 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007387 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7388 image_view_create_info.image = image;
7389 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7390 image_view_create_info.format = tex_format;
7391 image_view_create_info.subresourceRange.layerCount = 1;
7392 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
7393 image_view_create_info.subresourceRange.levelCount = 1;
7394 image_view_create_info.subresourceRange.aspectMask =
7395 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06007396
7397 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007398 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7399 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06007400
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007401 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06007402}
Mike Stroyana3082432015-09-25 13:39:21 -06007403
Karl Schultz6addd812016-02-02 17:17:23 -07007404TEST_F(VkLayerTest, InvalidImageViewAspect) {
7405 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007406
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007408 "vkCreateImageView: Color image "
7409 "formats must have ONLY the "
7410 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007411
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007412 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007413
7414 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07007415 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007416
Karl Schultz6addd812016-02-02 17:17:23 -07007417 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7418 const int32_t tex_width = 32;
7419 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007420
7421 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007422 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7423 image_create_info.pNext = NULL;
7424 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7425 image_create_info.format = tex_format;
7426 image_create_info.extent.width = tex_width;
7427 image_create_info.extent.height = tex_height;
7428 image_create_info.extent.depth = 1;
7429 image_create_info.mipLevels = 1;
7430 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7431 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7432 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7433 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007434
Chia-I Wuf7458c52015-10-26 21:10:41 +08007435 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007436 ASSERT_VK_SUCCESS(err);
7437
7438 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007439 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7440 image_view_create_info.image = image;
7441 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7442 image_view_create_info.format = tex_format;
7443 image_view_create_info.subresourceRange.baseMipLevel = 0;
7444 image_view_create_info.subresourceRange.levelCount = 1;
7445 // Cause an error by setting an invalid image aspect
7446 image_view_create_info.subresourceRange.aspectMask =
7447 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007448
7449 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007450 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7451 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007452
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007453 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007454}
7455
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007456TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07007457 VkResult err;
7458 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007459
Karl Schultz6addd812016-02-02 17:17:23 -07007460 m_errorMonitor->SetDesiredFailureMsg(
7461 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007462 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007463
Mike Stroyana3082432015-09-25 13:39:21 -06007464 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007465
7466 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007467 VkImage srcImage;
7468 VkImage dstImage;
7469 VkDeviceMemory srcMem;
7470 VkDeviceMemory destMem;
7471 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007472
7473 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007474 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7475 image_create_info.pNext = NULL;
7476 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7477 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7478 image_create_info.extent.width = 32;
7479 image_create_info.extent.height = 32;
7480 image_create_info.extent.depth = 1;
7481 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007482 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07007483 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7484 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7485 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7486 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007487
Karl Schultz6addd812016-02-02 17:17:23 -07007488 err =
7489 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007490 ASSERT_VK_SUCCESS(err);
7491
Karl Schultz6addd812016-02-02 17:17:23 -07007492 err =
7493 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007494 ASSERT_VK_SUCCESS(err);
7495
7496 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007497 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007498 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7499 memAlloc.pNext = NULL;
7500 memAlloc.allocationSize = 0;
7501 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007502
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007503 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007504 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007505 pass =
7506 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007507 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007508 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007509 ASSERT_VK_SUCCESS(err);
7510
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007511 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007512 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007513 pass =
7514 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007515 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007516 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007517 ASSERT_VK_SUCCESS(err);
7518
7519 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7520 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007521 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007522 ASSERT_VK_SUCCESS(err);
7523
7524 BeginCommandBuffer();
7525 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007526 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007527 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007528 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007529 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06007530 copyRegion.srcOffset.x = 0;
7531 copyRegion.srcOffset.y = 0;
7532 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007533 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007534 copyRegion.dstSubresource.mipLevel = 0;
7535 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007536 // Introduce failure by forcing the dst layerCount to differ from src
7537 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007538 copyRegion.dstOffset.x = 0;
7539 copyRegion.dstOffset.y = 0;
7540 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007541 copyRegion.extent.width = 1;
7542 copyRegion.extent.height = 1;
7543 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007544 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7545 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007546 EndCommandBuffer();
7547
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007548 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007549
Chia-I Wuf7458c52015-10-26 21:10:41 +08007550 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007551 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007552 vkFreeMemory(m_device->device(), srcMem, NULL);
7553 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007554}
7555
Karl Schultz6addd812016-02-02 17:17:23 -07007556TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06007557 VkResult err;
7558 bool pass;
7559
7560 // Create color images with different format sizes and try to copy between them
7561 m_errorMonitor->SetDesiredFailureMsg(
7562 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7563 "vkCmdCopyImage called with unmatched source and dest image format sizes");
7564
7565 ASSERT_NO_FATAL_FAILURE(InitState());
7566
7567 // Create two images of different types and try to copy between them
7568 VkImage srcImage;
7569 VkImage dstImage;
7570 VkDeviceMemory srcMem;
7571 VkDeviceMemory destMem;
7572 VkMemoryRequirements memReqs;
7573
7574 VkImageCreateInfo image_create_info = {};
7575 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7576 image_create_info.pNext = NULL;
7577 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7578 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7579 image_create_info.extent.width = 32;
7580 image_create_info.extent.height = 32;
7581 image_create_info.extent.depth = 1;
7582 image_create_info.mipLevels = 1;
7583 image_create_info.arrayLayers = 1;
7584 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7585 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7586 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7587 image_create_info.flags = 0;
7588
7589 err =
7590 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
7591 ASSERT_VK_SUCCESS(err);
7592
7593 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7594 // Introduce failure by creating second image with a different-sized format.
7595 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
7596
7597 err =
7598 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
7599 ASSERT_VK_SUCCESS(err);
7600
7601 // Allocate memory
7602 VkMemoryAllocateInfo memAlloc = {};
7603 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7604 memAlloc.pNext = NULL;
7605 memAlloc.allocationSize = 0;
7606 memAlloc.memoryTypeIndex = 0;
7607
7608 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
7609 memAlloc.allocationSize = memReqs.size;
7610 pass =
7611 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7612 ASSERT_TRUE(pass);
7613 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
7614 ASSERT_VK_SUCCESS(err);
7615
7616 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
7617 memAlloc.allocationSize = memReqs.size;
7618 pass =
7619 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7620 ASSERT_TRUE(pass);
7621 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
7622 ASSERT_VK_SUCCESS(err);
7623
7624 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7625 ASSERT_VK_SUCCESS(err);
7626 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
7627 ASSERT_VK_SUCCESS(err);
7628
7629 BeginCommandBuffer();
7630 VkImageCopy copyRegion;
7631 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7632 copyRegion.srcSubresource.mipLevel = 0;
7633 copyRegion.srcSubresource.baseArrayLayer = 0;
7634 copyRegion.srcSubresource.layerCount = 0;
7635 copyRegion.srcOffset.x = 0;
7636 copyRegion.srcOffset.y = 0;
7637 copyRegion.srcOffset.z = 0;
7638 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7639 copyRegion.dstSubresource.mipLevel = 0;
7640 copyRegion.dstSubresource.baseArrayLayer = 0;
7641 copyRegion.dstSubresource.layerCount = 0;
7642 copyRegion.dstOffset.x = 0;
7643 copyRegion.dstOffset.y = 0;
7644 copyRegion.dstOffset.z = 0;
7645 copyRegion.extent.width = 1;
7646 copyRegion.extent.height = 1;
7647 copyRegion.extent.depth = 1;
7648 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7649 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7650 EndCommandBuffer();
7651
7652 m_errorMonitor->VerifyFound();
7653
7654 vkDestroyImage(m_device->device(), srcImage, NULL);
7655 vkDestroyImage(m_device->device(), dstImage, NULL);
7656 vkFreeMemory(m_device->device(), srcMem, NULL);
7657 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007658}
7659
Karl Schultz6addd812016-02-02 17:17:23 -07007660TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
7661 VkResult err;
7662 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007663
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007664 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007665 m_errorMonitor->SetDesiredFailureMsg(
7666 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007667 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007668
Mike Stroyana3082432015-09-25 13:39:21 -06007669 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007670
7671 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007672 VkImage srcImage;
7673 VkImage dstImage;
7674 VkDeviceMemory srcMem;
7675 VkDeviceMemory destMem;
7676 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007677
7678 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007679 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7680 image_create_info.pNext = NULL;
7681 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7682 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7683 image_create_info.extent.width = 32;
7684 image_create_info.extent.height = 32;
7685 image_create_info.extent.depth = 1;
7686 image_create_info.mipLevels = 1;
7687 image_create_info.arrayLayers = 1;
7688 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7689 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7690 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7691 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007692
Karl Schultz6addd812016-02-02 17:17:23 -07007693 err =
7694 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007695 ASSERT_VK_SUCCESS(err);
7696
Karl Schultzbdb75952016-04-19 11:36:49 -06007697 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7698
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007699 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07007700 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007701 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
7702 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007703
Karl Schultz6addd812016-02-02 17:17:23 -07007704 err =
7705 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007706 ASSERT_VK_SUCCESS(err);
7707
7708 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007709 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007710 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7711 memAlloc.pNext = NULL;
7712 memAlloc.allocationSize = 0;
7713 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007714
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007715 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007716 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007717 pass =
7718 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007719 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007720 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007721 ASSERT_VK_SUCCESS(err);
7722
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007723 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007724 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007725 pass =
7726 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007727 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007728 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007729 ASSERT_VK_SUCCESS(err);
7730
7731 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7732 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007733 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007734 ASSERT_VK_SUCCESS(err);
7735
7736 BeginCommandBuffer();
7737 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007738 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007739 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007740 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007741 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007742 copyRegion.srcOffset.x = 0;
7743 copyRegion.srcOffset.y = 0;
7744 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007745 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007746 copyRegion.dstSubresource.mipLevel = 0;
7747 copyRegion.dstSubresource.baseArrayLayer = 0;
7748 copyRegion.dstSubresource.layerCount = 0;
7749 copyRegion.dstOffset.x = 0;
7750 copyRegion.dstOffset.y = 0;
7751 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007752 copyRegion.extent.width = 1;
7753 copyRegion.extent.height = 1;
7754 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007755 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7756 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007757 EndCommandBuffer();
7758
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007759 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007760
Chia-I Wuf7458c52015-10-26 21:10:41 +08007761 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007762 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007763 vkFreeMemory(m_device->device(), srcMem, NULL);
7764 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007765}
7766
Karl Schultz6addd812016-02-02 17:17:23 -07007767TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
7768 VkResult err;
7769 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007770
Karl Schultz6addd812016-02-02 17:17:23 -07007771 m_errorMonitor->SetDesiredFailureMsg(
7772 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007773 "vkCmdResolveImage called with source sample count less than 2.");
7774
Mike Stroyana3082432015-09-25 13:39:21 -06007775 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007776
7777 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07007778 VkImage srcImage;
7779 VkImage dstImage;
7780 VkDeviceMemory srcMem;
7781 VkDeviceMemory destMem;
7782 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007783
7784 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007785 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7786 image_create_info.pNext = NULL;
7787 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7788 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7789 image_create_info.extent.width = 32;
7790 image_create_info.extent.height = 1;
7791 image_create_info.extent.depth = 1;
7792 image_create_info.mipLevels = 1;
7793 image_create_info.arrayLayers = 1;
7794 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7795 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7796 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7797 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007798
Karl Schultz6addd812016-02-02 17:17:23 -07007799 err =
7800 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007801 ASSERT_VK_SUCCESS(err);
7802
Karl Schultz6addd812016-02-02 17:17:23 -07007803 image_create_info.imageType = VK_IMAGE_TYPE_1D;
7804 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007805
Karl Schultz6addd812016-02-02 17:17:23 -07007806 err =
7807 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007808 ASSERT_VK_SUCCESS(err);
7809
7810 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007811 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007812 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7813 memAlloc.pNext = NULL;
7814 memAlloc.allocationSize = 0;
7815 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007816
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007817 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007818 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007819 pass =
7820 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007821 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007822 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007823 ASSERT_VK_SUCCESS(err);
7824
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007825 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007826 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007827 pass =
7828 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007829 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007830 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007831 ASSERT_VK_SUCCESS(err);
7832
7833 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7834 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007835 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007836 ASSERT_VK_SUCCESS(err);
7837
7838 BeginCommandBuffer();
7839 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07007840 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
7841 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06007842 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007843 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007844 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007845 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007846 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007847 resolveRegion.srcOffset.x = 0;
7848 resolveRegion.srcOffset.y = 0;
7849 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007850 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007851 resolveRegion.dstSubresource.mipLevel = 0;
7852 resolveRegion.dstSubresource.baseArrayLayer = 0;
7853 resolveRegion.dstSubresource.layerCount = 0;
7854 resolveRegion.dstOffset.x = 0;
7855 resolveRegion.dstOffset.y = 0;
7856 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007857 resolveRegion.extent.width = 1;
7858 resolveRegion.extent.height = 1;
7859 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007860 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7861 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007862 EndCommandBuffer();
7863
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007864 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007865
Chia-I Wuf7458c52015-10-26 21:10:41 +08007866 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007867 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007868 vkFreeMemory(m_device->device(), srcMem, NULL);
7869 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007870}
7871
Karl Schultz6addd812016-02-02 17:17:23 -07007872TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
7873 VkResult err;
7874 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007875
Karl Schultz6addd812016-02-02 17:17:23 -07007876 m_errorMonitor->SetDesiredFailureMsg(
7877 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007878 "vkCmdResolveImage called with dest sample count greater than 1.");
7879
Mike Stroyana3082432015-09-25 13:39:21 -06007880 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007881
7882 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07007883 VkImage srcImage;
7884 VkImage dstImage;
7885 VkDeviceMemory srcMem;
7886 VkDeviceMemory destMem;
7887 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007888
7889 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007890 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7891 image_create_info.pNext = NULL;
7892 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7893 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7894 image_create_info.extent.width = 32;
7895 image_create_info.extent.height = 1;
7896 image_create_info.extent.depth = 1;
7897 image_create_info.mipLevels = 1;
7898 image_create_info.arrayLayers = 1;
7899 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
7900 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7901 // Note: Some implementations expect color attachment usage for any
7902 // multisample surface
7903 image_create_info.usage =
7904 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7905 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007906
Karl Schultz6addd812016-02-02 17:17:23 -07007907 err =
7908 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007909 ASSERT_VK_SUCCESS(err);
7910
Karl Schultz6addd812016-02-02 17:17:23 -07007911 image_create_info.imageType = VK_IMAGE_TYPE_1D;
7912 // Note: Some implementations expect color attachment usage for any
7913 // multisample surface
7914 image_create_info.usage =
7915 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007916
Karl Schultz6addd812016-02-02 17:17:23 -07007917 err =
7918 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007919 ASSERT_VK_SUCCESS(err);
7920
7921 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007922 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007923 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7924 memAlloc.pNext = NULL;
7925 memAlloc.allocationSize = 0;
7926 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007927
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007928 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007929 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007930 pass =
7931 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007932 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007933 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007934 ASSERT_VK_SUCCESS(err);
7935
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007936 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007937 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007938 pass =
7939 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007940 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007941 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007942 ASSERT_VK_SUCCESS(err);
7943
7944 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7945 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007946 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007947 ASSERT_VK_SUCCESS(err);
7948
7949 BeginCommandBuffer();
7950 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07007951 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
7952 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06007953 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007954 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007955 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007956 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007957 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007958 resolveRegion.srcOffset.x = 0;
7959 resolveRegion.srcOffset.y = 0;
7960 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007961 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007962 resolveRegion.dstSubresource.mipLevel = 0;
7963 resolveRegion.dstSubresource.baseArrayLayer = 0;
7964 resolveRegion.dstSubresource.layerCount = 0;
7965 resolveRegion.dstOffset.x = 0;
7966 resolveRegion.dstOffset.y = 0;
7967 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007968 resolveRegion.extent.width = 1;
7969 resolveRegion.extent.height = 1;
7970 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007971 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7972 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007973 EndCommandBuffer();
7974
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007975 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007976
Chia-I Wuf7458c52015-10-26 21:10:41 +08007977 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007978 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007979 vkFreeMemory(m_device->device(), srcMem, NULL);
7980 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007981}
7982
Karl Schultz6addd812016-02-02 17:17:23 -07007983TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
7984 VkResult err;
7985 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007986
Karl Schultz6addd812016-02-02 17:17:23 -07007987 m_errorMonitor->SetDesiredFailureMsg(
7988 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007989 "vkCmdResolveImage called with unmatched source and dest formats.");
7990
Mike Stroyana3082432015-09-25 13:39:21 -06007991 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007992
7993 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007994 VkImage srcImage;
7995 VkImage dstImage;
7996 VkDeviceMemory srcMem;
7997 VkDeviceMemory destMem;
7998 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007999
8000 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008001 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8002 image_create_info.pNext = NULL;
8003 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8004 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8005 image_create_info.extent.width = 32;
8006 image_create_info.extent.height = 1;
8007 image_create_info.extent.depth = 1;
8008 image_create_info.mipLevels = 1;
8009 image_create_info.arrayLayers = 1;
8010 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8011 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8012 // Note: Some implementations expect color attachment usage for any
8013 // multisample surface
8014 image_create_info.usage =
8015 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8016 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008017
Karl Schultz6addd812016-02-02 17:17:23 -07008018 err =
8019 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008020 ASSERT_VK_SUCCESS(err);
8021
Karl Schultz6addd812016-02-02 17:17:23 -07008022 // Set format to something other than source image
8023 image_create_info.format = VK_FORMAT_R32_SFLOAT;
8024 // Note: Some implementations expect color attachment usage for any
8025 // multisample surface
8026 image_create_info.usage =
8027 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8028 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008029
Karl Schultz6addd812016-02-02 17:17:23 -07008030 err =
8031 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008032 ASSERT_VK_SUCCESS(err);
8033
8034 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008035 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008036 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8037 memAlloc.pNext = NULL;
8038 memAlloc.allocationSize = 0;
8039 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008040
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008041 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008042 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008043 pass =
8044 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008045 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008046 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008047 ASSERT_VK_SUCCESS(err);
8048
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008049 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008050 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008051 pass =
8052 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008053 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008054 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008055 ASSERT_VK_SUCCESS(err);
8056
8057 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8058 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008059 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008060 ASSERT_VK_SUCCESS(err);
8061
8062 BeginCommandBuffer();
8063 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008064 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8065 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008066 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008067 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008068 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008069 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008070 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008071 resolveRegion.srcOffset.x = 0;
8072 resolveRegion.srcOffset.y = 0;
8073 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008074 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008075 resolveRegion.dstSubresource.mipLevel = 0;
8076 resolveRegion.dstSubresource.baseArrayLayer = 0;
8077 resolveRegion.dstSubresource.layerCount = 0;
8078 resolveRegion.dstOffset.x = 0;
8079 resolveRegion.dstOffset.y = 0;
8080 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008081 resolveRegion.extent.width = 1;
8082 resolveRegion.extent.height = 1;
8083 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008084 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8085 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008086 EndCommandBuffer();
8087
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008088 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008089
Chia-I Wuf7458c52015-10-26 21:10:41 +08008090 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008091 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008092 vkFreeMemory(m_device->device(), srcMem, NULL);
8093 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008094}
8095
Karl Schultz6addd812016-02-02 17:17:23 -07008096TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
8097 VkResult err;
8098 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008099
Karl Schultz6addd812016-02-02 17:17:23 -07008100 m_errorMonitor->SetDesiredFailureMsg(
8101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008102 "vkCmdResolveImage called with unmatched source and dest image types.");
8103
Mike Stroyana3082432015-09-25 13:39:21 -06008104 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008105
8106 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008107 VkImage srcImage;
8108 VkImage dstImage;
8109 VkDeviceMemory srcMem;
8110 VkDeviceMemory destMem;
8111 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008112
8113 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008114 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8115 image_create_info.pNext = NULL;
8116 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8117 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8118 image_create_info.extent.width = 32;
8119 image_create_info.extent.height = 1;
8120 image_create_info.extent.depth = 1;
8121 image_create_info.mipLevels = 1;
8122 image_create_info.arrayLayers = 1;
8123 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8124 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8125 // Note: Some implementations expect color attachment usage for any
8126 // multisample surface
8127 image_create_info.usage =
8128 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8129 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008130
Karl Schultz6addd812016-02-02 17:17:23 -07008131 err =
8132 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008133 ASSERT_VK_SUCCESS(err);
8134
Karl Schultz6addd812016-02-02 17:17:23 -07008135 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8136 // Note: Some implementations expect color attachment usage for any
8137 // multisample surface
8138 image_create_info.usage =
8139 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8140 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008141
Karl Schultz6addd812016-02-02 17:17:23 -07008142 err =
8143 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008144 ASSERT_VK_SUCCESS(err);
8145
8146 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008147 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008148 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8149 memAlloc.pNext = NULL;
8150 memAlloc.allocationSize = 0;
8151 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008152
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008153 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008154 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008155 pass =
8156 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008157 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008158 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008159 ASSERT_VK_SUCCESS(err);
8160
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008161 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008162 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008163 pass =
8164 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008165 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008166 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008167 ASSERT_VK_SUCCESS(err);
8168
8169 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8170 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008171 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008172 ASSERT_VK_SUCCESS(err);
8173
8174 BeginCommandBuffer();
8175 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008176 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8177 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008178 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008179 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008180 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008181 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008182 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008183 resolveRegion.srcOffset.x = 0;
8184 resolveRegion.srcOffset.y = 0;
8185 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008186 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008187 resolveRegion.dstSubresource.mipLevel = 0;
8188 resolveRegion.dstSubresource.baseArrayLayer = 0;
8189 resolveRegion.dstSubresource.layerCount = 0;
8190 resolveRegion.dstOffset.x = 0;
8191 resolveRegion.dstOffset.y = 0;
8192 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008193 resolveRegion.extent.width = 1;
8194 resolveRegion.extent.height = 1;
8195 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008196 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8197 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008198 EndCommandBuffer();
8199
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008200 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008201
Chia-I Wuf7458c52015-10-26 21:10:41 +08008202 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008203 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008204 vkFreeMemory(m_device->device(), srcMem, NULL);
8205 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008206}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008207
Karl Schultz6addd812016-02-02 17:17:23 -07008208TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008209 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07008210 // to using a DS format, then cause it to hit error due to COLOR_BIT not
8211 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008212 // The image format check comes 2nd in validation so we trigger it first,
8213 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07008214 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008215
Karl Schultz6addd812016-02-02 17:17:23 -07008216 m_errorMonitor->SetDesiredFailureMsg(
8217 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008218 "Combination depth/stencil image formats can have only the ");
8219
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008220 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008221
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008222 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008223 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8224 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008225
8226 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008227 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8228 ds_pool_ci.pNext = NULL;
8229 ds_pool_ci.maxSets = 1;
8230 ds_pool_ci.poolSizeCount = 1;
8231 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008232
8233 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008234 err =
8235 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008236 ASSERT_VK_SUCCESS(err);
8237
8238 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008239 dsl_binding.binding = 0;
8240 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8241 dsl_binding.descriptorCount = 1;
8242 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8243 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008244
8245 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008246 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8247 ds_layout_ci.pNext = NULL;
8248 ds_layout_ci.bindingCount = 1;
8249 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008250 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008251 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8252 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008253 ASSERT_VK_SUCCESS(err);
8254
8255 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008256 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008257 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008258 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008259 alloc_info.descriptorPool = ds_pool;
8260 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008261 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8262 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008263 ASSERT_VK_SUCCESS(err);
8264
Karl Schultz6addd812016-02-02 17:17:23 -07008265 VkImage image_bad;
8266 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008267 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07008268 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008269 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07008270 const int32_t tex_width = 32;
8271 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008272
8273 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008274 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8275 image_create_info.pNext = NULL;
8276 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8277 image_create_info.format = tex_format_bad;
8278 image_create_info.extent.width = tex_width;
8279 image_create_info.extent.height = tex_height;
8280 image_create_info.extent.depth = 1;
8281 image_create_info.mipLevels = 1;
8282 image_create_info.arrayLayers = 1;
8283 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8284 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8285 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
8286 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
8287 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008288
Karl Schultz6addd812016-02-02 17:17:23 -07008289 err =
8290 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008291 ASSERT_VK_SUCCESS(err);
8292 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07008293 image_create_info.usage =
8294 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8295 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
8296 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008297 ASSERT_VK_SUCCESS(err);
8298
8299 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008300 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8301 image_view_create_info.image = image_bad;
8302 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8303 image_view_create_info.format = tex_format_bad;
8304 image_view_create_info.subresourceRange.baseArrayLayer = 0;
8305 image_view_create_info.subresourceRange.baseMipLevel = 0;
8306 image_view_create_info.subresourceRange.layerCount = 1;
8307 image_view_create_info.subresourceRange.levelCount = 1;
8308 image_view_create_info.subresourceRange.aspectMask =
8309 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008310
8311 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008312 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8313 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008314
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008315 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008316
Chia-I Wuf7458c52015-10-26 21:10:41 +08008317 vkDestroyImage(m_device->device(), image_bad, NULL);
8318 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008319 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8320 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008321}
Tobin Ehliscde08892015-09-22 10:11:37 -06008322#endif // IMAGE_TESTS
8323
Tony Barbour300a6082015-04-07 13:44:53 -06008324int main(int argc, char **argv) {
8325 int result;
8326
Cody Northrop8e54a402016-03-08 22:25:52 -07008327#ifdef ANDROID
8328 int vulkanSupport = InitVulkan();
8329 if (vulkanSupport == 0)
8330 return 1;
8331#endif
8332
Tony Barbour300a6082015-04-07 13:44:53 -06008333 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06008334 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06008335
8336 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
8337
8338 result = RUN_ALL_TESTS();
8339
Tony Barbour6918cd52015-04-09 12:58:51 -06008340 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06008341 return result;
8342}