blob: d155b0238af84288f8860f7f343258562d3d4807 [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
Ian Elliott1c32c772016-04-28 14:47:13 -0600615TEST_F(VkLayerTest, EnableWsiBeforeUse) {
616 VkResult err;
617 bool pass;
618
619 VkSurfaceKHR surface = VK_NULL_HANDLE;
620 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
621 VkSwapchainCreateInfoKHR swapchain_create_info = {};
622 uint32_t swapchain_image_count = 0;
623// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
624 uint32_t image_index = 0;
625// VkPresentInfoKHR present_info = {};
626
627 ASSERT_NO_FATAL_FAILURE(InitState());
628
629#if defined(VK_USE_PLATFORM_XCB_KHR)
630 // Use the functions from the VK_KHR_xcb_surface extension without enabling
631 // that extension:
632
633 // Create a surface:
634 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
635#if 0
636#endif
637 m_errorMonitor->SetDesiredFailureMsg(
638 VK_DEBUG_REPORT_ERROR_BIT_EXT,
639 "extension was not enabled for this");
640 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
641 pass = (err != VK_SUCCESS);
642 ASSERT_TRUE(pass);
643 m_errorMonitor->VerifyFound();
644
645 // Tell whether an xcb_visualid_t supports presentation:
646 xcb_connection_t *connection = NULL;
647 xcb_visualid_t visual_id = 0;
648 m_errorMonitor->SetDesiredFailureMsg(
649 VK_DEBUG_REPORT_ERROR_BIT_EXT,
650 "extension was not enabled for this");
651 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, connection,
652 visual_id);
653 m_errorMonitor->VerifyFound();
654#endif // VK_USE_PLATFORM_XCB_KHR
655
656
Ian Elliott12630812016-04-29 14:35:43 -0600657#if defined(VK_USE_PLATFORM_XLIB_KHR)
658 // Use the functions from the VK_KHR_xlib_surface extension without enabling
659 // that extension:
660
661 // Create a surface:
662 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
663#if 0
664#endif
665 m_errorMonitor->SetDesiredFailureMsg(
666 VK_DEBUG_REPORT_ERROR_BIT_EXT,
667 "extension was not enabled for this");
668 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
669 pass = (err != VK_SUCCESS);
670 ASSERT_TRUE(pass);
671 m_errorMonitor->VerifyFound();
672
673 // Tell whether an Xlib VisualID supports presentation:
674 Display *dpy = NULL;
675 VisualID visual = 0;
676 m_errorMonitor->SetDesiredFailureMsg(
677 VK_DEBUG_REPORT_ERROR_BIT_EXT,
678 "extension was not enabled for this");
679 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
680 m_errorMonitor->VerifyFound();
681#endif // VK_USE_PLATFORM_XLIB_KHR
682
683
Ian Elliott1c32c772016-04-28 14:47:13 -0600684 // Use the functions from the VK_KHR_surface extension without enabling
685 // that extension:
686
687 // Destroy a surface:
688 m_errorMonitor->SetDesiredFailureMsg(
689 VK_DEBUG_REPORT_ERROR_BIT_EXT,
690 "extension was not enabled for this");
691 vkDestroySurfaceKHR(instance(), surface, NULL);
692 m_errorMonitor->VerifyFound();
693
694 // Check if surface supports presentation:
695 VkBool32 supported = false;
696 m_errorMonitor->SetDesiredFailureMsg(
697 VK_DEBUG_REPORT_ERROR_BIT_EXT,
698 "extension was not enabled for this");
699 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
700 pass = (err != VK_SUCCESS);
701 ASSERT_TRUE(pass);
702 m_errorMonitor->VerifyFound();
703
704 // Check surface capabilities:
705 VkSurfaceCapabilitiesKHR capabilities = {};
706 m_errorMonitor->SetDesiredFailureMsg(
707 VK_DEBUG_REPORT_ERROR_BIT_EXT,
708 "extension was not enabled for this");
709 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
710 &capabilities);
711 pass = (err != VK_SUCCESS);
712 ASSERT_TRUE(pass);
713 m_errorMonitor->VerifyFound();
714
715 // Check surface formats:
716 uint32_t format_count = 0;
717 VkSurfaceFormatKHR *formats = NULL;
718 m_errorMonitor->SetDesiredFailureMsg(
719 VK_DEBUG_REPORT_ERROR_BIT_EXT,
720 "extension was not enabled for this");
721 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
722 &format_count, formats);
723 pass = (err != VK_SUCCESS);
724 ASSERT_TRUE(pass);
725 m_errorMonitor->VerifyFound();
726
727 // Check surface present modes:
728 uint32_t present_mode_count = 0;
729 VkSurfaceFormatKHR *present_modes = NULL;
730 m_errorMonitor->SetDesiredFailureMsg(
731 VK_DEBUG_REPORT_ERROR_BIT_EXT,
732 "extension was not enabled for this");
733 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
734 &present_mode_count, present_modes);
735 pass = (err != VK_SUCCESS);
736 ASSERT_TRUE(pass);
737 m_errorMonitor->VerifyFound();
738
739
740 // Use the functions from the VK_KHR_swapchain extension without enabling
741 // that extension:
742
743 // Create a swapchain:
744 m_errorMonitor->SetDesiredFailureMsg(
745 VK_DEBUG_REPORT_ERROR_BIT_EXT,
746 "extension was not enabled for this");
747 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
748 swapchain_create_info.pNext = NULL;
749#if 0
750 swapchain_create_info.flags = 0;
751 swapchain_create_info.surface = 0;
752 swapchain_create_info.minImageCount = 0;
753 swapchain_create_info.imageFormat = 0;
754 swapchain_create_info.imageColorSpace = 0;
755 swapchain_create_info.imageExtent.width = 0;
756 swapchain_create_info.imageExtent.height = 0;
757 swapchain_create_info.imageArrayLayers = 0;
758 swapchain_create_info.imageUsage = 0;
759 swapchain_create_info.imageSharingMode = 0;
760 swapchain_create_info.queueFamilyIndexCount = 0;
761 swapchain_create_info.preTransform = 0;
762 swapchain_create_info.compositeAlpha = 0;
763 swapchain_create_info.presentMode = 0;
764 swapchain_create_info.clipped = 0;
765 swapchain_create_info.oldSwapchain = NULL;
766#endif
767 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
768 NULL, &swapchain);
769 pass = (err != VK_SUCCESS);
770 ASSERT_TRUE(pass);
771 m_errorMonitor->VerifyFound();
772
773 // Get the images from the swapchain:
774 m_errorMonitor->SetDesiredFailureMsg(
775 VK_DEBUG_REPORT_ERROR_BIT_EXT,
776 "extension was not enabled for this");
777 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
778 &swapchain_image_count, NULL);
779 pass = (err != VK_SUCCESS);
780 ASSERT_TRUE(pass);
781 m_errorMonitor->VerifyFound();
782
783 // Try to acquire an image:
784 m_errorMonitor->SetDesiredFailureMsg(
785 VK_DEBUG_REPORT_ERROR_BIT_EXT,
786 "extension was not enabled for this");
787 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
788 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
789 pass = (err != VK_SUCCESS);
790 ASSERT_TRUE(pass);
791 m_errorMonitor->VerifyFound();
792
793 // Try to present an image:
794#if 0 // NOTE: Currently can't test this because a real swapchain is needed
795 // (as opposed to the fake one we created) in order for the layer to
796 // lookup the VkDevice used to enable the extension:
797 m_errorMonitor->SetDesiredFailureMsg(
798 VK_DEBUG_REPORT_ERROR_BIT_EXT,
799 "extension was not enabled for this");
800 present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
801 present_info.pNext = NULL;
802#if 0
803#endif
804 err = vkQueuePresentKHR(m_device->m_queue, &present_info);
805 pass = (err != VK_SUCCESS);
806 ASSERT_TRUE(pass);
807 m_errorMonitor->VerifyFound();
808#endif
809
810 // Destroy the swapchain:
811 m_errorMonitor->SetDesiredFailureMsg(
812 VK_DEBUG_REPORT_ERROR_BIT_EXT,
813 "extension was not enabled for this");
814 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
815 m_errorMonitor->VerifyFound();
816}
817
Karl Schultz6addd812016-02-02 17:17:23 -0700818TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
819 VkResult err;
820 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500821
Karl Schultz6addd812016-02-02 17:17:23 -0700822 m_errorMonitor->SetDesiredFailureMsg(
823 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600824 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
825
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500826 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500827
828 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700829 VkImage image;
830 VkDeviceMemory mem;
831 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500832
Karl Schultz6addd812016-02-02 17:17:23 -0700833 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
834 const int32_t tex_width = 32;
835 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500836
Tony Barboureb254902015-07-15 12:50:33 -0600837 VkImageCreateInfo image_create_info = {};
838 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700839 image_create_info.pNext = NULL;
840 image_create_info.imageType = VK_IMAGE_TYPE_2D;
841 image_create_info.format = tex_format;
842 image_create_info.extent.width = tex_width;
843 image_create_info.extent.height = tex_height;
844 image_create_info.extent.depth = 1;
845 image_create_info.mipLevels = 1;
846 image_create_info.arrayLayers = 1;
847 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
848 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
849 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
850 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600851
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800852 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800853 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700854 mem_alloc.pNext = NULL;
855 mem_alloc.allocationSize = 0;
856 // Introduce failure, do NOT set memProps to
857 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
858 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500859
Chia-I Wuf7458c52015-10-26 21:10:41 +0800860 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500861 ASSERT_VK_SUCCESS(err);
862
Karl Schultz6addd812016-02-02 17:17:23 -0700863 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500864
Mark Lobodzinski23065352015-05-29 09:32:35 -0500865 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500866
Karl Schultz6addd812016-02-02 17:17:23 -0700867 pass =
868 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
869 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
870 if (!pass) { // If we can't find any unmappable memory this test doesn't
871 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +0800872 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -0600873 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -0600874 }
Mike Stroyan713b2d72015-08-04 10:49:29 -0600875
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500876 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800877 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500878 ASSERT_VK_SUCCESS(err);
879
880 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -0600881 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500882 ASSERT_VK_SUCCESS(err);
883
884 // Map memory as if to initialize the image
885 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -0700886 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
887 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500888
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200889 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600890
Chia-I Wuf7458c52015-10-26 21:10:41 +0800891 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500892}
893
Karl Schultz6addd812016-02-02 17:17:23 -0700894TEST_F(VkLayerTest, RebindMemory) {
895 VkResult err;
896 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500897
Karl Schultz6addd812016-02-02 17:17:23 -0700898 m_errorMonitor->SetDesiredFailureMsg(
899 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600900 "which has already been bound to mem object");
901
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500902 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500903
904 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700905 VkImage image;
906 VkDeviceMemory mem1;
907 VkDeviceMemory mem2;
908 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500909
Karl Schultz6addd812016-02-02 17:17:23 -0700910 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
911 const int32_t tex_width = 32;
912 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500913
Tony Barboureb254902015-07-15 12:50:33 -0600914 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700915 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
916 image_create_info.pNext = NULL;
917 image_create_info.imageType = VK_IMAGE_TYPE_2D;
918 image_create_info.format = tex_format;
919 image_create_info.extent.width = tex_width;
920 image_create_info.extent.height = tex_height;
921 image_create_info.extent.depth = 1;
922 image_create_info.mipLevels = 1;
923 image_create_info.arrayLayers = 1;
924 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
925 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
926 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
927 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500928
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800929 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700930 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
931 mem_alloc.pNext = NULL;
932 mem_alloc.allocationSize = 0;
933 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -0600934
Karl Schultz6addd812016-02-02 17:17:23 -0700935 // Introduce failure, do NOT set memProps to
936 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -0600937 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800938 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500939 ASSERT_VK_SUCCESS(err);
940
Karl Schultz6addd812016-02-02 17:17:23 -0700941 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500942
943 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -0700944 pass =
945 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -0600946 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500947
948 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800949 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500950 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800951 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500952 ASSERT_VK_SUCCESS(err);
953
954 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -0600955 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500956 ASSERT_VK_SUCCESS(err);
957
Karl Schultz6addd812016-02-02 17:17:23 -0700958 // Introduce validation failure, try to bind a different memory object to
959 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -0600960 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500961
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200962 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600963
Chia-I Wuf7458c52015-10-26 21:10:41 +0800964 vkDestroyImage(m_device->device(), image, NULL);
965 vkFreeMemory(m_device->device(), mem1, NULL);
966 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500967}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500968
Karl Schultz6addd812016-02-02 17:17:23 -0700969TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600970 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600971
Karl Schultz6addd812016-02-02 17:17:23 -0700972 m_errorMonitor->SetDesiredFailureMsg(
973 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
974 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600975
976 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600977 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
978 fenceInfo.pNext = NULL;
979 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -0600980
Tony Barbour300a6082015-04-07 13:44:53 -0600981 ASSERT_NO_FATAL_FAILURE(InitState());
982 ASSERT_NO_FATAL_FAILURE(InitViewport());
983 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
984
Tony Barbourfe3351b2015-07-28 10:17:20 -0600985 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700986 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
987 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600988 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600989
990 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600991
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600992 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800993 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
994 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800995 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600996 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700997 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800998 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800999 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001000 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001001 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001002
1003 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001004 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001005
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001006 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001007}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001008// This is a positive test. We used to expect error in this case but spec now
1009// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07001010TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001011 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001012 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001013 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001014 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1015 fenceInfo.pNext = NULL;
1016
Tony Barbour0b4d9562015-04-09 10:48:04 -06001017 ASSERT_NO_FATAL_FAILURE(InitState());
1018 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08001019 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001020 VkResult result = vkResetFences(m_device->device(), 1, fences);
1021 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06001022
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001023 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06001024}
Tobin Ehlis41376e12015-07-03 08:45:14 -06001025
Chia-I Wu08accc62015-07-07 11:50:03 +08001026/* TODO: Update for changes due to bug-14075 tiling across render passes */
1027#if 0
Tobin Ehlis41376e12015-07-03 08:45:14 -06001028TEST_F(VkLayerTest, InvalidUsageBits)
1029{
1030 // Initiate Draw w/o a PSO bound
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001031
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001033 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001034
1035 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001036 VkCommandBufferObj commandBuffer(m_device);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001037 BeginCommandBuffer();
Tobin Ehlis41376e12015-07-03 08:45:14 -06001038
1039 const VkExtent3D e3d = {
1040 .width = 128,
1041 .height = 128,
1042 .depth = 1,
1043 };
1044 const VkImageCreateInfo ici = {
1045 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
1046 .pNext = NULL,
1047 .imageType = VK_IMAGE_TYPE_2D,
1048 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
1049 .extent = e3d,
1050 .mipLevels = 1,
1051 .arraySize = 1,
Chia-I Wu5c17c962015-10-31 00:31:16 +08001052 .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlis41376e12015-07-03 08:45:14 -06001053 .tiling = VK_IMAGE_TILING_LINEAR,
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -06001054 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
Tobin Ehlis41376e12015-07-03 08:45:14 -06001055 .flags = 0,
1056 };
1057
1058 VkImage dsi;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001059 vkCreateImage(m_device->device(), &ici, NULL, &dsi);
Tobin Ehlis41376e12015-07-03 08:45:14 -06001060 VkDepthStencilView dsv;
1061 const VkDepthStencilViewCreateInfo dsvci = {
1062 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
1063 .pNext = NULL,
1064 .image = dsi,
1065 .mipLevel = 0,
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -06001066 .baseArrayLayer = 0,
Tobin Ehlis41376e12015-07-03 08:45:14 -06001067 .arraySize = 1,
1068 .flags = 0,
1069 };
Chia-I Wuf7458c52015-10-26 21:10:41 +08001070 vkCreateDepthStencilView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001071
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001072 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06001073}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001074#endif // 0
1075#endif // MEM_TRACKER_TESTS
1076
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06001077#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07001078TEST_F(VkLayerTest, PipelineNotBound) {
1079 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001080
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001082 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001083
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001084 ASSERT_NO_FATAL_FAILURE(InitState());
1085 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001086
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001087 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001088 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1089 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001090
1091 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001092 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1093 ds_pool_ci.pNext = NULL;
1094 ds_pool_ci.maxSets = 1;
1095 ds_pool_ci.poolSizeCount = 1;
1096 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001097
1098 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001099 err =
1100 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001101 ASSERT_VK_SUCCESS(err);
1102
1103 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001104 dsl_binding.binding = 0;
1105 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1106 dsl_binding.descriptorCount = 1;
1107 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1108 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001109
1110 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001111 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1112 ds_layout_ci.pNext = NULL;
1113 ds_layout_ci.bindingCount = 1;
1114 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001115
1116 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001117 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1118 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001119 ASSERT_VK_SUCCESS(err);
1120
1121 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001122 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001123 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001124 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001125 alloc_info.descriptorPool = ds_pool;
1126 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001127 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1128 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001129 ASSERT_VK_SUCCESS(err);
1130
1131 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001132 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1133 pipeline_layout_ci.pNext = NULL;
1134 pipeline_layout_ci.setLayoutCount = 1;
1135 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001136
1137 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001138 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1139 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001140 ASSERT_VK_SUCCESS(err);
1141
Mark Youngad779052016-01-06 14:26:04 -07001142 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001143
1144 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001145 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1146 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001147
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001148 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001149
Chia-I Wuf7458c52015-10-26 21:10:41 +08001150 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1151 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1152 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001153}
1154
Karl Schultz6addd812016-02-02 17:17:23 -07001155TEST_F(VkLayerTest, BindInvalidMemory) {
1156 VkResult err;
1157 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001158
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001159 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001160 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001161
Tobin Ehlisec598302015-09-15 15:02:17 -06001162 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001163
1164 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001165 VkImage image;
1166 VkDeviceMemory mem;
1167 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001168
Karl Schultz6addd812016-02-02 17:17:23 -07001169 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1170 const int32_t tex_width = 32;
1171 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001172
1173 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001174 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1175 image_create_info.pNext = NULL;
1176 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1177 image_create_info.format = tex_format;
1178 image_create_info.extent.width = tex_width;
1179 image_create_info.extent.height = tex_height;
1180 image_create_info.extent.depth = 1;
1181 image_create_info.mipLevels = 1;
1182 image_create_info.arrayLayers = 1;
1183 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1184 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1185 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1186 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001187
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001188 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001189 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1190 mem_alloc.pNext = NULL;
1191 mem_alloc.allocationSize = 0;
1192 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001193
Chia-I Wuf7458c52015-10-26 21:10:41 +08001194 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001195 ASSERT_VK_SUCCESS(err);
1196
Karl Schultz6addd812016-02-02 17:17:23 -07001197 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001198
1199 mem_alloc.allocationSize = mem_reqs.size;
1200
Karl Schultz6addd812016-02-02 17:17:23 -07001201 pass =
1202 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001203 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001204
1205 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001206 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001207 ASSERT_VK_SUCCESS(err);
1208
1209 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001210 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001211
1212 // Try to bind free memory that has been freed
1213 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1214 // This may very well return an error.
1215 (void)err;
1216
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001217 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001218
Chia-I Wuf7458c52015-10-26 21:10:41 +08001219 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001220}
1221
Karl Schultz6addd812016-02-02 17:17:23 -07001222TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1223 VkResult err;
1224 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001225
Karl Schultz6addd812016-02-02 17:17:23 -07001226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1227 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001228
Tobin Ehlisec598302015-09-15 15:02:17 -06001229 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001230
Karl Schultz6addd812016-02-02 17:17:23 -07001231 // Create an image object, allocate memory, destroy the object and then try
1232 // to bind it
1233 VkImage image;
1234 VkDeviceMemory mem;
1235 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001236
Karl Schultz6addd812016-02-02 17:17:23 -07001237 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1238 const int32_t tex_width = 32;
1239 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001240
1241 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001242 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1243 image_create_info.pNext = NULL;
1244 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1245 image_create_info.format = tex_format;
1246 image_create_info.extent.width = tex_width;
1247 image_create_info.extent.height = tex_height;
1248 image_create_info.extent.depth = 1;
1249 image_create_info.mipLevels = 1;
1250 image_create_info.arrayLayers = 1;
1251 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1252 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1253 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1254 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001255
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001256 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001257 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1258 mem_alloc.pNext = NULL;
1259 mem_alloc.allocationSize = 0;
1260 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001261
Chia-I Wuf7458c52015-10-26 21:10:41 +08001262 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001263 ASSERT_VK_SUCCESS(err);
1264
Karl Schultz6addd812016-02-02 17:17:23 -07001265 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001266
1267 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001268 pass =
1269 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001270 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001271
1272 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001273 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001274 ASSERT_VK_SUCCESS(err);
1275
1276 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001277 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001278 ASSERT_VK_SUCCESS(err);
1279
1280 // Now Try to bind memory to this destroyed object
1281 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1282 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001283 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001284
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001285 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001286
Chia-I Wuf7458c52015-10-26 21:10:41 +08001287 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001288}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001289
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001290#endif // OBJ_TRACKER_TESTS
1291
Tobin Ehlis0788f522015-05-26 16:11:58 -06001292#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001293
1294// This is a positive test. No errors should be generated.
1295TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
1296
1297 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1298 "submitted on separate queues followed by a QueueWaitIdle.");
1299
Dustin Graves48458142016-04-29 16:11:55 -06001300 if ((m_device->queue_props.empty()) ||
1301 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001302 return;
1303
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001304 m_errorMonitor->ExpectSuccess();
1305
1306 VkSemaphore semaphore;
1307 VkSemaphoreCreateInfo semaphore_create_info{};
1308 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1309 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1310 &semaphore);
1311
1312 VkCommandPool command_pool;
1313 VkCommandPoolCreateInfo pool_create_info{};
1314 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1315 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1316 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1317 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1318 &command_pool);
1319
1320 VkCommandBuffer command_buffer[2];
1321 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1322 command_buffer_allocate_info.sType =
1323 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1324 command_buffer_allocate_info.commandPool = command_pool;
1325 command_buffer_allocate_info.commandBufferCount = 2;
1326 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1327 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1328 command_buffer);
1329
1330 VkQueue queue = VK_NULL_HANDLE;
1331 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1332 1, &queue);
1333
1334 {
1335 VkCommandBufferBeginInfo begin_info{};
1336 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1337 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1338
1339 vkCmdPipelineBarrier(command_buffer[0],
1340 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1341 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1342 0, nullptr, 0, nullptr);
1343
1344 VkViewport viewport{};
1345 viewport.maxDepth = 1.0f;
1346 viewport.minDepth = 0.0f;
1347 viewport.width = 512;
1348 viewport.height = 512;
1349 viewport.x = 0;
1350 viewport.y = 0;
1351 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1352 vkEndCommandBuffer(command_buffer[0]);
1353 }
1354 {
1355 VkCommandBufferBeginInfo begin_info{};
1356 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1357 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1358
1359 VkViewport viewport{};
1360 viewport.maxDepth = 1.0f;
1361 viewport.minDepth = 0.0f;
1362 viewport.width = 512;
1363 viewport.height = 512;
1364 viewport.x = 0;
1365 viewport.y = 0;
1366 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1367 vkEndCommandBuffer(command_buffer[1]);
1368 }
1369 {
1370 VkSubmitInfo submit_info{};
1371 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1372 submit_info.commandBufferCount = 1;
1373 submit_info.pCommandBuffers = &command_buffer[0];
1374 submit_info.signalSemaphoreCount = 1;
1375 submit_info.pSignalSemaphores = &semaphore;
1376 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1377 }
1378 {
1379 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1380 VkSubmitInfo submit_info{};
1381 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1382 submit_info.commandBufferCount = 1;
1383 submit_info.pCommandBuffers = &command_buffer[1];
1384 submit_info.waitSemaphoreCount = 1;
1385 submit_info.pWaitSemaphores = &semaphore;
1386 submit_info.pWaitDstStageMask = flags;
1387 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1388 }
1389
1390 vkQueueWaitIdle(m_device->m_queue);
1391
1392 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1393 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1394 &command_buffer[0]);
1395 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1396
1397 m_errorMonitor->VerifyNotFound();
1398}
1399
1400// This is a positive test. No errors should be generated.
1401TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
1402
1403 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1404 "submitted on separate queues, the second having a fence"
1405 "followed by a QueueWaitIdle.");
1406
Dustin Graves48458142016-04-29 16:11:55 -06001407 if ((m_device->queue_props.empty()) ||
1408 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001409 return;
1410
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001411 m_errorMonitor->ExpectSuccess();
1412
1413 VkFence fence;
1414 VkFenceCreateInfo fence_create_info{};
1415 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1416 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1417
1418 VkSemaphore semaphore;
1419 VkSemaphoreCreateInfo semaphore_create_info{};
1420 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1421 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1422 &semaphore);
1423
1424 VkCommandPool command_pool;
1425 VkCommandPoolCreateInfo pool_create_info{};
1426 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1427 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1428 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1429 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1430 &command_pool);
1431
1432 VkCommandBuffer command_buffer[2];
1433 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1434 command_buffer_allocate_info.sType =
1435 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1436 command_buffer_allocate_info.commandPool = command_pool;
1437 command_buffer_allocate_info.commandBufferCount = 2;
1438 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1439 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1440 command_buffer);
1441
1442 VkQueue queue = VK_NULL_HANDLE;
1443 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1444 1, &queue);
1445
1446 {
1447 VkCommandBufferBeginInfo begin_info{};
1448 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1449 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1450
1451 vkCmdPipelineBarrier(command_buffer[0],
1452 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1453 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1454 0, nullptr, 0, nullptr);
1455
1456 VkViewport viewport{};
1457 viewport.maxDepth = 1.0f;
1458 viewport.minDepth = 0.0f;
1459 viewport.width = 512;
1460 viewport.height = 512;
1461 viewport.x = 0;
1462 viewport.y = 0;
1463 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1464 vkEndCommandBuffer(command_buffer[0]);
1465 }
1466 {
1467 VkCommandBufferBeginInfo begin_info{};
1468 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1469 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1470
1471 VkViewport viewport{};
1472 viewport.maxDepth = 1.0f;
1473 viewport.minDepth = 0.0f;
1474 viewport.width = 512;
1475 viewport.height = 512;
1476 viewport.x = 0;
1477 viewport.y = 0;
1478 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1479 vkEndCommandBuffer(command_buffer[1]);
1480 }
1481 {
1482 VkSubmitInfo submit_info{};
1483 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1484 submit_info.commandBufferCount = 1;
1485 submit_info.pCommandBuffers = &command_buffer[0];
1486 submit_info.signalSemaphoreCount = 1;
1487 submit_info.pSignalSemaphores = &semaphore;
1488 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1489 }
1490 {
1491 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1492 VkSubmitInfo submit_info{};
1493 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1494 submit_info.commandBufferCount = 1;
1495 submit_info.pCommandBuffers = &command_buffer[1];
1496 submit_info.waitSemaphoreCount = 1;
1497 submit_info.pWaitSemaphores = &semaphore;
1498 submit_info.pWaitDstStageMask = flags;
1499 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1500 }
1501
1502 vkQueueWaitIdle(m_device->m_queue);
1503
1504 vkDestroyFence(m_device->device(), fence, nullptr);
1505 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1506 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1507 &command_buffer[0]);
1508 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1509
1510 m_errorMonitor->VerifyNotFound();
1511}
1512
1513// This is a positive test. No errors should be generated.
1514TEST_F(VkLayerTest,
1515 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
1516
1517 TEST_DESCRIPTION(
1518 "Two command buffers, each in a separate QueueSubmit call "
1519 "submitted on separate queues, the second having a fence"
1520 "followed by two consecutive WaitForFences calls on the same fence.");
1521
Dustin Graves48458142016-04-29 16:11:55 -06001522 if ((m_device->queue_props.empty()) ||
1523 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001524 return;
1525
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001526 m_errorMonitor->ExpectSuccess();
1527
1528 VkFence fence;
1529 VkFenceCreateInfo fence_create_info{};
1530 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1531 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1532
1533 VkSemaphore semaphore;
1534 VkSemaphoreCreateInfo semaphore_create_info{};
1535 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1536 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1537 &semaphore);
1538
1539 VkCommandPool command_pool;
1540 VkCommandPoolCreateInfo pool_create_info{};
1541 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1542 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1543 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1544 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1545 &command_pool);
1546
1547 VkCommandBuffer command_buffer[2];
1548 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1549 command_buffer_allocate_info.sType =
1550 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1551 command_buffer_allocate_info.commandPool = command_pool;
1552 command_buffer_allocate_info.commandBufferCount = 2;
1553 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1554 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1555 command_buffer);
1556
1557 VkQueue queue = VK_NULL_HANDLE;
1558 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1559 1, &queue);
1560
1561 {
1562 VkCommandBufferBeginInfo begin_info{};
1563 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1564 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1565
1566 vkCmdPipelineBarrier(command_buffer[0],
1567 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1568 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1569 0, nullptr, 0, nullptr);
1570
1571 VkViewport viewport{};
1572 viewport.maxDepth = 1.0f;
1573 viewport.minDepth = 0.0f;
1574 viewport.width = 512;
1575 viewport.height = 512;
1576 viewport.x = 0;
1577 viewport.y = 0;
1578 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1579 vkEndCommandBuffer(command_buffer[0]);
1580 }
1581 {
1582 VkCommandBufferBeginInfo begin_info{};
1583 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1584 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1585
1586 VkViewport viewport{};
1587 viewport.maxDepth = 1.0f;
1588 viewport.minDepth = 0.0f;
1589 viewport.width = 512;
1590 viewport.height = 512;
1591 viewport.x = 0;
1592 viewport.y = 0;
1593 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1594 vkEndCommandBuffer(command_buffer[1]);
1595 }
1596 {
1597 VkSubmitInfo submit_info{};
1598 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1599 submit_info.commandBufferCount = 1;
1600 submit_info.pCommandBuffers = &command_buffer[0];
1601 submit_info.signalSemaphoreCount = 1;
1602 submit_info.pSignalSemaphores = &semaphore;
1603 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1604 }
1605 {
1606 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1607 VkSubmitInfo submit_info{};
1608 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1609 submit_info.commandBufferCount = 1;
1610 submit_info.pCommandBuffers = &command_buffer[1];
1611 submit_info.waitSemaphoreCount = 1;
1612 submit_info.pWaitSemaphores = &semaphore;
1613 submit_info.pWaitDstStageMask = flags;
1614 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1615 }
1616
1617 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1618 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1619
1620 vkDestroyFence(m_device->device(), fence, nullptr);
1621 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1622 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1623 &command_buffer[0]);
1624 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1625
1626 m_errorMonitor->VerifyNotFound();
1627}
1628
1629// This is a positive test. No errors should be generated.
1630TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
1631
1632 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1633 "submitted on separate queues, the second having a fence, "
1634 "followed by a WaitForFences call.");
1635
Dustin Graves48458142016-04-29 16:11:55 -06001636 if ((m_device->queue_props.empty()) ||
1637 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001638 return;
1639
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001640 m_errorMonitor->ExpectSuccess();
1641
1642 VkFence fence;
1643 VkFenceCreateInfo fence_create_info{};
1644 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1645 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1646
1647 VkSemaphore semaphore;
1648 VkSemaphoreCreateInfo semaphore_create_info{};
1649 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1650 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1651 &semaphore);
1652
1653 VkCommandPool command_pool;
1654 VkCommandPoolCreateInfo pool_create_info{};
1655 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1656 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1657 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1658 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1659 &command_pool);
1660
1661 VkCommandBuffer command_buffer[2];
1662 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1663 command_buffer_allocate_info.sType =
1664 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1665 command_buffer_allocate_info.commandPool = command_pool;
1666 command_buffer_allocate_info.commandBufferCount = 2;
1667 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1668 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1669 command_buffer);
1670
1671 VkQueue queue = VK_NULL_HANDLE;
1672 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1673 1, &queue);
1674
1675
1676 {
1677 VkCommandBufferBeginInfo begin_info{};
1678 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1679 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1680
1681 vkCmdPipelineBarrier(command_buffer[0],
1682 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1683 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1684 0, nullptr, 0, nullptr);
1685
1686 VkViewport viewport{};
1687 viewport.maxDepth = 1.0f;
1688 viewport.minDepth = 0.0f;
1689 viewport.width = 512;
1690 viewport.height = 512;
1691 viewport.x = 0;
1692 viewport.y = 0;
1693 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1694 vkEndCommandBuffer(command_buffer[0]);
1695 }
1696 {
1697 VkCommandBufferBeginInfo begin_info{};
1698 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1699 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1700
1701 VkViewport viewport{};
1702 viewport.maxDepth = 1.0f;
1703 viewport.minDepth = 0.0f;
1704 viewport.width = 512;
1705 viewport.height = 512;
1706 viewport.x = 0;
1707 viewport.y = 0;
1708 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1709 vkEndCommandBuffer(command_buffer[1]);
1710 }
1711 {
1712 VkSubmitInfo submit_info{};
1713 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1714 submit_info.commandBufferCount = 1;
1715 submit_info.pCommandBuffers = &command_buffer[0];
1716 submit_info.signalSemaphoreCount = 1;
1717 submit_info.pSignalSemaphores = &semaphore;
1718 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1719 }
1720 {
1721 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1722 VkSubmitInfo submit_info{};
1723 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1724 submit_info.commandBufferCount = 1;
1725 submit_info.pCommandBuffers = &command_buffer[1];
1726 submit_info.waitSemaphoreCount = 1;
1727 submit_info.pWaitSemaphores = &semaphore;
1728 submit_info.pWaitDstStageMask = flags;
1729 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1730 }
1731
1732 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1733
1734 vkDestroyFence(m_device->device(), fence, nullptr);
1735 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1736 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1737 &command_buffer[0]);
1738 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1739
1740 m_errorMonitor->VerifyNotFound();
1741}
1742
1743// This is a positive test. No errors should be generated.
1744TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
1745
1746 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1747 "on the same queue, sharing a signal/wait semaphore, the "
1748 "second having a fence, "
1749 "followed by a WaitForFences call.");
1750
1751 m_errorMonitor->ExpectSuccess();
1752
1753 VkFence fence;
1754 VkFenceCreateInfo fence_create_info{};
1755 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1756 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1757
1758 VkSemaphore semaphore;
1759 VkSemaphoreCreateInfo semaphore_create_info{};
1760 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1761 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1762 &semaphore);
1763
1764 VkCommandPool command_pool;
1765 VkCommandPoolCreateInfo pool_create_info{};
1766 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1767 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1768 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1769 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1770 &command_pool);
1771
1772 VkCommandBuffer command_buffer[2];
1773 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1774 command_buffer_allocate_info.sType =
1775 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1776 command_buffer_allocate_info.commandPool = command_pool;
1777 command_buffer_allocate_info.commandBufferCount = 2;
1778 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1779 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1780 command_buffer);
1781
1782 {
1783 VkCommandBufferBeginInfo begin_info{};
1784 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1785 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1786
1787 vkCmdPipelineBarrier(command_buffer[0],
1788 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1789 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1790 0, nullptr, 0, nullptr);
1791
1792 VkViewport viewport{};
1793 viewport.maxDepth = 1.0f;
1794 viewport.minDepth = 0.0f;
1795 viewport.width = 512;
1796 viewport.height = 512;
1797 viewport.x = 0;
1798 viewport.y = 0;
1799 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1800 vkEndCommandBuffer(command_buffer[0]);
1801 }
1802 {
1803 VkCommandBufferBeginInfo begin_info{};
1804 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1805 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1806
1807 VkViewport viewport{};
1808 viewport.maxDepth = 1.0f;
1809 viewport.minDepth = 0.0f;
1810 viewport.width = 512;
1811 viewport.height = 512;
1812 viewport.x = 0;
1813 viewport.y = 0;
1814 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1815 vkEndCommandBuffer(command_buffer[1]);
1816 }
1817 {
1818 VkSubmitInfo submit_info{};
1819 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1820 submit_info.commandBufferCount = 1;
1821 submit_info.pCommandBuffers = &command_buffer[0];
1822 submit_info.signalSemaphoreCount = 1;
1823 submit_info.pSignalSemaphores = &semaphore;
1824 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1825 }
1826 {
1827 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1828 VkSubmitInfo submit_info{};
1829 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1830 submit_info.commandBufferCount = 1;
1831 submit_info.pCommandBuffers = &command_buffer[1];
1832 submit_info.waitSemaphoreCount = 1;
1833 submit_info.pWaitSemaphores = &semaphore;
1834 submit_info.pWaitDstStageMask = flags;
1835 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1836 }
1837
1838 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1839
1840 vkDestroyFence(m_device->device(), fence, nullptr);
1841 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1842 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1843 &command_buffer[0]);
1844 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1845
1846 m_errorMonitor->VerifyNotFound();
1847}
1848
1849// This is a positive test. No errors should be generated.
1850TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
1851
1852 TEST_DESCRIPTION(
1853 "Two command buffers, each in a separate QueueSubmit call "
1854 "on the same queue, no fences, followed by a third QueueSubmit with NO "
1855 "SubmitInfos but with a fence, followed by a WaitForFences call.");
1856
1857 m_errorMonitor->ExpectSuccess();
1858
1859 VkFence fence;
1860 VkFenceCreateInfo fence_create_info{};
1861 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1862 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1863
1864 VkCommandPool command_pool;
1865 VkCommandPoolCreateInfo pool_create_info{};
1866 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1867 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1868 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1869 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1870 &command_pool);
1871
1872 VkCommandBuffer command_buffer[2];
1873 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1874 command_buffer_allocate_info.sType =
1875 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1876 command_buffer_allocate_info.commandPool = command_pool;
1877 command_buffer_allocate_info.commandBufferCount = 2;
1878 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1879 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1880 command_buffer);
1881
1882 {
1883 VkCommandBufferBeginInfo begin_info{};
1884 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1885 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1886
1887 vkCmdPipelineBarrier(command_buffer[0],
1888 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1889 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1890 0, nullptr, 0, nullptr);
1891
1892 VkViewport viewport{};
1893 viewport.maxDepth = 1.0f;
1894 viewport.minDepth = 0.0f;
1895 viewport.width = 512;
1896 viewport.height = 512;
1897 viewport.x = 0;
1898 viewport.y = 0;
1899 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1900 vkEndCommandBuffer(command_buffer[0]);
1901 }
1902 {
1903 VkCommandBufferBeginInfo begin_info{};
1904 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1905 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1906
1907 VkViewport viewport{};
1908 viewport.maxDepth = 1.0f;
1909 viewport.minDepth = 0.0f;
1910 viewport.width = 512;
1911 viewport.height = 512;
1912 viewport.x = 0;
1913 viewport.y = 0;
1914 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1915 vkEndCommandBuffer(command_buffer[1]);
1916 }
1917 {
1918 VkSubmitInfo submit_info{};
1919 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1920 submit_info.commandBufferCount = 1;
1921 submit_info.pCommandBuffers = &command_buffer[0];
1922 submit_info.signalSemaphoreCount = 0;
1923 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
1924 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1925 }
1926 {
1927 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1928 VkSubmitInfo submit_info{};
1929 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1930 submit_info.commandBufferCount = 1;
1931 submit_info.pCommandBuffers = &command_buffer[1];
1932 submit_info.waitSemaphoreCount = 0;
1933 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
1934 submit_info.pWaitDstStageMask = flags;
1935 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1936 }
1937
1938 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
1939
1940 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1941
1942 vkDestroyFence(m_device->device(), fence, nullptr);
1943 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1944 &command_buffer[0]);
1945 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1946
1947 m_errorMonitor->VerifyNotFound();
1948}
1949
1950// This is a positive test. No errors should be generated.
1951TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
1952
1953 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1954 "on the same queue, the second having a fence, followed "
1955 "by a WaitForFences call.");
1956
1957 m_errorMonitor->ExpectSuccess();
1958
1959 VkFence fence;
1960 VkFenceCreateInfo fence_create_info{};
1961 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1962 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1963
1964 VkCommandPool command_pool;
1965 VkCommandPoolCreateInfo pool_create_info{};
1966 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1967 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1968 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1969 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1970 &command_pool);
1971
1972 VkCommandBuffer command_buffer[2];
1973 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1974 command_buffer_allocate_info.sType =
1975 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1976 command_buffer_allocate_info.commandPool = command_pool;
1977 command_buffer_allocate_info.commandBufferCount = 2;
1978 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1979 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1980 command_buffer);
1981
1982 {
1983 VkCommandBufferBeginInfo begin_info{};
1984 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1985 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1986
1987 vkCmdPipelineBarrier(command_buffer[0],
1988 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1989 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1990 0, nullptr, 0, nullptr);
1991
1992 VkViewport viewport{};
1993 viewport.maxDepth = 1.0f;
1994 viewport.minDepth = 0.0f;
1995 viewport.width = 512;
1996 viewport.height = 512;
1997 viewport.x = 0;
1998 viewport.y = 0;
1999 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2000 vkEndCommandBuffer(command_buffer[0]);
2001 }
2002 {
2003 VkCommandBufferBeginInfo begin_info{};
2004 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2005 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2006
2007 VkViewport viewport{};
2008 viewport.maxDepth = 1.0f;
2009 viewport.minDepth = 0.0f;
2010 viewport.width = 512;
2011 viewport.height = 512;
2012 viewport.x = 0;
2013 viewport.y = 0;
2014 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2015 vkEndCommandBuffer(command_buffer[1]);
2016 }
2017 {
2018 VkSubmitInfo submit_info{};
2019 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2020 submit_info.commandBufferCount = 1;
2021 submit_info.pCommandBuffers = &command_buffer[0];
2022 submit_info.signalSemaphoreCount = 0;
2023 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2024 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2025 }
2026 {
2027 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2028 VkSubmitInfo submit_info{};
2029 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2030 submit_info.commandBufferCount = 1;
2031 submit_info.pCommandBuffers = &command_buffer[1];
2032 submit_info.waitSemaphoreCount = 0;
2033 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2034 submit_info.pWaitDstStageMask = flags;
2035 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2036 }
2037
2038 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2039
2040 vkDestroyFence(m_device->device(), fence, nullptr);
2041 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2042 &command_buffer[0]);
2043 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2044
2045 m_errorMonitor->VerifyNotFound();
2046}
2047
2048// This is a positive test. No errors should be generated.
2049TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
2050
2051 TEST_DESCRIPTION(
2052 "Two command buffers each in a separate SubmitInfo sent in a single "
2053 "QueueSubmit call followed by a WaitForFences call.");
2054
2055 m_errorMonitor->ExpectSuccess();
2056
2057 VkFence fence;
2058 VkFenceCreateInfo fence_create_info{};
2059 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2060 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2061
2062 VkSemaphore semaphore;
2063 VkSemaphoreCreateInfo semaphore_create_info{};
2064 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2065 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2066 &semaphore);
2067
2068 VkCommandPool command_pool;
2069 VkCommandPoolCreateInfo pool_create_info{};
2070 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2071 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2072 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2073 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2074 &command_pool);
2075
2076 VkCommandBuffer command_buffer[2];
2077 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2078 command_buffer_allocate_info.sType =
2079 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2080 command_buffer_allocate_info.commandPool = command_pool;
2081 command_buffer_allocate_info.commandBufferCount = 2;
2082 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2083 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2084 command_buffer);
2085
2086 {
2087 VkCommandBufferBeginInfo begin_info{};
2088 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2089 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2090
2091 vkCmdPipelineBarrier(command_buffer[0],
2092 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2093 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2094 0, nullptr, 0, nullptr);
2095
2096 VkViewport viewport{};
2097 viewport.maxDepth = 1.0f;
2098 viewport.minDepth = 0.0f;
2099 viewport.width = 512;
2100 viewport.height = 512;
2101 viewport.x = 0;
2102 viewport.y = 0;
2103 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2104 vkEndCommandBuffer(command_buffer[0]);
2105 }
2106 {
2107 VkCommandBufferBeginInfo begin_info{};
2108 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2109 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2110
2111 VkViewport viewport{};
2112 viewport.maxDepth = 1.0f;
2113 viewport.minDepth = 0.0f;
2114 viewport.width = 512;
2115 viewport.height = 512;
2116 viewport.x = 0;
2117 viewport.y = 0;
2118 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2119 vkEndCommandBuffer(command_buffer[1]);
2120 }
2121 {
2122 VkSubmitInfo submit_info[2];
2123 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2124
2125 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2126 submit_info[0].pNext = NULL;
2127 submit_info[0].commandBufferCount = 1;
2128 submit_info[0].pCommandBuffers = &command_buffer[0];
2129 submit_info[0].signalSemaphoreCount = 1;
2130 submit_info[0].pSignalSemaphores = &semaphore;
2131 submit_info[0].waitSemaphoreCount = 0;
2132 submit_info[0].pWaitSemaphores = NULL;
2133 submit_info[0].pWaitDstStageMask = 0;
2134
2135 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2136 submit_info[1].pNext = NULL;
2137 submit_info[1].commandBufferCount = 1;
2138 submit_info[1].pCommandBuffers = &command_buffer[1];
2139 submit_info[1].waitSemaphoreCount = 1;
2140 submit_info[1].pWaitSemaphores = &semaphore;
2141 submit_info[1].pWaitDstStageMask = flags;
2142 submit_info[1].signalSemaphoreCount = 0;
2143 submit_info[1].pSignalSemaphores = NULL;
2144 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
2145 }
2146
2147 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2148
2149 vkDestroyFence(m_device->device(), fence, nullptr);
2150 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2151 &command_buffer[0]);
2152 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2153
2154 m_errorMonitor->VerifyNotFound();
2155}
2156
Karl Schultz6addd812016-02-02 17:17:23 -07002157TEST_F(VkLayerTest, LineWidthStateNotBound) {
2158 m_errorMonitor->SetDesiredFailureMsg(
2159 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002160 "Dynamic line width state not set for this command buffer");
2161
Karl Schultz6addd812016-02-02 17:17:23 -07002162 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line "
2163 "width state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002164
Karl Schultz6addd812016-02-02 17:17:23 -07002165 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2166 BsoFailLineWidth);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002167
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002168 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002169}
2170
Karl Schultz6addd812016-02-02 17:17:23 -07002171TEST_F(VkLayerTest, DepthBiasStateNotBound) {
2172 m_errorMonitor->SetDesiredFailureMsg(
2173 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002174 "Dynamic depth bias state not set for this command buffer");
2175
Karl Schultz6addd812016-02-02 17:17:23 -07002176 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
2177 "bias state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002178
Karl Schultz6addd812016-02-02 17:17:23 -07002179 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2180 BsoFailDepthBias);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002181
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002182 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002183}
2184
Karl Schultz6addd812016-02-02 17:17:23 -07002185// Disable these two tests until we can sort out how to track multiple layer
2186// errors
2187TEST_F(VkLayerTest, ViewportStateNotBound) {
2188 m_errorMonitor->SetDesiredFailureMsg(
2189 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002190 "Dynamic viewport state not set for this command buffer");
2191
Karl Schultz6addd812016-02-02 17:17:23 -07002192 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
2193 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002194
Karl Schultz6addd812016-02-02 17:17:23 -07002195 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2196 BsoFailViewport);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002197
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002198 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002199}
2200
Karl Schultz6addd812016-02-02 17:17:23 -07002201TEST_F(VkLayerTest, ScissorStateNotBound) {
2202 m_errorMonitor->SetDesiredFailureMsg(
2203 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002204 "Dynamic scissor state not set for this command buffer");
2205
Karl Schultz6addd812016-02-02 17:17:23 -07002206 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
2207 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002208
Karl Schultz6addd812016-02-02 17:17:23 -07002209 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2210 BsoFailScissor);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002211
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002212 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002213}
2214
Karl Schultz6addd812016-02-02 17:17:23 -07002215TEST_F(VkLayerTest, BlendStateNotBound) {
2216 m_errorMonitor->SetDesiredFailureMsg(
2217 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7a1d2352016-03-28 11:18:19 -06002218 "Dynamic blend constants state not set for this command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002219
Karl Schultz6addd812016-02-02 17:17:23 -07002220 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend "
2221 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002222
Karl Schultz6addd812016-02-02 17:17:23 -07002223 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2224 BsoFailBlend);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002225
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002226 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002227}
2228
Karl Schultz6addd812016-02-02 17:17:23 -07002229TEST_F(VkLayerTest, DepthBoundsStateNotBound) {
2230 m_errorMonitor->SetDesiredFailureMsg(
2231 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002232 "Dynamic depth bounds state not set for this command buffer");
2233
Karl Schultz6addd812016-02-02 17:17:23 -07002234 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
2235 "bounds state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002236
Karl Schultz6addd812016-02-02 17:17:23 -07002237 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2238 BsoFailDepthBounds);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002239
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002240 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002241}
2242
Karl Schultz6addd812016-02-02 17:17:23 -07002243TEST_F(VkLayerTest, StencilReadMaskNotSet) {
2244 m_errorMonitor->SetDesiredFailureMsg(
2245 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002246 "Dynamic stencil read mask state not set for this command buffer");
2247
Tobin Ehlis963a4042015-09-29 08:18:34 -06002248 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002249
Karl Schultz6addd812016-02-02 17:17:23 -07002250 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2251 "read mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002252
Karl Schultz6addd812016-02-02 17:17:23 -07002253 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2254 BsoFailStencilReadMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002255
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002256 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002257}
2258
Karl Schultz6addd812016-02-02 17:17:23 -07002259TEST_F(VkLayerTest, StencilWriteMaskNotSet) {
2260 m_errorMonitor->SetDesiredFailureMsg(
2261 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002262 "Dynamic stencil write mask state not set for this command buffer");
2263
Tobin Ehlis963a4042015-09-29 08:18:34 -06002264 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002265
Karl Schultz6addd812016-02-02 17:17:23 -07002266 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2267 "write mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002268
Karl Schultz6addd812016-02-02 17:17:23 -07002269 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2270 BsoFailStencilWriteMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002271
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002272 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002273}
2274
Karl Schultz6addd812016-02-02 17:17:23 -07002275TEST_F(VkLayerTest, StencilReferenceNotSet) {
2276 m_errorMonitor->SetDesiredFailureMsg(
2277 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002278 "Dynamic stencil reference state not set for this command buffer");
2279
Karl Schultz6addd812016-02-02 17:17:23 -07002280 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2281 "reference is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002282
Karl Schultz6addd812016-02-02 17:17:23 -07002283 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2284 BsoFailStencilReference);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002285
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002286 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002287}
2288
Karl Schultz6addd812016-02-02 17:17:23 -07002289TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002290 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002291
Karl Schultz6addd812016-02-02 17:17:23 -07002292 m_errorMonitor->SetDesiredFailureMsg(
2293 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2294 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2295 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002296
2297 VkFenceCreateInfo fenceInfo = {};
2298 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2299 fenceInfo.pNext = NULL;
2300 fenceInfo.flags = 0;
2301
2302 ASSERT_NO_FATAL_FAILURE(InitState());
2303 ASSERT_NO_FATAL_FAILURE(InitViewport());
2304 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2305
Karl Schultz6addd812016-02-02 17:17:23 -07002306 // We luck out b/c by default the framework creates CB w/ the
2307 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002308 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002309 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2310 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002311 EndCommandBuffer();
2312
2313 testFence.init(*m_device, fenceInfo);
2314
2315 // Bypass framework since it does the waits automatically
2316 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002317 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002318 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2319 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002320 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002321 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002322 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002323 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002324 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002325 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002326 submit_info.pSignalSemaphores = NULL;
2327
Karl Schultz6addd812016-02-02 17:17:23 -07002328 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2329 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002330
Karl Schultz6addd812016-02-02 17:17:23 -07002331 // Cause validation error by re-submitting cmd buffer that should only be
2332 // submitted once
2333 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002334
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002335 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002336}
2337
Karl Schultz6addd812016-02-02 17:17:23 -07002338TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002339 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002340 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002341
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002342 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002343 "Unable to allocate 1 descriptors of "
2344 "type "
2345 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002346
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002347 ASSERT_NO_FATAL_FAILURE(InitState());
2348 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002349
Karl Schultz6addd812016-02-02 17:17:23 -07002350 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
2351 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002352 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002353 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2354 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002355
2356 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002357 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2358 ds_pool_ci.pNext = NULL;
2359 ds_pool_ci.flags = 0;
2360 ds_pool_ci.maxSets = 1;
2361 ds_pool_ci.poolSizeCount = 1;
2362 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002363
2364 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002365 err =
2366 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002367 ASSERT_VK_SUCCESS(err);
2368
2369 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002370 dsl_binding.binding = 0;
2371 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2372 dsl_binding.descriptorCount = 1;
2373 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2374 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002375
2376 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002377 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2378 ds_layout_ci.pNext = NULL;
2379 ds_layout_ci.bindingCount = 1;
2380 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002381
2382 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002383 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2384 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002385 ASSERT_VK_SUCCESS(err);
2386
2387 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002388 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002389 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002390 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002391 alloc_info.descriptorPool = ds_pool;
2392 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002393 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2394 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002395
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002396 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002397
Chia-I Wuf7458c52015-10-26 21:10:41 +08002398 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2399 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002400}
2401
Karl Schultz6addd812016-02-02 17:17:23 -07002402TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
2403 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06002404
Karl Schultz6addd812016-02-02 17:17:23 -07002405 m_errorMonitor->SetDesiredFailureMsg(
2406 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2407 "It is invalid to call vkFreeDescriptorSets() with a pool created "
2408 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002409
Tobin Ehlise735c692015-10-08 13:13:50 -06002410 ASSERT_NO_FATAL_FAILURE(InitState());
2411 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06002412
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002413 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002414 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2415 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06002416
2417 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002418 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2419 ds_pool_ci.pNext = NULL;
2420 ds_pool_ci.maxSets = 1;
2421 ds_pool_ci.poolSizeCount = 1;
2422 ds_pool_ci.flags = 0;
2423 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
2424 // app can only call vkResetDescriptorPool on this pool.;
2425 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06002426
2427 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002428 err =
2429 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06002430 ASSERT_VK_SUCCESS(err);
2431
2432 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002433 dsl_binding.binding = 0;
2434 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2435 dsl_binding.descriptorCount = 1;
2436 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2437 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06002438
2439 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002440 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2441 ds_layout_ci.pNext = NULL;
2442 ds_layout_ci.bindingCount = 1;
2443 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06002444
2445 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002446 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2447 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06002448 ASSERT_VK_SUCCESS(err);
2449
2450 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002451 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002452 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002453 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002454 alloc_info.descriptorPool = ds_pool;
2455 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002456 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2457 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06002458 ASSERT_VK_SUCCESS(err);
2459
2460 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002461 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06002462
Chia-I Wuf7458c52015-10-26 21:10:41 +08002463 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2464 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06002465}
2466
Karl Schultz6addd812016-02-02 17:17:23 -07002467TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002468 // Attempt to clear Descriptor Pool with bad object.
2469 // ObjectTracker should catch this.
2470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2471 "Invalid VkDescriptorPool Object 0xbaad6001");
2472 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
2473 vkResetDescriptorPool(device(), badPool, 0);
2474 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002475}
2476
Karl Schultz6addd812016-02-02 17:17:23 -07002477TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002478 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
2479 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002480 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06002481 // call vkCmdBindDescriptorSets w/ false Descriptor Set
2482 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
2483 VkResult err;
2484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2485 "Invalid VkDescriptorSet Object 0xbaad6001");
2486
2487 ASSERT_NO_FATAL_FAILURE(InitState());
2488
2489 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
2490 layout_bindings[0].binding = 0;
2491 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2492 layout_bindings[0].descriptorCount = 1;
2493 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2494 layout_bindings[0].pImmutableSamplers = NULL;
2495
2496 VkDescriptorSetLayout descriptor_set_layout;
2497 VkDescriptorSetLayoutCreateInfo dslci = {};
2498 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2499 dslci.pNext = NULL;
2500 dslci.bindingCount = 1;
2501 dslci.pBindings = layout_bindings;
2502 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002503 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002504
2505 VkPipelineLayout pipeline_layout;
2506 VkPipelineLayoutCreateInfo plci = {};
2507 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2508 plci.pNext = NULL;
2509 plci.setLayoutCount = 1;
2510 plci.pSetLayouts = &descriptor_set_layout;
2511 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002512 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002513
2514 BeginCommandBuffer();
2515 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2516 pipeline_layout, 0, 1, &badSet, 0, NULL);
2517 m_errorMonitor->VerifyFound();
2518 EndCommandBuffer();
2519 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
2520 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002521}
2522
Karl Schultz6addd812016-02-02 17:17:23 -07002523TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002524 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
2525 // ObjectTracker should catch this.
2526 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
2527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2528 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
2529
2530 VkPipelineLayout pipeline_layout;
2531 VkPipelineLayoutCreateInfo plci = {};
2532 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2533 plci.pNext = NULL;
2534 plci.setLayoutCount = 1;
2535 plci.pSetLayouts = &bad_layout;
2536 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
2537
2538 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002539}
2540
Karl Schultz6addd812016-02-02 17:17:23 -07002541TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002542 // Attempt to bind an invalid Pipeline to a valid Command Buffer
2543 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002544 // Create a valid cmd buffer
2545 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06002546 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
2547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2548 "Invalid VkPipeline Object 0xbaad6001");
2549 ASSERT_NO_FATAL_FAILURE(InitState());
2550 BeginCommandBuffer();
2551 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2552 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
2553 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002554}
2555
Karl Schultz6addd812016-02-02 17:17:23 -07002556TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
2557 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
2558 // CommandBuffer
2559 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002560
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002561 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002562 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002563
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002564 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06002565 ASSERT_NO_FATAL_FAILURE(InitViewport());
2566 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002567 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002568 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2569 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002570
2571 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002572 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2573 ds_pool_ci.pNext = NULL;
2574 ds_pool_ci.maxSets = 1;
2575 ds_pool_ci.poolSizeCount = 1;
2576 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06002577
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002578 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002579 err =
2580 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002581 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002582
Tony Barboureb254902015-07-15 12:50:33 -06002583 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002584 dsl_binding.binding = 0;
2585 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2586 dsl_binding.descriptorCount = 1;
2587 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2588 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002589
Tony Barboureb254902015-07-15 12:50:33 -06002590 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002591 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2592 ds_layout_ci.pNext = NULL;
2593 ds_layout_ci.bindingCount = 1;
2594 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002595 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002596 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2597 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002598 ASSERT_VK_SUCCESS(err);
2599
2600 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002601 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002602 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002603 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002604 alloc_info.descriptorPool = ds_pool;
2605 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002606 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2607 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002608 ASSERT_VK_SUCCESS(err);
2609
Tony Barboureb254902015-07-15 12:50:33 -06002610 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002611 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2612 pipeline_layout_ci.pNext = NULL;
2613 pipeline_layout_ci.setLayoutCount = 1;
2614 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002615
2616 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002617 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2618 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002619 ASSERT_VK_SUCCESS(err);
2620
Karl Schultz6addd812016-02-02 17:17:23 -07002621 VkShaderObj vs(m_device, bindStateVertShaderText,
2622 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06002623 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07002624 // on more devices
2625 VkShaderObj fs(m_device, bindStateFragShaderText,
2626 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002627
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002628 VkPipelineObj pipe(m_device);
2629 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06002630 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06002631 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002632 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06002633
2634 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002635 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2636 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2637 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2638 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2639 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002640
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002641 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002642
Chia-I Wuf7458c52015-10-26 21:10:41 +08002643 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2644 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2645 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002646}
2647
Karl Schultz6addd812016-02-02 17:17:23 -07002648TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002649 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07002650 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002651
Karl Schultz6addd812016-02-02 17:17:23 -07002652 m_errorMonitor->SetDesiredFailureMsg(
2653 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002654 "Attempt to update descriptor with invalid bufferView ");
2655
2656 ASSERT_NO_FATAL_FAILURE(InitState());
2657 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002658 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2659 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002660
2661 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002662 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2663 ds_pool_ci.pNext = NULL;
2664 ds_pool_ci.maxSets = 1;
2665 ds_pool_ci.poolSizeCount = 1;
2666 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002667
2668 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002669 err =
2670 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002671 ASSERT_VK_SUCCESS(err);
2672
2673 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002674 dsl_binding.binding = 0;
2675 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2676 dsl_binding.descriptorCount = 1;
2677 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2678 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002679
2680 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002681 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2682 ds_layout_ci.pNext = NULL;
2683 ds_layout_ci.bindingCount = 1;
2684 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002685 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002686 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2687 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002688 ASSERT_VK_SUCCESS(err);
2689
2690 VkDescriptorSet descriptorSet;
2691 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002692 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002693 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002694 alloc_info.descriptorPool = ds_pool;
2695 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002696 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2697 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002698 ASSERT_VK_SUCCESS(err);
2699
Karl Schultz6addd812016-02-02 17:17:23 -07002700 VkBufferView view =
2701 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002702 VkWriteDescriptorSet descriptor_write;
2703 memset(&descriptor_write, 0, sizeof(descriptor_write));
2704 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2705 descriptor_write.dstSet = descriptorSet;
2706 descriptor_write.dstBinding = 0;
2707 descriptor_write.descriptorCount = 1;
2708 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2709 descriptor_write.pTexelBufferView = &view;
2710
2711 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2712
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002713 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002714
2715 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2716 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2717}
2718
Karl Schultz6addd812016-02-02 17:17:23 -07002719TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
2720 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
2721 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07002722 // 1. No dynamicOffset supplied
2723 // 2. Too many dynamicOffsets supplied
2724 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07002725 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002726 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002727 " requires 1 dynamicOffsets, but only "
2728 "0 dynamicOffsets are left in "
2729 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002730
2731 ASSERT_NO_FATAL_FAILURE(InitState());
2732 ASSERT_NO_FATAL_FAILURE(InitViewport());
2733 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2734
2735 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002736 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2737 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002738
2739 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002740 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2741 ds_pool_ci.pNext = NULL;
2742 ds_pool_ci.maxSets = 1;
2743 ds_pool_ci.poolSizeCount = 1;
2744 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002745
2746 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002747 err =
2748 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002749 ASSERT_VK_SUCCESS(err);
2750
2751 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002752 dsl_binding.binding = 0;
2753 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2754 dsl_binding.descriptorCount = 1;
2755 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2756 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002757
2758 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002759 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2760 ds_layout_ci.pNext = NULL;
2761 ds_layout_ci.bindingCount = 1;
2762 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002763 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002764 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2765 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002766 ASSERT_VK_SUCCESS(err);
2767
2768 VkDescriptorSet descriptorSet;
2769 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002770 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002771 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002772 alloc_info.descriptorPool = ds_pool;
2773 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002774 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2775 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002776 ASSERT_VK_SUCCESS(err);
2777
2778 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002779 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2780 pipeline_layout_ci.pNext = NULL;
2781 pipeline_layout_ci.setLayoutCount = 1;
2782 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002783
2784 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002785 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2786 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002787 ASSERT_VK_SUCCESS(err);
2788
2789 // Create a buffer to update the descriptor with
2790 uint32_t qfi = 0;
2791 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002792 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2793 buffCI.size = 1024;
2794 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2795 buffCI.queueFamilyIndexCount = 1;
2796 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002797
2798 VkBuffer dyub;
2799 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2800 ASSERT_VK_SUCCESS(err);
2801 // Correctly update descriptor to avoid "NOT_UPDATED" error
2802 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002803 buffInfo.buffer = dyub;
2804 buffInfo.offset = 0;
2805 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002806
2807 VkWriteDescriptorSet descriptor_write;
2808 memset(&descriptor_write, 0, sizeof(descriptor_write));
2809 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2810 descriptor_write.dstSet = descriptorSet;
2811 descriptor_write.dstBinding = 0;
2812 descriptor_write.descriptorCount = 1;
2813 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2814 descriptor_write.pBufferInfo = &buffInfo;
2815
2816 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2817
2818 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002819 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2820 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2821 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002822 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002823 uint32_t pDynOff[2] = {512, 756};
2824 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07002825 m_errorMonitor->SetDesiredFailureMsg(
2826 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002827 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07002828 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2829 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2830 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12002831 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002832 // Finally cause error due to dynamicOffset being too big
Karl Schultz6addd812016-02-02 17:17:23 -07002833 m_errorMonitor->SetDesiredFailureMsg(
2834 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002835 " from its update, this oversteps its buffer (");
2836 // Create PSO to be used for draw-time errors below
2837 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002838 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002839 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002840 "out gl_PerVertex { \n"
2841 " vec4 gl_Position;\n"
2842 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002843 "void main(){\n"
2844 " gl_Position = vec4(1);\n"
2845 "}\n";
2846 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002847 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002848 "\n"
2849 "layout(location=0) out vec4 x;\n"
2850 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2851 "void main(){\n"
2852 " x = vec4(bar.y);\n"
2853 "}\n";
2854 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2855 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2856 VkPipelineObj pipe(m_device);
2857 pipe.AddShader(&vs);
2858 pipe.AddShader(&fs);
2859 pipe.AddColorAttachment();
2860 pipe.CreateVKPipeline(pipeline_layout, renderPass());
2861
Karl Schultz6addd812016-02-02 17:17:23 -07002862 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2863 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2864 // This update should succeed, but offset size of 512 will overstep buffer
2865 // /w range 1024 & size 1024
2866 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2867 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2868 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07002869 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002870 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002871
2872 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2873 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2874}
2875
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002876TEST_F(VkLayerTest, InvalidPushConstants) {
2877 // Hit push constant error cases:
2878 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
2879 // 2. Incorrectly set push constant size to 0
2880 // 3. Incorrectly set push constant size to non-multiple of 4
2881 // 4. Attempt push constant update that exceeds maxPushConstantSize
2882 VkResult err;
2883 m_errorMonitor->SetDesiredFailureMsg(
2884 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2885 "vkCreatePipelineLayout() call has push constants with offset ");
2886
2887 ASSERT_NO_FATAL_FAILURE(InitState());
2888 ASSERT_NO_FATAL_FAILURE(InitViewport());
2889 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2890
2891 VkPushConstantRange pc_range = {};
2892 pc_range.size = 0xFFFFFFFFu;
2893 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2894 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
2895 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2896 pipeline_layout_ci.pushConstantRangeCount = 1;
2897 pipeline_layout_ci.pPushConstantRanges = &pc_range;
2898
2899 VkPipelineLayout pipeline_layout;
2900 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2901 &pipeline_layout);
2902
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002903 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002904 // Now cause errors due to size 0 and non-4 byte aligned size
2905 pc_range.size = 0;
2906 m_errorMonitor->SetDesiredFailureMsg(
2907 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2908 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
2909 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2910 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002911 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002912 pc_range.size = 1;
2913 m_errorMonitor->SetDesiredFailureMsg(
2914 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2915 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
2916 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2917 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002918 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002919 // Cause error due to bad size in vkCmdPushConstants() call
2920 m_errorMonitor->SetDesiredFailureMsg(
2921 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2922 "vkCmdPushConstants() call has push constants with offset ");
2923 pipeline_layout_ci.pushConstantRangeCount = 0;
2924 pipeline_layout_ci.pPushConstantRanges = NULL;
2925 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2926 &pipeline_layout);
2927 ASSERT_VK_SUCCESS(err);
2928 BeginCommandBuffer();
2929 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
2930 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002931 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002932 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2933}
2934
Karl Schultz6addd812016-02-02 17:17:23 -07002935TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002936 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07002937 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002938
2939 ASSERT_NO_FATAL_FAILURE(InitState());
2940 ASSERT_NO_FATAL_FAILURE(InitViewport());
2941 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2942
2943 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
2944 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002945 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2946 ds_type_count[0].descriptorCount = 10;
2947 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2948 ds_type_count[1].descriptorCount = 2;
2949 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2950 ds_type_count[2].descriptorCount = 2;
2951 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
2952 ds_type_count[3].descriptorCount = 5;
2953 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
2954 // type
2955 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
2956 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
2957 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002958
2959 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002960 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2961 ds_pool_ci.pNext = NULL;
2962 ds_pool_ci.maxSets = 5;
2963 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
2964 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002965
2966 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002967 err =
2968 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002969 ASSERT_VK_SUCCESS(err);
2970
2971 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
2972 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002973 dsl_binding[0].binding = 0;
2974 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2975 dsl_binding[0].descriptorCount = 5;
2976 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
2977 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002978
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002979 // Create layout identical to set0 layout but w/ different stageFlags
2980 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002981 dsl_fs_stage_only.binding = 0;
2982 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2983 dsl_fs_stage_only.descriptorCount = 5;
2984 dsl_fs_stage_only.stageFlags =
2985 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
2986 // bind time
2987 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002988 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002989 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2990 ds_layout_ci.pNext = NULL;
2991 ds_layout_ci.bindingCount = 1;
2992 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002993 static const uint32_t NUM_LAYOUTS = 4;
2994 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002995 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002996 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
2997 // layout for error case
2998 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2999 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003000 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003001 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003002 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3003 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003004 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003005 dsl_binding[0].binding = 0;
3006 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003007 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003008 dsl_binding[1].binding = 1;
3009 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3010 dsl_binding[1].descriptorCount = 2;
3011 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
3012 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003013 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003014 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003015 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3016 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003017 ASSERT_VK_SUCCESS(err);
3018 dsl_binding[0].binding = 0;
3019 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003020 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003021 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07003022 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3023 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003024 ASSERT_VK_SUCCESS(err);
3025 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003026 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003027 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3028 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003029 ASSERT_VK_SUCCESS(err);
3030
3031 static const uint32_t NUM_SETS = 4;
3032 VkDescriptorSet descriptorSet[NUM_SETS] = {};
3033 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003034 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003035 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003036 alloc_info.descriptorPool = ds_pool;
3037 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003038 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3039 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003040 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003041 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003042 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003043 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003044 err =
3045 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003046 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003047
3048 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003049 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3050 pipeline_layout_ci.pNext = NULL;
3051 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
3052 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003053
3054 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003055 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3056 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003057 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003058 // Create pipelineLayout with only one setLayout
3059 pipeline_layout_ci.setLayoutCount = 1;
3060 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003061 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3062 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003063 ASSERT_VK_SUCCESS(err);
3064 // Create pipelineLayout with 2 descriptor setLayout at index 0
3065 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
3066 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07003067 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3068 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003069 ASSERT_VK_SUCCESS(err);
3070 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
3071 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
3072 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07003073 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3074 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003075 ASSERT_VK_SUCCESS(err);
3076 // Create pipelineLayout with UB type, but stageFlags for FS only
3077 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
3078 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003079 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3080 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003081 ASSERT_VK_SUCCESS(err);
3082 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
3083 VkDescriptorSetLayout pl_bad_s0[2] = {};
3084 pl_bad_s0[0] = ds_layout_fs_only;
3085 pl_bad_s0[1] = ds_layout[1];
3086 pipeline_layout_ci.setLayoutCount = 2;
3087 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
3088 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07003089 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3090 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003091 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003092
3093 // Create a buffer to update the descriptor with
3094 uint32_t qfi = 0;
3095 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003096 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3097 buffCI.size = 1024;
3098 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3099 buffCI.queueFamilyIndexCount = 1;
3100 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003101
3102 VkBuffer dyub;
3103 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3104 ASSERT_VK_SUCCESS(err);
3105 // Correctly update descriptor to avoid "NOT_UPDATED" error
3106 static const uint32_t NUM_BUFFS = 5;
3107 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003108 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003109 buffInfo[i].buffer = dyub;
3110 buffInfo[i].offset = 0;
3111 buffInfo[i].range = 1024;
3112 }
Karl Schultz6addd812016-02-02 17:17:23 -07003113 VkImage image;
3114 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3115 const int32_t tex_width = 32;
3116 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003117 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003118 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3119 image_create_info.pNext = NULL;
3120 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3121 image_create_info.format = tex_format;
3122 image_create_info.extent.width = tex_width;
3123 image_create_info.extent.height = tex_height;
3124 image_create_info.extent.depth = 1;
3125 image_create_info.mipLevels = 1;
3126 image_create_info.arrayLayers = 1;
3127 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3128 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3129 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3130 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003131 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3132 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003133
Karl Schultz6addd812016-02-02 17:17:23 -07003134 VkMemoryRequirements memReqs;
3135 VkDeviceMemory imageMem;
3136 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003137 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003138 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3139 memAlloc.pNext = NULL;
3140 memAlloc.allocationSize = 0;
3141 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003142 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
3143 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003144 pass =
3145 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003146 ASSERT_TRUE(pass);
3147 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
3148 ASSERT_VK_SUCCESS(err);
3149 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
3150 ASSERT_VK_SUCCESS(err);
3151
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003152 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003153 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3154 image_view_create_info.image = image;
3155 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
3156 image_view_create_info.format = tex_format;
3157 image_view_create_info.subresourceRange.layerCount = 1;
3158 image_view_create_info.subresourceRange.baseMipLevel = 0;
3159 image_view_create_info.subresourceRange.levelCount = 1;
3160 image_view_create_info.subresourceRange.aspectMask =
3161 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003162
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003163 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07003164 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
3165 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003166 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003167 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003168 imageInfo[0].imageView = view;
3169 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3170 imageInfo[1].imageView = view;
3171 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003172 imageInfo[2].imageView = view;
3173 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3174 imageInfo[3].imageView = view;
3175 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003176
3177 static const uint32_t NUM_SET_UPDATES = 3;
3178 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
3179 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3180 descriptor_write[0].dstSet = descriptorSet[0];
3181 descriptor_write[0].dstBinding = 0;
3182 descriptor_write[0].descriptorCount = 5;
3183 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3184 descriptor_write[0].pBufferInfo = buffInfo;
3185 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3186 descriptor_write[1].dstSet = descriptorSet[1];
3187 descriptor_write[1].dstBinding = 0;
3188 descriptor_write[1].descriptorCount = 2;
3189 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3190 descriptor_write[1].pImageInfo = imageInfo;
3191 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3192 descriptor_write[2].dstSet = descriptorSet[1];
3193 descriptor_write[2].dstBinding = 1;
3194 descriptor_write[2].descriptorCount = 2;
3195 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003196 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003197
3198 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003199
Tobin Ehlis88452832015-12-03 09:40:56 -07003200 // Create PSO to be used for draw-time errors below
3201 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003202 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003203 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003204 "out gl_PerVertex {\n"
3205 " vec4 gl_Position;\n"
3206 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003207 "void main(){\n"
3208 " gl_Position = vec4(1);\n"
3209 "}\n";
3210 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003211 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003212 "\n"
3213 "layout(location=0) out vec4 x;\n"
3214 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3215 "void main(){\n"
3216 " x = vec4(bar.y);\n"
3217 "}\n";
3218 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3219 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003220 VkPipelineObj pipe(m_device);
3221 pipe.AddShader(&vs);
3222 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07003223 pipe.AddColorAttachment();
3224 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003225
3226 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003227
Karl Schultz6addd812016-02-02 17:17:23 -07003228 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3229 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3230 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3231 // of PSO
3232 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3233 // cmd_pipeline.c
3234 // due to the fact that cmd_alloc_dset_data() has not been called in
3235 // cmd_bind_graphics_pipeline()
3236 // TODO : Want to cause various binding incompatibility issues here to test
3237 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003238 // First cause various verify_layout_compatibility() fails
3239 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003240 // verify_set_layout_compatibility fail cases:
3241 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3243 " due to: invalid VkPipelineLayout ");
3244 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3245 VK_PIPELINE_BIND_POINT_GRAPHICS,
3246 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3247 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003248 m_errorMonitor->VerifyFound();
3249
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003250 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3252 " attempting to bind set to index 1");
3253 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3254 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3255 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003256 m_errorMonitor->VerifyFound();
3257
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003258 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003259 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3260 // descriptors
3261 m_errorMonitor->SetDesiredFailureMsg(
3262 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003263 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003264 vkCmdBindDescriptorSets(
3265 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3266 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003267 m_errorMonitor->VerifyFound();
3268
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003269 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3270 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003271 m_errorMonitor->SetDesiredFailureMsg(
3272 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003273 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07003274 vkCmdBindDescriptorSets(
3275 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3276 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003277 m_errorMonitor->VerifyFound();
3278
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003279 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3280 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003281 m_errorMonitor->SetDesiredFailureMsg(
3282 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003283 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003284 vkCmdBindDescriptorSets(
3285 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3286 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003287 m_errorMonitor->VerifyFound();
3288
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003289 // Cause INFO messages due to disturbing previously bound Sets
3290 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003291 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3292 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3293 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003294 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07003295 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003296 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003297 " previously bound as set #0 was disturbed ");
3298 vkCmdBindDescriptorSets(
3299 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3300 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003301 m_errorMonitor->VerifyFound();
3302
Karl Schultz6addd812016-02-02 17:17:23 -07003303 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3304 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3305 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003306 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003308 " newly bound as set #0 so set #1 and "
3309 "any subsequent sets were disturbed ");
3310 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3311 VK_PIPELINE_BIND_POINT_GRAPHICS,
3312 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003313 m_errorMonitor->VerifyFound();
3314
Tobin Ehlis88452832015-12-03 09:40:56 -07003315 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07003316 // 1. Error due to not binding required set (we actually use same code as
3317 // above to disturb set0)
3318 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3319 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3320 2, &descriptorSet[0], 0, NULL);
3321 vkCmdBindDescriptorSets(
3322 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3323 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
3324 m_errorMonitor->SetDesiredFailureMsg(
3325 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3326 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07003327 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003328 m_errorMonitor->VerifyFound();
3329
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003330 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003331 // 2. Error due to bound set not being compatible with PSO's
3332 // VkPipelineLayout (diff stageFlags in this case)
3333 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3334 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3335 2, &descriptorSet[0], 0, NULL);
3336 m_errorMonitor->SetDesiredFailureMsg(
3337 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3338 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07003339 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003340 m_errorMonitor->VerifyFound();
3341
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003342 // Remaining clean-up
3343 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003344 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003345 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
3346 }
3347 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
3348 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
3349 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003350 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3351 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3352}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003353
Karl Schultz6addd812016-02-02 17:17:23 -07003354TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003355
Karl Schultz6addd812016-02-02 17:17:23 -07003356 m_errorMonitor->SetDesiredFailureMsg(
3357 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003358 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003359
3360 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003361 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003362 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003363 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003364
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003365 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003366}
3367
Karl Schultz6addd812016-02-02 17:17:23 -07003368TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3369 VkResult err;
3370 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003371
Karl Schultz6addd812016-02-02 17:17:23 -07003372 m_errorMonitor->SetDesiredFailureMsg(
3373 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003374 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003375
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003376 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003377
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003378 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003379 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003380 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003381 cmd.commandPool = m_commandPool;
3382 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003383 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003384
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003385 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003386 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003387
3388 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003389 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003390 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003391 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003392 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003393 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3394 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003395 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003396
3397 // The error should be caught by validation of the BeginCommandBuffer call
3398 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3399
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003400 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003401 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003402}
3403
Karl Schultz6addd812016-02-02 17:17:23 -07003404TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003405 // Cause error due to Begin while recording CB
3406 // Then cause 2 errors for attempting to reset CB w/o having
3407 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3408 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003410 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003411
3412 ASSERT_NO_FATAL_FAILURE(InitState());
3413
3414 // Calls AllocateCommandBuffers
3415 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3416
Karl Schultz6addd812016-02-02 17:17:23 -07003417 // Force the failure by setting the Renderpass and Framebuffer fields with
3418 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003419 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003420 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003421 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3422 cmd_buf_info.pNext = NULL;
3423 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003424 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003425
3426 // Begin CB to transition to recording state
3427 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3428 // Can't re-begin. This should trigger error
3429 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003430 m_errorMonitor->VerifyFound();
3431
Karl Schultz6addd812016-02-02 17:17:23 -07003432 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3433 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003434 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3435 // Reset attempt will trigger error due to incorrect CommandPool state
3436 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003437 m_errorMonitor->VerifyFound();
3438
Karl Schultz6addd812016-02-02 17:17:23 -07003439 m_errorMonitor->SetDesiredFailureMsg(
3440 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3441 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003442 // Transition CB to RECORDED state
3443 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3444 // Now attempting to Begin will implicitly reset, which triggers error
3445 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003446 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003447}
3448
Karl Schultz6addd812016-02-02 17:17:23 -07003449TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003450 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003451 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003452
Karl Schultz6addd812016-02-02 17:17:23 -07003453 m_errorMonitor->SetDesiredFailureMsg(
3454 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003455 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3456
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003457 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003458 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003459
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003460 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003461 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3462 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003463
3464 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003465 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3466 ds_pool_ci.pNext = NULL;
3467 ds_pool_ci.maxSets = 1;
3468 ds_pool_ci.poolSizeCount = 1;
3469 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003470
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003471 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003472 err =
3473 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003474 ASSERT_VK_SUCCESS(err);
3475
Tony Barboureb254902015-07-15 12:50:33 -06003476 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003477 dsl_binding.binding = 0;
3478 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3479 dsl_binding.descriptorCount = 1;
3480 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3481 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003482
Tony Barboureb254902015-07-15 12:50:33 -06003483 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003484 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3485 ds_layout_ci.pNext = NULL;
3486 ds_layout_ci.bindingCount = 1;
3487 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003488
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003489 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003490 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3491 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003492 ASSERT_VK_SUCCESS(err);
3493
3494 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003495 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003496 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003497 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003498 alloc_info.descriptorPool = ds_pool;
3499 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003500 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3501 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003502 ASSERT_VK_SUCCESS(err);
3503
Tony Barboureb254902015-07-15 12:50:33 -06003504 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003505 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3506 pipeline_layout_ci.setLayoutCount = 1;
3507 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003508
3509 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003510 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3511 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003512 ASSERT_VK_SUCCESS(err);
3513
Tobin Ehlise68360f2015-10-01 11:15:13 -06003514 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07003515 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06003516
3517 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003518 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3519 vp_state_ci.scissorCount = 1;
3520 vp_state_ci.pScissors = &sc;
3521 vp_state_ci.viewportCount = 1;
3522 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003523
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003524 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3525 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3526 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3527 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3528 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3529 rs_state_ci.depthClampEnable = VK_FALSE;
3530 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3531 rs_state_ci.depthBiasEnable = VK_FALSE;
3532
Tony Barboureb254902015-07-15 12:50:33 -06003533 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003534 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3535 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003536 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003537 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3538 gp_ci.layout = pipeline_layout;
3539 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06003540
3541 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003542 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3543 pc_ci.initialDataSize = 0;
3544 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003545
3546 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003547 VkPipelineCache pipelineCache;
3548
Karl Schultz6addd812016-02-02 17:17:23 -07003549 err =
3550 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06003551 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003552 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3553 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003554
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003555 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003556
Chia-I Wuf7458c52015-10-26 21:10:41 +08003557 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3558 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3559 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3560 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003561}
Tobin Ehlis912df022015-09-17 08:46:18 -06003562/*// TODO : This test should be good, but needs Tess support in compiler to run
3563TEST_F(VkLayerTest, InvalidPatchControlPoints)
3564{
3565 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06003566 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003567
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003568 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003569 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
3570primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003571
Tobin Ehlis912df022015-09-17 08:46:18 -06003572 ASSERT_NO_FATAL_FAILURE(InitState());
3573 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06003574
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003575 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06003576 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003577 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003578
3579 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3580 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3581 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003582 ds_pool_ci.poolSizeCount = 1;
3583 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06003584
3585 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003586 err = vkCreateDescriptorPool(m_device->device(),
3587VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06003588 ASSERT_VK_SUCCESS(err);
3589
3590 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08003591 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06003592 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08003593 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003594 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3595 dsl_binding.pImmutableSamplers = NULL;
3596
3597 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003598 ds_layout_ci.sType =
3599VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003600 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003601 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003602 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06003603
3604 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003605 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3606&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003607 ASSERT_VK_SUCCESS(err);
3608
3609 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003610 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
3611VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06003612 ASSERT_VK_SUCCESS(err);
3613
3614 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003615 pipeline_layout_ci.sType =
3616VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003617 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003618 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003619 pipeline_layout_ci.pSetLayouts = &ds_layout;
3620
3621 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003622 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3623&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003624 ASSERT_VK_SUCCESS(err);
3625
3626 VkPipelineShaderStageCreateInfo shaderStages[3];
3627 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
3628
Karl Schultz6addd812016-02-02 17:17:23 -07003629 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
3630this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003631 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07003632 VkShaderObj
3633tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
3634this);
3635 VkShaderObj
3636te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
3637this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003638
Karl Schultz6addd812016-02-02 17:17:23 -07003639 shaderStages[0].sType =
3640VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003641 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003642 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003643 shaderStages[1].sType =
3644VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003645 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003646 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003647 shaderStages[2].sType =
3648VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003649 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003650 shaderStages[2].shader = te.handle();
3651
3652 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003653 iaCI.sType =
3654VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08003655 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06003656
3657 VkPipelineTessellationStateCreateInfo tsCI = {};
3658 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
3659 tsCI.patchControlPoints = 0; // This will cause an error
3660
3661 VkGraphicsPipelineCreateInfo gp_ci = {};
3662 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3663 gp_ci.pNext = NULL;
3664 gp_ci.stageCount = 3;
3665 gp_ci.pStages = shaderStages;
3666 gp_ci.pVertexInputState = NULL;
3667 gp_ci.pInputAssemblyState = &iaCI;
3668 gp_ci.pTessellationState = &tsCI;
3669 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003670 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06003671 gp_ci.pMultisampleState = NULL;
3672 gp_ci.pDepthStencilState = NULL;
3673 gp_ci.pColorBlendState = NULL;
3674 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3675 gp_ci.layout = pipeline_layout;
3676 gp_ci.renderPass = renderPass();
3677
3678 VkPipelineCacheCreateInfo pc_ci = {};
3679 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3680 pc_ci.pNext = NULL;
3681 pc_ci.initialSize = 0;
3682 pc_ci.initialData = 0;
3683 pc_ci.maxSize = 0;
3684
3685 VkPipeline pipeline;
3686 VkPipelineCache pipelineCache;
3687
Karl Schultz6addd812016-02-02 17:17:23 -07003688 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
3689&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06003690 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003691 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3692&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06003693
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003694 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003695
Chia-I Wuf7458c52015-10-26 21:10:41 +08003696 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3697 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3698 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3699 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06003700}
3701*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06003702// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07003703TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07003704 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003705
Karl Schultz6addd812016-02-02 17:17:23 -07003706 m_errorMonitor->SetDesiredFailureMsg(
3707 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003708 "Gfx Pipeline viewport count (1) must match scissor count (0).");
3709
Tobin Ehlise68360f2015-10-01 11:15:13 -06003710 ASSERT_NO_FATAL_FAILURE(InitState());
3711 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003712
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003713 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003714 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3715 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003716
3717 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003718 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3719 ds_pool_ci.maxSets = 1;
3720 ds_pool_ci.poolSizeCount = 1;
3721 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003722
3723 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003724 err =
3725 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003726 ASSERT_VK_SUCCESS(err);
3727
3728 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003729 dsl_binding.binding = 0;
3730 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3731 dsl_binding.descriptorCount = 1;
3732 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003733
3734 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003735 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3736 ds_layout_ci.bindingCount = 1;
3737 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003738
3739 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003740 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3741 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003742 ASSERT_VK_SUCCESS(err);
3743
3744 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003745 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003746 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003747 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003748 alloc_info.descriptorPool = ds_pool;
3749 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003750 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3751 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003752 ASSERT_VK_SUCCESS(err);
3753
3754 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003755 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3756 pipeline_layout_ci.setLayoutCount = 1;
3757 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003758
3759 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003760 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3761 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003762 ASSERT_VK_SUCCESS(err);
3763
3764 VkViewport vp = {}; // Just need dummy vp to point to
3765
3766 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003767 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3768 vp_state_ci.scissorCount = 0;
3769 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
3770 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003771
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003772 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3773 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3774 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3775 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3776 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3777 rs_state_ci.depthClampEnable = VK_FALSE;
3778 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3779 rs_state_ci.depthBiasEnable = VK_FALSE;
3780
Cody Northropeb3a6c12015-10-05 14:44:45 -06003781 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003782 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003783
Karl Schultz6addd812016-02-02 17:17:23 -07003784 VkShaderObj vs(m_device, bindStateVertShaderText,
3785 VK_SHADER_STAGE_VERTEX_BIT, this);
3786 VkShaderObj fs(m_device, bindStateFragShaderText,
3787 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003788 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003789 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003790 shaderStages[0] = vs.GetStageCreateInfo();
3791 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003792
3793 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003794 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3795 gp_ci.stageCount = 2;
3796 gp_ci.pStages = shaderStages;
3797 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003798 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003799 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3800 gp_ci.layout = pipeline_layout;
3801 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003802
3803 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003804 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003805
3806 VkPipeline pipeline;
3807 VkPipelineCache pipelineCache;
3808
Karl Schultz6addd812016-02-02 17:17:23 -07003809 err =
3810 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003811 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003812 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3813 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003814
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003815 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003816
Chia-I Wuf7458c52015-10-26 21:10:41 +08003817 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3818 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3819 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3820 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003821}
Karl Schultz6addd812016-02-02 17:17:23 -07003822// Don't set viewport state in PSO. This is an error b/c we always need this
3823// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06003824// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07003825TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06003826 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003827 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003828
Karl Schultz6addd812016-02-02 17:17:23 -07003829 m_errorMonitor->SetDesiredFailureMsg(
3830 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003831 "Gfx Pipeline pViewportState is null. Even if ");
3832
Tobin Ehlise68360f2015-10-01 11:15:13 -06003833 ASSERT_NO_FATAL_FAILURE(InitState());
3834 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003835
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003836 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003837 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3838 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003839
3840 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003841 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3842 ds_pool_ci.maxSets = 1;
3843 ds_pool_ci.poolSizeCount = 1;
3844 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003845
3846 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003847 err =
3848 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003849 ASSERT_VK_SUCCESS(err);
3850
3851 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003852 dsl_binding.binding = 0;
3853 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3854 dsl_binding.descriptorCount = 1;
3855 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003856
3857 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003858 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3859 ds_layout_ci.bindingCount = 1;
3860 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003861
3862 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003863 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3864 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003865 ASSERT_VK_SUCCESS(err);
3866
3867 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003868 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003869 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003870 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003871 alloc_info.descriptorPool = ds_pool;
3872 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003873 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3874 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003875 ASSERT_VK_SUCCESS(err);
3876
3877 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003878 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3879 pipeline_layout_ci.setLayoutCount = 1;
3880 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003881
3882 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003883 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3884 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003885 ASSERT_VK_SUCCESS(err);
3886
3887 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3888 // Set scissor as dynamic to avoid second error
3889 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003890 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3891 dyn_state_ci.dynamicStateCount = 1;
3892 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003893
Cody Northropeb3a6c12015-10-05 14:44:45 -06003894 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003895 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003896
Karl Schultz6addd812016-02-02 17:17:23 -07003897 VkShaderObj vs(m_device, bindStateVertShaderText,
3898 VK_SHADER_STAGE_VERTEX_BIT, this);
3899 VkShaderObj fs(m_device, bindStateFragShaderText,
3900 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003901 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003902 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003903 shaderStages[0] = vs.GetStageCreateInfo();
3904 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003905
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003906
3907 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3908 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3909 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3910 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3911 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3912 rs_state_ci.depthClampEnable = VK_FALSE;
3913 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3914 rs_state_ci.depthBiasEnable = VK_FALSE;
3915
Tobin Ehlise68360f2015-10-01 11:15:13 -06003916 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003917 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3918 gp_ci.stageCount = 2;
3919 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003920 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003921 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
3922 // should cause validation error
3923 gp_ci.pDynamicState = &dyn_state_ci;
3924 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3925 gp_ci.layout = pipeline_layout;
3926 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003927
3928 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003929 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003930
3931 VkPipeline pipeline;
3932 VkPipelineCache pipelineCache;
3933
Karl Schultz6addd812016-02-02 17:17:23 -07003934 err =
3935 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003936 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003937 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3938 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003939
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003940 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003941
Chia-I Wuf7458c52015-10-26 21:10:41 +08003942 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3943 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3944 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3945 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003946}
3947// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07003948// Then run second test where dynamic scissor count doesn't match PSO scissor
3949// count
3950TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
3951 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003952
Karl Schultz6addd812016-02-02 17:17:23 -07003953 m_errorMonitor->SetDesiredFailureMsg(
3954 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003955 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
3956
Tobin Ehlise68360f2015-10-01 11:15:13 -06003957 ASSERT_NO_FATAL_FAILURE(InitState());
3958 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003959
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003960 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003961 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3962 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003963
3964 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003965 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3966 ds_pool_ci.maxSets = 1;
3967 ds_pool_ci.poolSizeCount = 1;
3968 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003969
3970 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003971 err =
3972 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003973 ASSERT_VK_SUCCESS(err);
3974
3975 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003976 dsl_binding.binding = 0;
3977 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3978 dsl_binding.descriptorCount = 1;
3979 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003980
3981 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003982 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3983 ds_layout_ci.bindingCount = 1;
3984 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003985
3986 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003987 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3988 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003989 ASSERT_VK_SUCCESS(err);
3990
3991 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003992 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003993 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003994 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003995 alloc_info.descriptorPool = ds_pool;
3996 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003997 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3998 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003999 ASSERT_VK_SUCCESS(err);
4000
4001 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004002 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4003 pipeline_layout_ci.setLayoutCount = 1;
4004 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004005
4006 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004007 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4008 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004009 ASSERT_VK_SUCCESS(err);
4010
4011 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004012 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4013 vp_state_ci.viewportCount = 1;
4014 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
4015 vp_state_ci.scissorCount = 1;
4016 vp_state_ci.pScissors =
4017 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06004018
4019 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4020 // Set scissor as dynamic to avoid that error
4021 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004022 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4023 dyn_state_ci.dynamicStateCount = 1;
4024 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004025
Cody Northropeb3a6c12015-10-05 14:44:45 -06004026 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004027 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004028
Karl Schultz6addd812016-02-02 17:17:23 -07004029 VkShaderObj vs(m_device, bindStateVertShaderText,
4030 VK_SHADER_STAGE_VERTEX_BIT, this);
4031 VkShaderObj fs(m_device, bindStateFragShaderText,
4032 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004033 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004034 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004035 shaderStages[0] = vs.GetStageCreateInfo();
4036 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004037
Cody Northropf6622dc2015-10-06 10:33:21 -06004038 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4039 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4040 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004041 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004042 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004043 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004044 vi_ci.pVertexAttributeDescriptions = nullptr;
4045
4046 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4047 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4048 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4049
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004050 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004051 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06004052 rs_ci.pNext = nullptr;
4053
Mark Youngc89c6312016-03-31 16:03:20 -06004054 VkPipelineColorBlendAttachmentState att = {};
4055 att.blendEnable = VK_FALSE;
4056 att.colorWriteMask = 0xf;
4057
Cody Northropf6622dc2015-10-06 10:33:21 -06004058 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4059 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4060 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004061 cb_ci.attachmentCount = 1;
4062 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06004063
Tobin Ehlise68360f2015-10-01 11:15:13 -06004064 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004065 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4066 gp_ci.stageCount = 2;
4067 gp_ci.pStages = shaderStages;
4068 gp_ci.pVertexInputState = &vi_ci;
4069 gp_ci.pInputAssemblyState = &ia_ci;
4070 gp_ci.pViewportState = &vp_state_ci;
4071 gp_ci.pRasterizationState = &rs_ci;
4072 gp_ci.pColorBlendState = &cb_ci;
4073 gp_ci.pDynamicState = &dyn_state_ci;
4074 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4075 gp_ci.layout = pipeline_layout;
4076 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004077
4078 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004079 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004080
4081 VkPipeline pipeline;
4082 VkPipelineCache pipelineCache;
4083
Karl Schultz6addd812016-02-02 17:17:23 -07004084 err =
4085 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004086 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004087 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4088 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004089
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004090 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004091
Tobin Ehlisd332f282015-10-02 11:00:56 -06004092 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07004093 // First need to successfully create the PSO from above by setting
4094 // pViewports
4095 m_errorMonitor->SetDesiredFailureMsg(
4096 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4097 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
4098 "scissorCount is 1. These counts must match.");
4099
4100 VkViewport vp = {}; // Just need dummy vp to point to
4101 vp_state_ci.pViewports = &vp;
4102 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4103 &gp_ci, NULL, &pipeline);
4104 ASSERT_VK_SUCCESS(err);
4105 BeginCommandBuffer();
4106 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4107 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4108 VkRect2D scissors[2] = {}; // don't care about data
4109 // Count of 2 doesn't match PSO count of 1
4110 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
4111 Draw(1, 0, 0, 0);
4112
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004113 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004114
4115 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4116 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4117 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4118 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4119}
4120// Create PSO w/o non-zero scissorCount but no scissor data
4121// Then run second test where dynamic viewportCount doesn't match PSO
4122// viewportCount
4123TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
4124 VkResult err;
4125
4126 m_errorMonitor->SetDesiredFailureMsg(
4127 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4128 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
4129
4130 ASSERT_NO_FATAL_FAILURE(InitState());
4131 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4132
4133 VkDescriptorPoolSize ds_type_count = {};
4134 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4135 ds_type_count.descriptorCount = 1;
4136
4137 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4138 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4139 ds_pool_ci.maxSets = 1;
4140 ds_pool_ci.poolSizeCount = 1;
4141 ds_pool_ci.pPoolSizes = &ds_type_count;
4142
4143 VkDescriptorPool ds_pool;
4144 err =
4145 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4146 ASSERT_VK_SUCCESS(err);
4147
4148 VkDescriptorSetLayoutBinding dsl_binding = {};
4149 dsl_binding.binding = 0;
4150 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4151 dsl_binding.descriptorCount = 1;
4152 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4153
4154 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4155 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4156 ds_layout_ci.bindingCount = 1;
4157 ds_layout_ci.pBindings = &dsl_binding;
4158
4159 VkDescriptorSetLayout ds_layout;
4160 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4161 &ds_layout);
4162 ASSERT_VK_SUCCESS(err);
4163
4164 VkDescriptorSet descriptorSet;
4165 VkDescriptorSetAllocateInfo alloc_info = {};
4166 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4167 alloc_info.descriptorSetCount = 1;
4168 alloc_info.descriptorPool = ds_pool;
4169 alloc_info.pSetLayouts = &ds_layout;
4170 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4171 &descriptorSet);
4172 ASSERT_VK_SUCCESS(err);
4173
4174 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4175 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4176 pipeline_layout_ci.setLayoutCount = 1;
4177 pipeline_layout_ci.pSetLayouts = &ds_layout;
4178
4179 VkPipelineLayout pipeline_layout;
4180 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4181 &pipeline_layout);
4182 ASSERT_VK_SUCCESS(err);
4183
4184 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4185 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4186 vp_state_ci.scissorCount = 1;
4187 vp_state_ci.pScissors =
4188 NULL; // Null scissor w/ count of 1 should cause error
4189 vp_state_ci.viewportCount = 1;
4190 vp_state_ci.pViewports =
4191 NULL; // vp is dynamic (below) so this won't cause error
4192
4193 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
4194 // Set scissor as dynamic to avoid that error
4195 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4196 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4197 dyn_state_ci.dynamicStateCount = 1;
4198 dyn_state_ci.pDynamicStates = &vp_state;
4199
4200 VkPipelineShaderStageCreateInfo shaderStages[2];
4201 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4202
4203 VkShaderObj vs(m_device, bindStateVertShaderText,
4204 VK_SHADER_STAGE_VERTEX_BIT, this);
4205 VkShaderObj fs(m_device, bindStateFragShaderText,
4206 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004207 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004208 // but add it to be able to run on more devices
4209 shaderStages[0] = vs.GetStageCreateInfo();
4210 shaderStages[1] = fs.GetStageCreateInfo();
4211
4212 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4213 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4214 vi_ci.pNext = nullptr;
4215 vi_ci.vertexBindingDescriptionCount = 0;
4216 vi_ci.pVertexBindingDescriptions = nullptr;
4217 vi_ci.vertexAttributeDescriptionCount = 0;
4218 vi_ci.pVertexAttributeDescriptions = nullptr;
4219
4220 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4221 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4222 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4223
4224 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4225 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4226 rs_ci.pNext = nullptr;
4227
Mark Youngc89c6312016-03-31 16:03:20 -06004228 VkPipelineColorBlendAttachmentState att = {};
4229 att.blendEnable = VK_FALSE;
4230 att.colorWriteMask = 0xf;
4231
Karl Schultz6addd812016-02-02 17:17:23 -07004232 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4233 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4234 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004235 cb_ci.attachmentCount = 1;
4236 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004237
4238 VkGraphicsPipelineCreateInfo gp_ci = {};
4239 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4240 gp_ci.stageCount = 2;
4241 gp_ci.pStages = shaderStages;
4242 gp_ci.pVertexInputState = &vi_ci;
4243 gp_ci.pInputAssemblyState = &ia_ci;
4244 gp_ci.pViewportState = &vp_state_ci;
4245 gp_ci.pRasterizationState = &rs_ci;
4246 gp_ci.pColorBlendState = &cb_ci;
4247 gp_ci.pDynamicState = &dyn_state_ci;
4248 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4249 gp_ci.layout = pipeline_layout;
4250 gp_ci.renderPass = renderPass();
4251
4252 VkPipelineCacheCreateInfo pc_ci = {};
4253 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4254
4255 VkPipeline pipeline;
4256 VkPipelineCache pipelineCache;
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
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004264 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004265
4266 // Now hit second fail case where we set scissor w/ different count than PSO
4267 // First need to successfully create the PSO from above by setting
4268 // pViewports
4269 m_errorMonitor->SetDesiredFailureMsg(
4270 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4271 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4272 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004273
Tobin Ehlisd332f282015-10-02 11:00:56 -06004274 VkRect2D sc = {}; // Just need dummy vp to point to
4275 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004276 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4277 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004278 ASSERT_VK_SUCCESS(err);
4279 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004280 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4281 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004282 VkViewport viewports[2] = {}; // don't care about data
4283 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004284 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004285 Draw(1, 0, 0, 0);
4286
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004287 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004288
Chia-I Wuf7458c52015-10-26 21:10:41 +08004289 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4290 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4291 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4292 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004293}
4294
Mark Young7394fdd2016-03-31 14:56:43 -06004295TEST_F(VkLayerTest, PSOLineWidthInvalid) {
4296 VkResult err;
4297
4298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4299 "Attempt to set lineWidth to 0");
4300
4301 ASSERT_NO_FATAL_FAILURE(InitState());
4302 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4303
4304 VkDescriptorPoolSize ds_type_count = {};
4305 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4306 ds_type_count.descriptorCount = 1;
4307
4308 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4309 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4310 ds_pool_ci.maxSets = 1;
4311 ds_pool_ci.poolSizeCount = 1;
4312 ds_pool_ci.pPoolSizes = &ds_type_count;
4313
4314 VkDescriptorPool ds_pool;
4315 err =
4316 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4317 ASSERT_VK_SUCCESS(err);
4318
4319 VkDescriptorSetLayoutBinding dsl_binding = {};
4320 dsl_binding.binding = 0;
4321 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4322 dsl_binding.descriptorCount = 1;
4323 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4324
4325 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4326 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4327 ds_layout_ci.bindingCount = 1;
4328 ds_layout_ci.pBindings = &dsl_binding;
4329
4330 VkDescriptorSetLayout ds_layout;
4331 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4332 &ds_layout);
4333 ASSERT_VK_SUCCESS(err);
4334
4335 VkDescriptorSet descriptorSet;
4336 VkDescriptorSetAllocateInfo alloc_info = {};
4337 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4338 alloc_info.descriptorSetCount = 1;
4339 alloc_info.descriptorPool = ds_pool;
4340 alloc_info.pSetLayouts = &ds_layout;
4341 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4342 &descriptorSet);
4343 ASSERT_VK_SUCCESS(err);
4344
4345 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4346 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4347 pipeline_layout_ci.setLayoutCount = 1;
4348 pipeline_layout_ci.pSetLayouts = &ds_layout;
4349
4350 VkPipelineLayout pipeline_layout;
4351 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4352 &pipeline_layout);
4353 ASSERT_VK_SUCCESS(err);
4354
4355 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4356 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4357 vp_state_ci.scissorCount = 1;
4358 vp_state_ci.pScissors = NULL;
4359 vp_state_ci.viewportCount = 1;
4360 vp_state_ci.pViewports = NULL;
4361
4362 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
4363 VK_DYNAMIC_STATE_SCISSOR,
4364 VK_DYNAMIC_STATE_LINE_WIDTH};
4365 // Set scissor as dynamic to avoid that error
4366 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4367 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4368 dyn_state_ci.dynamicStateCount = 2;
4369 dyn_state_ci.pDynamicStates = dynamic_states;
4370
4371 VkPipelineShaderStageCreateInfo shaderStages[2];
4372 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4373
4374 VkShaderObj vs(m_device, bindStateVertShaderText,
4375 VK_SHADER_STAGE_VERTEX_BIT, this);
4376 VkShaderObj fs(m_device, bindStateFragShaderText,
4377 VK_SHADER_STAGE_FRAGMENT_BIT,
4378 this); // TODO - We shouldn't need a fragment shader
4379 // but add it to be able to run on more devices
4380 shaderStages[0] = vs.GetStageCreateInfo();
4381 shaderStages[1] = fs.GetStageCreateInfo();
4382
4383 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4384 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4385 vi_ci.pNext = nullptr;
4386 vi_ci.vertexBindingDescriptionCount = 0;
4387 vi_ci.pVertexBindingDescriptions = nullptr;
4388 vi_ci.vertexAttributeDescriptionCount = 0;
4389 vi_ci.pVertexAttributeDescriptions = nullptr;
4390
4391 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4392 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4393 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4394
4395 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4396 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4397 rs_ci.pNext = nullptr;
4398
4399 // Check too low (line width of 0.0f).
4400 rs_ci.lineWidth = 0.0f;
4401
4402 VkPipelineColorBlendAttachmentState att = {};
4403 att.blendEnable = VK_FALSE;
4404 att.colorWriteMask = 0xf;
4405
4406 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4407 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4408 cb_ci.pNext = nullptr;
4409 cb_ci.attachmentCount = 1;
4410 cb_ci.pAttachments = &att;
4411
4412 VkGraphicsPipelineCreateInfo gp_ci = {};
4413 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4414 gp_ci.stageCount = 2;
4415 gp_ci.pStages = shaderStages;
4416 gp_ci.pVertexInputState = &vi_ci;
4417 gp_ci.pInputAssemblyState = &ia_ci;
4418 gp_ci.pViewportState = &vp_state_ci;
4419 gp_ci.pRasterizationState = &rs_ci;
4420 gp_ci.pColorBlendState = &cb_ci;
4421 gp_ci.pDynamicState = &dyn_state_ci;
4422 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4423 gp_ci.layout = pipeline_layout;
4424 gp_ci.renderPass = renderPass();
4425
4426 VkPipelineCacheCreateInfo pc_ci = {};
4427 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4428
4429 VkPipeline pipeline;
4430 VkPipelineCache pipelineCache;
4431
4432 err =
4433 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4434 ASSERT_VK_SUCCESS(err);
4435 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4436 &gp_ci, NULL, &pipeline);
4437
4438 m_errorMonitor->VerifyFound();
4439
4440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4441 "Attempt to set lineWidth to 65536");
4442
4443 // Check too high (line width of 65536.0f).
4444 rs_ci.lineWidth = 65536.0f;
4445
4446 err =
4447 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4448 ASSERT_VK_SUCCESS(err);
4449 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4450 &gp_ci, NULL, &pipeline);
4451
4452 m_errorMonitor->VerifyFound();
4453
4454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4455 "Attempt to set lineWidth to 0");
4456
4457 dyn_state_ci.dynamicStateCount = 3;
4458
4459 rs_ci.lineWidth = 1.0f;
4460
4461 err =
4462 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4463 ASSERT_VK_SUCCESS(err);
4464 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4465 &gp_ci, NULL, &pipeline);
4466 BeginCommandBuffer();
4467 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4468 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4469
4470 // Check too low with dynamic setting.
4471 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 0.0f);
4472 m_errorMonitor->VerifyFound();
4473
4474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4475 "Attempt to set lineWidth to 65536");
4476
4477 // Check too high with dynamic setting.
4478 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
4479 m_errorMonitor->VerifyFound();
4480 EndCommandBuffer();
4481
4482 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4483 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4484 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4485 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4486}
4487
Karl Schultz6addd812016-02-02 17:17:23 -07004488TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004489 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004490 m_errorMonitor->SetDesiredFailureMsg(
4491 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004492 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004493
4494 ASSERT_NO_FATAL_FAILURE(InitState());
4495 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004496
Tony Barbourfe3351b2015-07-28 10:17:20 -06004497 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004498 // Don't care about RenderPass handle b/c error should be flagged before
4499 // that
4500 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
4501 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004502
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004503 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004504}
4505
Karl Schultz6addd812016-02-02 17:17:23 -07004506TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004507 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004508 m_errorMonitor->SetDesiredFailureMsg(
4509 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004510 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004511
4512 ASSERT_NO_FATAL_FAILURE(InitState());
4513 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004514
Tony Barbourfe3351b2015-07-28 10:17:20 -06004515 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004516 // Just create a dummy Renderpass that's non-NULL so we can get to the
4517 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06004518 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004519 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4520 rp_begin.pNext = NULL;
4521 rp_begin.renderPass = renderPass();
4522 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004523
Karl Schultz6addd812016-02-02 17:17:23 -07004524 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
4525 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004526
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004527 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004528}
4529
Karl Schultz6addd812016-02-02 17:17:23 -07004530TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004531 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004532 m_errorMonitor->SetDesiredFailureMsg(
4533 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004534 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004535
4536 ASSERT_NO_FATAL_FAILURE(InitState());
4537 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004538
4539 // Renderpass is started here
4540 BeginCommandBuffer();
4541
4542 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004543 vk_testing::Buffer dstBuffer;
4544 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004545
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004546 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004547
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004548 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004549}
4550
Karl Schultz6addd812016-02-02 17:17:23 -07004551TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004552 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004553 m_errorMonitor->SetDesiredFailureMsg(
4554 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004555 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004556
4557 ASSERT_NO_FATAL_FAILURE(InitState());
4558 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004559
4560 // Renderpass is started here
4561 BeginCommandBuffer();
4562
4563 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004564 vk_testing::Buffer dstBuffer;
4565 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004566
Karl Schultz6addd812016-02-02 17:17:23 -07004567 VkDeviceSize dstOffset = 0;
4568 VkDeviceSize dataSize = 1024;
4569 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004570
Karl Schultz6addd812016-02-02 17:17:23 -07004571 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
4572 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004573
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004574 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004575}
4576
Karl Schultz6addd812016-02-02 17:17:23 -07004577TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004578 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004579 m_errorMonitor->SetDesiredFailureMsg(
4580 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004581 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004582
4583 ASSERT_NO_FATAL_FAILURE(InitState());
4584 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004585
4586 // Renderpass is started here
4587 BeginCommandBuffer();
4588
Michael Lentine0a369f62016-02-03 16:51:46 -06004589 VkClearColorValue clear_color;
4590 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07004591 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
4592 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4593 const int32_t tex_width = 32;
4594 const int32_t tex_height = 32;
4595 VkImageCreateInfo image_create_info = {};
4596 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4597 image_create_info.pNext = NULL;
4598 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4599 image_create_info.format = tex_format;
4600 image_create_info.extent.width = tex_width;
4601 image_create_info.extent.height = tex_height;
4602 image_create_info.extent.depth = 1;
4603 image_create_info.mipLevels = 1;
4604 image_create_info.arrayLayers = 1;
4605 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4606 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4607 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004608
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004609 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004610 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4611 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004612
Karl Schultz6addd812016-02-02 17:17:23 -07004613 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4614 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004615
Karl Schultz6addd812016-02-02 17:17:23 -07004616 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4617 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004618
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004619 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004620}
4621
Karl Schultz6addd812016-02-02 17:17:23 -07004622TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004623 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004624 m_errorMonitor->SetDesiredFailureMsg(
4625 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004626 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004627
4628 ASSERT_NO_FATAL_FAILURE(InitState());
4629 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004630
4631 // Renderpass is started here
4632 BeginCommandBuffer();
4633
4634 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07004635 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004636 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
4637 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4638 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
4639 image_create_info.extent.width = 64;
4640 image_create_info.extent.height = 64;
4641 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4642 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004643
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004644 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004645 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4646 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004647
Karl Schultz6addd812016-02-02 17:17:23 -07004648 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4649 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004650
Karl Schultz6addd812016-02-02 17:17:23 -07004651 vkCmdClearDepthStencilImage(
4652 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4653 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
4654 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004655
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004656 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004657}
4658
Karl Schultz6addd812016-02-02 17:17:23 -07004659TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004660 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004661 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004662
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004664 "vkCmdClearAttachments: This call "
4665 "must be issued inside an active "
4666 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004667
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004668 ASSERT_NO_FATAL_FAILURE(InitState());
4669 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004670
4671 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004672 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004673 ASSERT_VK_SUCCESS(err);
4674
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004675 VkClearAttachment color_attachment;
4676 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4677 color_attachment.clearValue.color.float32[0] = 0;
4678 color_attachment.clearValue.color.float32[1] = 0;
4679 color_attachment.clearValue.color.float32[2] = 0;
4680 color_attachment.clearValue.color.float32[3] = 0;
4681 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004682 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
4683 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4684 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004685
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004686 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004687}
4688
Karl Schultz9e66a292016-04-21 15:57:51 -06004689TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
4690 // Try to add a buffer memory barrier with no buffer.
4691 m_errorMonitor->SetDesiredFailureMsg(
4692 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4693 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
4694
4695 ASSERT_NO_FATAL_FAILURE(InitState());
4696 BeginCommandBuffer();
4697
4698 VkBufferMemoryBarrier buf_barrier = {};
4699 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
4700 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4701 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4702 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4703 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4704 buf_barrier.buffer = VK_NULL_HANDLE;
4705 buf_barrier.offset = 0;
4706 buf_barrier.size = VK_WHOLE_SIZE;
4707 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4708 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
4709 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
4710
4711 m_errorMonitor->VerifyFound();
4712}
4713
Karl Schultz6addd812016-02-02 17:17:23 -07004714TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004715 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004716 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004717
Karl Schultz6addd812016-02-02 17:17:23 -07004718 m_errorMonitor->SetDesiredFailureMsg(
4719 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004720 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
4721
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004722 ASSERT_NO_FATAL_FAILURE(InitState());
4723 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004724 uint32_t qfi = 0;
4725 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004726 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4727 buffCI.size = 1024;
4728 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4729 buffCI.queueFamilyIndexCount = 1;
4730 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004731
4732 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004733 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004734 ASSERT_VK_SUCCESS(err);
4735
4736 BeginCommandBuffer();
4737 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004738 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4739 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004740 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07004741 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
4742 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004743
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004744 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004745
Chia-I Wuf7458c52015-10-26 21:10:41 +08004746 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004747}
4748
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004749TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
4750 // Create an out-of-range queueFamilyIndex
4751 m_errorMonitor->SetDesiredFailureMsg(
4752 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06004753 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004754
4755 ASSERT_NO_FATAL_FAILURE(InitState());
4756 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4757 VkBufferCreateInfo buffCI = {};
4758 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4759 buffCI.size = 1024;
4760 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4761 buffCI.queueFamilyIndexCount = 1;
4762 // Introduce failure by specifying invalid queue_family_index
4763 uint32_t qfi = 777;
4764 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06004765 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004766
4767 VkBuffer ib;
4768 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
4769
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004770 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004771}
4772
Karl Schultz6addd812016-02-02 17:17:23 -07004773TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
4774 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
4775 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004776
Karl Schultz6addd812016-02-02 17:17:23 -07004777 m_errorMonitor->SetDesiredFailureMsg(
4778 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004779 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004780
4781 ASSERT_NO_FATAL_FAILURE(InitState());
4782 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004783
4784 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004785 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004786 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
4787 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004788
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004789 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004790}
4791
Karl Schultz6addd812016-02-02 17:17:23 -07004792TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004793 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07004794 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004795
Karl Schultz6addd812016-02-02 17:17:23 -07004796 m_errorMonitor->SetDesiredFailureMsg(
4797 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
4798 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
4799 "does not match ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004800
Tobin Ehlis3b780662015-05-28 12:11:26 -06004801 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004802 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004803 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004804 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4805 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004806
4807 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004808 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4809 ds_pool_ci.pNext = NULL;
4810 ds_pool_ci.maxSets = 1;
4811 ds_pool_ci.poolSizeCount = 1;
4812 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004813
Tobin Ehlis3b780662015-05-28 12:11:26 -06004814 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004815 err =
4816 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004817 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004818 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004819 dsl_binding.binding = 0;
4820 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4821 dsl_binding.descriptorCount = 1;
4822 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4823 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004824
Tony Barboureb254902015-07-15 12:50:33 -06004825 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004826 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4827 ds_layout_ci.pNext = NULL;
4828 ds_layout_ci.bindingCount = 1;
4829 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004830
Tobin Ehlis3b780662015-05-28 12:11:26 -06004831 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004832 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4833 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004834 ASSERT_VK_SUCCESS(err);
4835
4836 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004837 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004838 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004839 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004840 alloc_info.descriptorPool = ds_pool;
4841 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004842 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4843 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004844 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004845
Tony Barboureb254902015-07-15 12:50:33 -06004846 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004847 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4848 sampler_ci.pNext = NULL;
4849 sampler_ci.magFilter = VK_FILTER_NEAREST;
4850 sampler_ci.minFilter = VK_FILTER_NEAREST;
4851 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4852 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4853 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4854 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4855 sampler_ci.mipLodBias = 1.0;
4856 sampler_ci.anisotropyEnable = VK_FALSE;
4857 sampler_ci.maxAnisotropy = 1;
4858 sampler_ci.compareEnable = VK_FALSE;
4859 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4860 sampler_ci.minLod = 1.0;
4861 sampler_ci.maxLod = 1.0;
4862 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4863 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski52ac6582015-09-01 15:42:56 -06004864
Tobin Ehlis3b780662015-05-28 12:11:26 -06004865 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004866 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004867 ASSERT_VK_SUCCESS(err);
4868
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004869 VkDescriptorImageInfo info = {};
4870 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004871
4872 VkWriteDescriptorSet descriptor_write;
4873 memset(&descriptor_write, 0, sizeof(descriptor_write));
4874 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004875 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004876 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004877 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004878 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004879 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004880
4881 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4882
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004883 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004884
Chia-I Wuf7458c52015-10-26 21:10:41 +08004885 vkDestroySampler(m_device->device(), sampler, NULL);
4886 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4887 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004888}
4889
Karl Schultz6addd812016-02-02 17:17:23 -07004890TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004891 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07004892 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004893
Karl Schultz6addd812016-02-02 17:17:23 -07004894 m_errorMonitor->SetDesiredFailureMsg(
4895 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
4896 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
4897 "is out of bounds for matching binding");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004898
Tobin Ehlis3b780662015-05-28 12:11:26 -06004899 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004900 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004901 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004902 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4903 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004904
4905 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004906 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4907 ds_pool_ci.pNext = NULL;
4908 ds_pool_ci.maxSets = 1;
4909 ds_pool_ci.poolSizeCount = 1;
4910 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004911
Tobin Ehlis3b780662015-05-28 12:11:26 -06004912 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004913 err =
4914 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004915 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004916
Tony Barboureb254902015-07-15 12:50:33 -06004917 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004918 dsl_binding.binding = 0;
4919 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4920 dsl_binding.descriptorCount = 1;
4921 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4922 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06004923
4924 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004925 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4926 ds_layout_ci.pNext = NULL;
4927 ds_layout_ci.bindingCount = 1;
4928 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004929
Tobin Ehlis3b780662015-05-28 12:11:26 -06004930 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004931 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4932 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004933 ASSERT_VK_SUCCESS(err);
4934
4935 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004936 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004937 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004938 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004939 alloc_info.descriptorPool = ds_pool;
4940 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004941 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4942 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004943 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004944
Tony Barboureb254902015-07-15 12:50:33 -06004945 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004946 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4947 sampler_ci.pNext = NULL;
4948 sampler_ci.magFilter = VK_FILTER_NEAREST;
4949 sampler_ci.minFilter = VK_FILTER_NEAREST;
4950 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4951 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4952 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4953 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4954 sampler_ci.mipLodBias = 1.0;
4955 sampler_ci.anisotropyEnable = VK_FALSE;
4956 sampler_ci.maxAnisotropy = 1;
4957 sampler_ci.compareEnable = VK_FALSE;
4958 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4959 sampler_ci.minLod = 1.0;
4960 sampler_ci.maxLod = 1.0;
4961 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4962 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06004963
Tobin Ehlis3b780662015-05-28 12:11:26 -06004964 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004965 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004966 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004967
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004968 VkDescriptorImageInfo info = {};
4969 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004970
4971 VkWriteDescriptorSet descriptor_write;
4972 memset(&descriptor_write, 0, sizeof(descriptor_write));
4973 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004974 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004975 descriptor_write.dstArrayElement =
4976 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08004977 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004978 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004979 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004980 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004981
4982 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4983
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004984 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004985
Chia-I Wuf7458c52015-10-26 21:10:41 +08004986 vkDestroySampler(m_device->device(), sampler, NULL);
4987 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4988 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004989}
4990
Karl Schultz6addd812016-02-02 17:17:23 -07004991TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
4992 // Create layout w/ count of 1 and attempt update to that layout w/ binding
4993 // index 2
4994 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004995
Karl Schultz6addd812016-02-02 17:17:23 -07004996 m_errorMonitor->SetDesiredFailureMsg(
4997 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004998 " does not have binding to match update binding ");
4999
Tobin Ehlis3b780662015-05-28 12:11:26 -06005000 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005001 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005002 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005003 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5004 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005005
5006 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005007 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5008 ds_pool_ci.pNext = NULL;
5009 ds_pool_ci.maxSets = 1;
5010 ds_pool_ci.poolSizeCount = 1;
5011 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005012
Tobin Ehlis3b780662015-05-28 12:11:26 -06005013 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005014 err =
5015 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005016 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005017
Tony Barboureb254902015-07-15 12:50:33 -06005018 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005019 dsl_binding.binding = 0;
5020 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5021 dsl_binding.descriptorCount = 1;
5022 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5023 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005024
5025 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005026 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5027 ds_layout_ci.pNext = NULL;
5028 ds_layout_ci.bindingCount = 1;
5029 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005030 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005031 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5032 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005033 ASSERT_VK_SUCCESS(err);
5034
5035 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005036 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005037 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005038 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005039 alloc_info.descriptorPool = ds_pool;
5040 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005041 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5042 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005043 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005044
Tony Barboureb254902015-07-15 12:50:33 -06005045 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005046 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5047 sampler_ci.pNext = NULL;
5048 sampler_ci.magFilter = VK_FILTER_NEAREST;
5049 sampler_ci.minFilter = VK_FILTER_NEAREST;
5050 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5051 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5052 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5053 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5054 sampler_ci.mipLodBias = 1.0;
5055 sampler_ci.anisotropyEnable = VK_FALSE;
5056 sampler_ci.maxAnisotropy = 1;
5057 sampler_ci.compareEnable = VK_FALSE;
5058 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5059 sampler_ci.minLod = 1.0;
5060 sampler_ci.maxLod = 1.0;
5061 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5062 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005063
Tobin Ehlis3b780662015-05-28 12:11:26 -06005064 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005065 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005066 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005067
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005068 VkDescriptorImageInfo info = {};
5069 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005070
5071 VkWriteDescriptorSet descriptor_write;
5072 memset(&descriptor_write, 0, sizeof(descriptor_write));
5073 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005074 descriptor_write.dstSet = descriptorSet;
5075 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005076 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005077 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005078 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005079 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005080
5081 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5082
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005083 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005084
Chia-I Wuf7458c52015-10-26 21:10:41 +08005085 vkDestroySampler(m_device->device(), sampler, NULL);
5086 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5087 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005088}
5089
Karl Schultz6addd812016-02-02 17:17:23 -07005090TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
5091 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
5092 // types
5093 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005094
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005096 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005097
Tobin Ehlis3b780662015-05-28 12:11:26 -06005098 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005099
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005100 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005101 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5102 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005103
5104 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005105 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5106 ds_pool_ci.pNext = NULL;
5107 ds_pool_ci.maxSets = 1;
5108 ds_pool_ci.poolSizeCount = 1;
5109 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005110
Tobin Ehlis3b780662015-05-28 12:11:26 -06005111 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005112 err =
5113 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005114 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005115 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005116 dsl_binding.binding = 0;
5117 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5118 dsl_binding.descriptorCount = 1;
5119 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5120 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005121
Tony Barboureb254902015-07-15 12:50:33 -06005122 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005123 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5124 ds_layout_ci.pNext = NULL;
5125 ds_layout_ci.bindingCount = 1;
5126 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005127
Tobin Ehlis3b780662015-05-28 12:11:26 -06005128 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005129 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5130 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005131 ASSERT_VK_SUCCESS(err);
5132
5133 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005134 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005135 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005136 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005137 alloc_info.descriptorPool = ds_pool;
5138 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005139 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5140 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005141 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005142
Tony Barboureb254902015-07-15 12:50:33 -06005143 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005144 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5145 sampler_ci.pNext = NULL;
5146 sampler_ci.magFilter = VK_FILTER_NEAREST;
5147 sampler_ci.minFilter = VK_FILTER_NEAREST;
5148 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5149 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5150 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5151 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5152 sampler_ci.mipLodBias = 1.0;
5153 sampler_ci.anisotropyEnable = VK_FALSE;
5154 sampler_ci.maxAnisotropy = 1;
5155 sampler_ci.compareEnable = VK_FALSE;
5156 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5157 sampler_ci.minLod = 1.0;
5158 sampler_ci.maxLod = 1.0;
5159 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5160 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005161 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005162 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005163 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005164
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005165 VkDescriptorImageInfo info = {};
5166 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005167
5168 VkWriteDescriptorSet descriptor_write;
5169 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07005170 descriptor_write.sType =
5171 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005172 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005173 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005174 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005175 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005176 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005177
5178 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5179
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005180 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005181
Chia-I Wuf7458c52015-10-26 21:10:41 +08005182 vkDestroySampler(m_device->device(), sampler, NULL);
5183 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5184 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005185}
5186
Karl Schultz6addd812016-02-02 17:17:23 -07005187TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005188 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07005189 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005190
Karl Schultz6addd812016-02-02 17:17:23 -07005191 m_errorMonitor->SetDesiredFailureMsg(
5192 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005193 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
5194
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005195 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005196 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
5197 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005198 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005199 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
5200 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005201
5202 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005203 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5204 ds_pool_ci.pNext = NULL;
5205 ds_pool_ci.maxSets = 1;
5206 ds_pool_ci.poolSizeCount = 1;
5207 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005208
5209 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005210 err =
5211 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005212 ASSERT_VK_SUCCESS(err);
5213
5214 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005215 dsl_binding.binding = 0;
5216 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5217 dsl_binding.descriptorCount = 1;
5218 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5219 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005220
5221 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005222 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5223 ds_layout_ci.pNext = NULL;
5224 ds_layout_ci.bindingCount = 1;
5225 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005226 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005227 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5228 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005229 ASSERT_VK_SUCCESS(err);
5230
5231 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005232 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005233 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005234 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005235 alloc_info.descriptorPool = ds_pool;
5236 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005237 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5238 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005239 ASSERT_VK_SUCCESS(err);
5240
Karl Schultz6addd812016-02-02 17:17:23 -07005241 VkSampler sampler =
5242 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005243
5244 VkDescriptorImageInfo descriptor_info;
5245 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5246 descriptor_info.sampler = sampler;
5247
5248 VkWriteDescriptorSet descriptor_write;
5249 memset(&descriptor_write, 0, sizeof(descriptor_write));
5250 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005251 descriptor_write.dstSet = descriptorSet;
5252 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005253 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005254 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5255 descriptor_write.pImageInfo = &descriptor_info;
5256
5257 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5258
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005259 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005260
Chia-I Wuf7458c52015-10-26 21:10:41 +08005261 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5262 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005263}
5264
Karl Schultz6addd812016-02-02 17:17:23 -07005265TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
5266 // Create a single combined Image/Sampler descriptor and send it an invalid
5267 // imageView
5268 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005269
Karl Schultz6addd812016-02-02 17:17:23 -07005270 m_errorMonitor->SetDesiredFailureMsg(
5271 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005272 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
5273
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005274 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005275 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005276 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5277 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005278
5279 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005280 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5281 ds_pool_ci.pNext = NULL;
5282 ds_pool_ci.maxSets = 1;
5283 ds_pool_ci.poolSizeCount = 1;
5284 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005285
5286 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005287 err =
5288 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005289 ASSERT_VK_SUCCESS(err);
5290
5291 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005292 dsl_binding.binding = 0;
5293 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5294 dsl_binding.descriptorCount = 1;
5295 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5296 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005297
5298 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005299 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5300 ds_layout_ci.pNext = NULL;
5301 ds_layout_ci.bindingCount = 1;
5302 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005303 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005304 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5305 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005306 ASSERT_VK_SUCCESS(err);
5307
5308 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005309 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005310 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005311 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005312 alloc_info.descriptorPool = ds_pool;
5313 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005314 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5315 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005316 ASSERT_VK_SUCCESS(err);
5317
5318 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005319 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5320 sampler_ci.pNext = NULL;
5321 sampler_ci.magFilter = VK_FILTER_NEAREST;
5322 sampler_ci.minFilter = VK_FILTER_NEAREST;
5323 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5324 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5325 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5326 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5327 sampler_ci.mipLodBias = 1.0;
5328 sampler_ci.anisotropyEnable = VK_FALSE;
5329 sampler_ci.maxAnisotropy = 1;
5330 sampler_ci.compareEnable = VK_FALSE;
5331 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5332 sampler_ci.minLod = 1.0;
5333 sampler_ci.maxLod = 1.0;
5334 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5335 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005336
5337 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005338 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005339 ASSERT_VK_SUCCESS(err);
5340
Karl Schultz6addd812016-02-02 17:17:23 -07005341 VkImageView view =
5342 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005343
5344 VkDescriptorImageInfo descriptor_info;
5345 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5346 descriptor_info.sampler = sampler;
5347 descriptor_info.imageView = view;
5348
5349 VkWriteDescriptorSet descriptor_write;
5350 memset(&descriptor_write, 0, sizeof(descriptor_write));
5351 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005352 descriptor_write.dstSet = descriptorSet;
5353 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005354 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005355 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5356 descriptor_write.pImageInfo = &descriptor_info;
5357
5358 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5359
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005360 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005361
Chia-I Wuf7458c52015-10-26 21:10:41 +08005362 vkDestroySampler(m_device->device(), sampler, NULL);
5363 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5364 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005365}
5366
Karl Schultz6addd812016-02-02 17:17:23 -07005367TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
5368 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
5369 // into the other
5370 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005371
Karl Schultz6addd812016-02-02 17:17:23 -07005372 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06005373 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5374 "Copy descriptor update index 0, has src update descriptor "
5375 "type VK_DESCRIPTOR_TYPE_SAMPLER that does not match overlapping "
5376 "dest ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005377
Tobin Ehlis04356f92015-10-27 16:35:27 -06005378 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005379 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005380 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005381 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5382 ds_type_count[0].descriptorCount = 1;
5383 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
5384 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005385
5386 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005387 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5388 ds_pool_ci.pNext = NULL;
5389 ds_pool_ci.maxSets = 1;
5390 ds_pool_ci.poolSizeCount = 2;
5391 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005392
5393 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005394 err =
5395 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005396 ASSERT_VK_SUCCESS(err);
5397 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005398 dsl_binding[0].binding = 0;
5399 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5400 dsl_binding[0].descriptorCount = 1;
5401 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
5402 dsl_binding[0].pImmutableSamplers = NULL;
5403 dsl_binding[1].binding = 1;
5404 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5405 dsl_binding[1].descriptorCount = 1;
5406 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
5407 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005408
5409 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005410 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5411 ds_layout_ci.pNext = NULL;
5412 ds_layout_ci.bindingCount = 2;
5413 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005414
5415 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005416 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5417 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005418 ASSERT_VK_SUCCESS(err);
5419
5420 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005421 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005422 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005423 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005424 alloc_info.descriptorPool = ds_pool;
5425 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005426 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5427 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005428 ASSERT_VK_SUCCESS(err);
5429
5430 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005431 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5432 sampler_ci.pNext = NULL;
5433 sampler_ci.magFilter = VK_FILTER_NEAREST;
5434 sampler_ci.minFilter = VK_FILTER_NEAREST;
5435 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5436 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5437 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5438 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5439 sampler_ci.mipLodBias = 1.0;
5440 sampler_ci.anisotropyEnable = VK_FALSE;
5441 sampler_ci.maxAnisotropy = 1;
5442 sampler_ci.compareEnable = VK_FALSE;
5443 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5444 sampler_ci.minLod = 1.0;
5445 sampler_ci.maxLod = 1.0;
5446 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5447 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005448
5449 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005450 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005451 ASSERT_VK_SUCCESS(err);
5452
5453 VkDescriptorImageInfo info = {};
5454 info.sampler = sampler;
5455
5456 VkWriteDescriptorSet descriptor_write;
5457 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
5458 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005459 descriptor_write.dstSet = descriptorSet;
5460 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08005461 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005462 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5463 descriptor_write.pImageInfo = &info;
5464 // This write update should succeed
5465 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5466 // Now perform a copy update that fails due to type mismatch
5467 VkCopyDescriptorSet copy_ds_update;
5468 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5469 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5470 copy_ds_update.srcSet = descriptorSet;
5471 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005472 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005473 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08005474 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005475 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5476
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005477 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005478 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005479 m_errorMonitor->SetDesiredFailureMsg(
5480 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005481 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis04356f92015-10-27 16:35:27 -06005482 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5483 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5484 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005485 copy_ds_update.srcBinding =
5486 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005487 copy_ds_update.dstSet = descriptorSet;
5488 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005489 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005490 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5491
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005492 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005493
Tobin Ehlis04356f92015-10-27 16:35:27 -06005494 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005495 m_errorMonitor->SetDesiredFailureMsg(
5496 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005497 "Copy descriptor src update is out of bounds for matching binding 1 ");
5498
Tobin Ehlis04356f92015-10-27 16:35:27 -06005499 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5500 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5501 copy_ds_update.srcSet = descriptorSet;
5502 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005503 copy_ds_update.dstSet = descriptorSet;
5504 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005505 copy_ds_update.descriptorCount =
5506 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06005507 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5508
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005509 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005510
Chia-I Wuf7458c52015-10-26 21:10:41 +08005511 vkDestroySampler(m_device->device(), sampler, NULL);
5512 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5513 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005514}
5515
Karl Schultz6addd812016-02-02 17:17:23 -07005516TEST_F(VkLayerTest, NumSamplesMismatch) {
5517 // Create CommandBuffer where MSAA samples doesn't match RenderPass
5518 // sampleCount
5519 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005520
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005522 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005523
Tobin Ehlis3b780662015-05-28 12:11:26 -06005524 ASSERT_NO_FATAL_FAILURE(InitState());
5525 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005526 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06005527 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005528 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005529
5530 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005531 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5532 ds_pool_ci.pNext = NULL;
5533 ds_pool_ci.maxSets = 1;
5534 ds_pool_ci.poolSizeCount = 1;
5535 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005536
Tobin Ehlis3b780662015-05-28 12:11:26 -06005537 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005538 err =
5539 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005540 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005541
Tony Barboureb254902015-07-15 12:50:33 -06005542 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08005543 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06005544 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08005545 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005546 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5547 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005548
Tony Barboureb254902015-07-15 12:50:33 -06005549 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5550 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5551 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005552 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07005553 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005554
Tobin Ehlis3b780662015-05-28 12:11:26 -06005555 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005556 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5557 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005558 ASSERT_VK_SUCCESS(err);
5559
5560 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005561 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005562 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005563 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005564 alloc_info.descriptorPool = ds_pool;
5565 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005566 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5567 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005568 ASSERT_VK_SUCCESS(err);
5569
Tony Barboureb254902015-07-15 12:50:33 -06005570 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005571 pipe_ms_state_ci.sType =
5572 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5573 pipe_ms_state_ci.pNext = NULL;
5574 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5575 pipe_ms_state_ci.sampleShadingEnable = 0;
5576 pipe_ms_state_ci.minSampleShading = 1.0;
5577 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005578
Tony Barboureb254902015-07-15 12:50:33 -06005579 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005580 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5581 pipeline_layout_ci.pNext = NULL;
5582 pipeline_layout_ci.setLayoutCount = 1;
5583 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005584
5585 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005586 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5587 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005588 ASSERT_VK_SUCCESS(err);
5589
Karl Schultz6addd812016-02-02 17:17:23 -07005590 VkShaderObj vs(m_device, bindStateVertShaderText,
5591 VK_SHADER_STAGE_VERTEX_BIT, this);
5592 VkShaderObj fs(m_device, bindStateFragShaderText,
5593 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005594 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005595 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005596 VkPipelineObj pipe(m_device);
5597 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005598 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005599 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005600 pipe.SetMSAA(&pipe_ms_state_ci);
5601 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005602
Tony Barbourfe3351b2015-07-28 10:17:20 -06005603 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005604 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5605 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005606
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005607 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005608
Chia-I Wuf7458c52015-10-26 21:10:41 +08005609 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5610 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5611 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005612}
Tobin Ehlis0f10db52016-04-04 10:00:21 -06005613#ifdef ADD_BACK_IN_WHEN_CHECK_IS_BACK // TODO : Re-enable when GH256 fixed
Mark Youngc89c6312016-03-31 16:03:20 -06005614TEST_F(VkLayerTest, NumBlendAttachMismatch) {
5615 // Create Pipeline where the number of blend attachments doesn't match the
5616 // number of color attachments. In this case, we don't add any color
5617 // blend attachments even though we have a color attachment.
5618 VkResult err;
5619
5620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5621 "Mismatch between blend state attachment");
5622
5623 ASSERT_NO_FATAL_FAILURE(InitState());
5624 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5625 VkDescriptorPoolSize ds_type_count = {};
5626 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5627 ds_type_count.descriptorCount = 1;
5628
5629 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5630 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5631 ds_pool_ci.pNext = NULL;
5632 ds_pool_ci.maxSets = 1;
5633 ds_pool_ci.poolSizeCount = 1;
5634 ds_pool_ci.pPoolSizes = &ds_type_count;
5635
5636 VkDescriptorPool ds_pool;
5637 err =
5638 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5639 ASSERT_VK_SUCCESS(err);
5640
5641 VkDescriptorSetLayoutBinding dsl_binding = {};
5642 dsl_binding.binding = 0;
5643 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5644 dsl_binding.descriptorCount = 1;
5645 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5646 dsl_binding.pImmutableSamplers = NULL;
5647
5648 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5649 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5650 ds_layout_ci.pNext = NULL;
5651 ds_layout_ci.bindingCount = 1;
5652 ds_layout_ci.pBindings = &dsl_binding;
5653
5654 VkDescriptorSetLayout ds_layout;
5655 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5656 &ds_layout);
5657 ASSERT_VK_SUCCESS(err);
5658
5659 VkDescriptorSet descriptorSet;
5660 VkDescriptorSetAllocateInfo alloc_info = {};
5661 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5662 alloc_info.descriptorSetCount = 1;
5663 alloc_info.descriptorPool = ds_pool;
5664 alloc_info.pSetLayouts = &ds_layout;
5665 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5666 &descriptorSet);
5667 ASSERT_VK_SUCCESS(err);
5668
5669 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
5670 pipe_ms_state_ci.sType =
5671 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5672 pipe_ms_state_ci.pNext = NULL;
5673 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
5674 pipe_ms_state_ci.sampleShadingEnable = 0;
5675 pipe_ms_state_ci.minSampleShading = 1.0;
5676 pipe_ms_state_ci.pSampleMask = NULL;
5677
5678 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5679 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5680 pipeline_layout_ci.pNext = NULL;
5681 pipeline_layout_ci.setLayoutCount = 1;
5682 pipeline_layout_ci.pSetLayouts = &ds_layout;
5683
5684 VkPipelineLayout pipeline_layout;
5685 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5686 &pipeline_layout);
5687 ASSERT_VK_SUCCESS(err);
5688
5689 VkShaderObj vs(m_device, bindStateVertShaderText,
5690 VK_SHADER_STAGE_VERTEX_BIT, this);
5691 VkShaderObj fs(m_device, bindStateFragShaderText,
5692 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005693 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06005694 // but add it to be able to run on more devices
5695 VkPipelineObj pipe(m_device);
5696 pipe.AddShader(&vs);
5697 pipe.AddShader(&fs);
5698 pipe.SetMSAA(&pipe_ms_state_ci);
5699 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5700
5701 BeginCommandBuffer();
5702 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5703 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5704
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005705 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06005706
5707 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5708 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5709 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5710}
Tony Barbour4e81a202016-04-04 11:09:40 -06005711#endif //ADD_BACK_IN_WHEN_CHECK_IS_BACK
Karl Schultz6addd812016-02-02 17:17:23 -07005712TEST_F(VkLayerTest, ClearCmdNoDraw) {
5713 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
5714 // to issuing a Draw
5715 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005716
Karl Schultz6addd812016-02-02 17:17:23 -07005717 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07005718 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005719 "vkCmdClearAttachments() issued on CB object ");
5720
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005721 ASSERT_NO_FATAL_FAILURE(InitState());
5722 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005723
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005724 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005725 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5726 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005727
5728 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005729 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5730 ds_pool_ci.pNext = NULL;
5731 ds_pool_ci.maxSets = 1;
5732 ds_pool_ci.poolSizeCount = 1;
5733 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005734
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005735 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005736 err =
5737 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005738 ASSERT_VK_SUCCESS(err);
5739
Tony Barboureb254902015-07-15 12:50:33 -06005740 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005741 dsl_binding.binding = 0;
5742 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5743 dsl_binding.descriptorCount = 1;
5744 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5745 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005746
Tony Barboureb254902015-07-15 12:50:33 -06005747 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005748 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5749 ds_layout_ci.pNext = NULL;
5750 ds_layout_ci.bindingCount = 1;
5751 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005752
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005753 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005754 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5755 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005756 ASSERT_VK_SUCCESS(err);
5757
5758 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005759 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005760 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005761 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005762 alloc_info.descriptorPool = ds_pool;
5763 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005764 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5765 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005766 ASSERT_VK_SUCCESS(err);
5767
Tony Barboureb254902015-07-15 12:50:33 -06005768 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005769 pipe_ms_state_ci.sType =
5770 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5771 pipe_ms_state_ci.pNext = NULL;
5772 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5773 pipe_ms_state_ci.sampleShadingEnable = 0;
5774 pipe_ms_state_ci.minSampleShading = 1.0;
5775 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005776
Tony Barboureb254902015-07-15 12:50:33 -06005777 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005778 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5779 pipeline_layout_ci.pNext = NULL;
5780 pipeline_layout_ci.setLayoutCount = 1;
5781 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005782
5783 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005784 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5785 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005786 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005787
Karl Schultz6addd812016-02-02 17:17:23 -07005788 VkShaderObj vs(m_device, bindStateVertShaderText,
5789 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06005790 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07005791 // on more devices
5792 VkShaderObj fs(m_device, bindStateFragShaderText,
5793 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005794
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005795 VkPipelineObj pipe(m_device);
5796 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005797 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005798 pipe.SetMSAA(&pipe_ms_state_ci);
5799 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005800
5801 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005802
Karl Schultz6addd812016-02-02 17:17:23 -07005803 // Main thing we care about for this test is that the VkImage obj we're
5804 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005805 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005806 VkClearAttachment color_attachment;
5807 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5808 color_attachment.clearValue.color.float32[0] = 1.0;
5809 color_attachment.clearValue.color.float32[1] = 1.0;
5810 color_attachment.clearValue.color.float32[2] = 1.0;
5811 color_attachment.clearValue.color.float32[3] = 1.0;
5812 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005813 VkClearRect clear_rect = {
5814 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005815
Karl Schultz6addd812016-02-02 17:17:23 -07005816 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5817 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005818
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005819 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005820
Chia-I Wuf7458c52015-10-26 21:10:41 +08005821 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5822 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5823 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005824}
5825
Karl Schultz6addd812016-02-02 17:17:23 -07005826TEST_F(VkLayerTest, VtxBufferBadIndex) {
5827 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005828
Karl Schultz6addd812016-02-02 17:17:23 -07005829 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005830 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07005831 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005832
Tobin Ehlis502480b2015-06-24 15:53:07 -06005833 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06005834 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06005835 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005836
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005837 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005838 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5839 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005840
5841 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005842 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5843 ds_pool_ci.pNext = NULL;
5844 ds_pool_ci.maxSets = 1;
5845 ds_pool_ci.poolSizeCount = 1;
5846 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005847
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005848 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005849 err =
5850 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005851 ASSERT_VK_SUCCESS(err);
5852
Tony Barboureb254902015-07-15 12:50:33 -06005853 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005854 dsl_binding.binding = 0;
5855 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5856 dsl_binding.descriptorCount = 1;
5857 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5858 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005859
Tony Barboureb254902015-07-15 12:50:33 -06005860 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005861 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5862 ds_layout_ci.pNext = NULL;
5863 ds_layout_ci.bindingCount = 1;
5864 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005865
Tobin Ehlis502480b2015-06-24 15:53:07 -06005866 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005867 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5868 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005869 ASSERT_VK_SUCCESS(err);
5870
5871 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005872 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005873 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005874 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005875 alloc_info.descriptorPool = ds_pool;
5876 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005877 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5878 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005879 ASSERT_VK_SUCCESS(err);
5880
Tony Barboureb254902015-07-15 12:50:33 -06005881 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005882 pipe_ms_state_ci.sType =
5883 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5884 pipe_ms_state_ci.pNext = NULL;
5885 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
5886 pipe_ms_state_ci.sampleShadingEnable = 0;
5887 pipe_ms_state_ci.minSampleShading = 1.0;
5888 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005889
Tony Barboureb254902015-07-15 12:50:33 -06005890 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005891 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5892 pipeline_layout_ci.pNext = NULL;
5893 pipeline_layout_ci.setLayoutCount = 1;
5894 pipeline_layout_ci.pSetLayouts = &ds_layout;
5895 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005896
Karl Schultz6addd812016-02-02 17:17:23 -07005897 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5898 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005899 ASSERT_VK_SUCCESS(err);
5900
Karl Schultz6addd812016-02-02 17:17:23 -07005901 VkShaderObj vs(m_device, bindStateVertShaderText,
5902 VK_SHADER_STAGE_VERTEX_BIT, this);
5903 VkShaderObj fs(m_device, bindStateFragShaderText,
5904 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005905 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005906 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005907 VkPipelineObj pipe(m_device);
5908 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005909 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005910 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005911 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005912 pipe.SetViewport(m_viewports);
5913 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005914 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005915
5916 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005917 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5918 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06005919 // Don't care about actual data, just need to get to draw to flag error
5920 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07005921 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
5922 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06005923 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06005924 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005925
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005926 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005927
Chia-I Wuf7458c52015-10-26 21:10:41 +08005928 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5929 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5930 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005931}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005932#endif // DRAW_STATE_TESTS
5933
Tobin Ehlis0788f522015-05-26 16:11:58 -06005934#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06005935#if GTEST_IS_THREADSAFE
5936struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005937 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005938 VkEvent event;
5939 bool bailout;
5940};
5941
Karl Schultz6addd812016-02-02 17:17:23 -07005942extern "C" void *AddToCommandBuffer(void *arg) {
5943 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005944
Karl Schultz6addd812016-02-02 17:17:23 -07005945 for (int i = 0; i < 10000; i++) {
5946 vkCmdSetEvent(data->commandBuffer, data->event,
5947 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005948 if (data->bailout) {
5949 break;
5950 }
5951 }
5952 return NULL;
5953}
5954
Karl Schultz6addd812016-02-02 17:17:23 -07005955TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005956 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005957
Karl Schultz6addd812016-02-02 17:17:23 -07005958 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5959 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005960
Mike Stroyanaccf7692015-05-12 16:00:45 -06005961 ASSERT_NO_FATAL_FAILURE(InitState());
5962 ASSERT_NO_FATAL_FAILURE(InitViewport());
5963 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5964
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005965 // Calls AllocateCommandBuffers
5966 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06005967
5968 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005969 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005970
5971 VkEventCreateInfo event_info;
5972 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005973 VkResult err;
5974
5975 memset(&event_info, 0, sizeof(event_info));
5976 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5977
Chia-I Wuf7458c52015-10-26 21:10:41 +08005978 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005979 ASSERT_VK_SUCCESS(err);
5980
Mike Stroyanaccf7692015-05-12 16:00:45 -06005981 err = vkResetEvent(device(), event);
5982 ASSERT_VK_SUCCESS(err);
5983
5984 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005985 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005986 data.event = event;
5987 data.bailout = false;
5988 m_errorMonitor->SetBailout(&data.bailout);
5989 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005990 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005991 // Add many entries to command buffer from this thread at the same time.
5992 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06005993
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005994 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005995 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005996
Mike Stroyan10b8cb72016-01-22 15:22:03 -07005997 m_errorMonitor->SetBailout(NULL);
5998
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005999 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006000
Chia-I Wuf7458c52015-10-26 21:10:41 +08006001 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006002}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006003#endif // GTEST_IS_THREADSAFE
6004#endif // THREADING_TESTS
6005
Chris Forbes9f7ff632015-05-25 11:13:08 +12006006#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006007TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006009 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006010
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006011 ASSERT_NO_FATAL_FAILURE(InitState());
6012 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6013
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006014 VkShaderModule module;
6015 VkShaderModuleCreateInfo moduleCreateInfo;
6016 struct icd_spv_header spv;
6017
6018 spv.magic = ICD_SPV_MAGIC;
6019 spv.version = ICD_SPV_VERSION;
6020 spv.gen_magic = 0;
6021
6022 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6023 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006024 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006025 moduleCreateInfo.codeSize = 4;
6026 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006027 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006028
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006029 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006030}
6031
Karl Schultz6addd812016-02-02 17:17:23 -07006032TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006033 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006034 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006035
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006036 ASSERT_NO_FATAL_FAILURE(InitState());
6037 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6038
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006039 VkShaderModule module;
6040 VkShaderModuleCreateInfo moduleCreateInfo;
6041 struct icd_spv_header spv;
6042
6043 spv.magic = ~ICD_SPV_MAGIC;
6044 spv.version = ICD_SPV_VERSION;
6045 spv.gen_magic = 0;
6046
6047 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6048 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006049 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006050 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6051 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006052 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006053
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006054 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006055}
6056
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006057#if 0
6058// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07006059TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006060 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006061 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006062
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006063 ASSERT_NO_FATAL_FAILURE(InitState());
6064 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6065
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006066 VkShaderModule module;
6067 VkShaderModuleCreateInfo moduleCreateInfo;
6068 struct icd_spv_header spv;
6069
6070 spv.magic = ICD_SPV_MAGIC;
6071 spv.version = ~ICD_SPV_VERSION;
6072 spv.gen_magic = 0;
6073
6074 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6075 moduleCreateInfo.pNext = NULL;
6076
Karl Schultz6addd812016-02-02 17:17:23 -07006077 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006078 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6079 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006080 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006081
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006082 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006083}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006084#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006085
Karl Schultz6addd812016-02-02 17:17:23 -07006086TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006087 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006088 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006089
Chris Forbes9f7ff632015-05-25 11:13:08 +12006090 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006091 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006092
6093 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006094 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006095 "\n"
6096 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006097 "out gl_PerVertex {\n"
6098 " vec4 gl_Position;\n"
6099 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006100 "void main(){\n"
6101 " gl_Position = vec4(1);\n"
6102 " x = 0;\n"
6103 "}\n";
6104 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006105 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006106 "\n"
6107 "layout(location=0) out vec4 color;\n"
6108 "void main(){\n"
6109 " color = vec4(1);\n"
6110 "}\n";
6111
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006112 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6113 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006114
6115 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006116 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006117 pipe.AddShader(&vs);
6118 pipe.AddShader(&fs);
6119
Chris Forbes9f7ff632015-05-25 11:13:08 +12006120 VkDescriptorSetObj descriptorSet(m_device);
6121 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006122 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006123
Tony Barbour5781e8f2015-08-04 16:23:11 -06006124 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006125
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006126 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006127}
Chris Forbes9f7ff632015-05-25 11:13:08 +12006128
Karl Schultz6addd812016-02-02 17:17:23 -07006129TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006131 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006132
Chris Forbes59cb88d2015-05-25 11:13:13 +12006133 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006134 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006135
6136 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006137 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006138 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006139 "out gl_PerVertex {\n"
6140 " vec4 gl_Position;\n"
6141 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006142 "void main(){\n"
6143 " gl_Position = vec4(1);\n"
6144 "}\n";
6145 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006146 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006147 "\n"
6148 "layout(location=0) in float x;\n"
6149 "layout(location=0) out vec4 color;\n"
6150 "void main(){\n"
6151 " color = vec4(x);\n"
6152 "}\n";
6153
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006154 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6155 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006156
6157 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006158 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006159 pipe.AddShader(&vs);
6160 pipe.AddShader(&fs);
6161
Chris Forbes59cb88d2015-05-25 11:13:13 +12006162 VkDescriptorSetObj descriptorSet(m_device);
6163 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006164 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006165
Tony Barbour5781e8f2015-08-04 16:23:11 -06006166 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006167
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006168 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006169}
6170
Karl Schultz6addd812016-02-02 17:17:23 -07006171TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006173 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006174
6175 ASSERT_NO_FATAL_FAILURE(InitState());
6176 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6177
6178 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006179 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006180 "\n"
6181 "out gl_PerVertex {\n"
6182 " vec4 gl_Position;\n"
6183 "};\n"
6184 "void main(){\n"
6185 " gl_Position = vec4(1);\n"
6186 "}\n";
6187 char const *fsSource =
6188 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006189 "\n"
6190 "in block { layout(location=0) float x; } ins;\n"
6191 "layout(location=0) out vec4 color;\n"
6192 "void main(){\n"
6193 " color = vec4(ins.x);\n"
6194 "}\n";
6195
6196 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6197 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6198
6199 VkPipelineObj pipe(m_device);
6200 pipe.AddColorAttachment();
6201 pipe.AddShader(&vs);
6202 pipe.AddShader(&fs);
6203
6204 VkDescriptorSetObj descriptorSet(m_device);
6205 descriptorSet.AppendDummy();
6206 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6207
6208 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6209
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006210 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006211}
6212
Karl Schultz6addd812016-02-02 17:17:23 -07006213TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13006214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13006215 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07006216 "output arr[2] of float32' vs 'ptr to "
6217 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13006218
6219 ASSERT_NO_FATAL_FAILURE(InitState());
6220 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6221
6222 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006223 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006224 "\n"
6225 "layout(location=0) out float x[2];\n"
6226 "out gl_PerVertex {\n"
6227 " vec4 gl_Position;\n"
6228 "};\n"
6229 "void main(){\n"
6230 " x[0] = 0; x[1] = 0;\n"
6231 " gl_Position = vec4(1);\n"
6232 "}\n";
6233 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006234 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006235 "\n"
6236 "layout(location=0) in float x[3];\n"
6237 "layout(location=0) out vec4 color;\n"
6238 "void main(){\n"
6239 " color = vec4(x[0] + x[1] + x[2]);\n"
6240 "}\n";
6241
6242 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6243 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6244
6245 VkPipelineObj pipe(m_device);
6246 pipe.AddColorAttachment();
6247 pipe.AddShader(&vs);
6248 pipe.AddShader(&fs);
6249
6250 VkDescriptorSetObj descriptorSet(m_device);
6251 descriptorSet.AppendDummy();
6252 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6253
6254 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6255
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006256 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13006257}
6258
Karl Schultz6addd812016-02-02 17:17:23 -07006259TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006261 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006262
Chris Forbesb56af562015-05-25 11:13:17 +12006263 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006264 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12006265
6266 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006267 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006268 "\n"
6269 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006270 "out gl_PerVertex {\n"
6271 " vec4 gl_Position;\n"
6272 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006273 "void main(){\n"
6274 " x = 0;\n"
6275 " gl_Position = vec4(1);\n"
6276 "}\n";
6277 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006278 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006279 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006280 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12006281 "layout(location=0) out vec4 color;\n"
6282 "void main(){\n"
6283 " color = vec4(x);\n"
6284 "}\n";
6285
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006286 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6287 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12006288
6289 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006290 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12006291 pipe.AddShader(&vs);
6292 pipe.AddShader(&fs);
6293
Chris Forbesb56af562015-05-25 11:13:17 +12006294 VkDescriptorSetObj descriptorSet(m_device);
6295 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006296 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12006297
Tony Barbour5781e8f2015-08-04 16:23:11 -06006298 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12006299
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006300 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12006301}
6302
Karl Schultz6addd812016-02-02 17:17:23 -07006303TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006305 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006306
6307 ASSERT_NO_FATAL_FAILURE(InitState());
6308 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6309
6310 char const *vsSource =
6311 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006312 "\n"
6313 "out block { layout(location=0) int x; } outs;\n"
6314 "out gl_PerVertex {\n"
6315 " vec4 gl_Position;\n"
6316 "};\n"
6317 "void main(){\n"
6318 " outs.x = 0;\n"
6319 " gl_Position = vec4(1);\n"
6320 "}\n";
6321 char const *fsSource =
6322 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006323 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006324 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13006325 "layout(location=0) out vec4 color;\n"
6326 "void main(){\n"
6327 " color = vec4(ins.x);\n"
6328 "}\n";
6329
6330 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6331 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6332
6333 VkPipelineObj pipe(m_device);
6334 pipe.AddColorAttachment();
6335 pipe.AddShader(&vs);
6336 pipe.AddShader(&fs);
6337
6338 VkDescriptorSetObj descriptorSet(m_device);
6339 descriptorSet.AppendDummy();
6340 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6341
6342 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6343
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006344 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006345}
6346
6347TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
6348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6349 "location 0.0 which is not written by vertex shader");
6350
6351 ASSERT_NO_FATAL_FAILURE(InitState());
6352 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6353
6354 char const *vsSource =
6355 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006356 "\n"
6357 "out block { layout(location=1) float x; } outs;\n"
6358 "out gl_PerVertex {\n"
6359 " vec4 gl_Position;\n"
6360 "};\n"
6361 "void main(){\n"
6362 " outs.x = 0;\n"
6363 " gl_Position = vec4(1);\n"
6364 "}\n";
6365 char const *fsSource =
6366 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006367 "\n"
6368 "in block { layout(location=0) float x; } ins;\n"
6369 "layout(location=0) out vec4 color;\n"
6370 "void main(){\n"
6371 " color = vec4(ins.x);\n"
6372 "}\n";
6373
6374 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6375 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6376
6377 VkPipelineObj pipe(m_device);
6378 pipe.AddColorAttachment();
6379 pipe.AddShader(&vs);
6380 pipe.AddShader(&fs);
6381
6382 VkDescriptorSetObj descriptorSet(m_device);
6383 descriptorSet.AppendDummy();
6384 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6385
6386 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6387
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006388 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006389}
6390
6391TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
6392 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6393 "location 0.1 which is not written by vertex shader");
6394
6395 ASSERT_NO_FATAL_FAILURE(InitState());
6396 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6397
6398 char const *vsSource =
6399 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006400 "\n"
6401 "out block { layout(location=0, component=0) float x; } outs;\n"
6402 "out gl_PerVertex {\n"
6403 " vec4 gl_Position;\n"
6404 "};\n"
6405 "void main(){\n"
6406 " outs.x = 0;\n"
6407 " gl_Position = vec4(1);\n"
6408 "}\n";
6409 char const *fsSource =
6410 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006411 "\n"
6412 "in block { layout(location=0, component=1) float x; } ins;\n"
6413 "layout(location=0) out vec4 color;\n"
6414 "void main(){\n"
6415 " color = vec4(ins.x);\n"
6416 "}\n";
6417
6418 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6419 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6420
6421 VkPipelineObj pipe(m_device);
6422 pipe.AddColorAttachment();
6423 pipe.AddShader(&vs);
6424 pipe.AddShader(&fs);
6425
6426 VkDescriptorSetObj descriptorSet(m_device);
6427 descriptorSet.AppendDummy();
6428 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6429
6430 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6431
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006432 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006433}
6434
Karl Schultz6addd812016-02-02 17:17:23 -07006435TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006436 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006437 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006438
Chris Forbesde136e02015-05-25 11:13:28 +12006439 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006440 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12006441
6442 VkVertexInputBindingDescription input_binding;
6443 memset(&input_binding, 0, sizeof(input_binding));
6444
6445 VkVertexInputAttributeDescription input_attrib;
6446 memset(&input_attrib, 0, sizeof(input_attrib));
6447 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6448
6449 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006450 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006451 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006452 "out gl_PerVertex {\n"
6453 " vec4 gl_Position;\n"
6454 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006455 "void main(){\n"
6456 " gl_Position = vec4(1);\n"
6457 "}\n";
6458 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006459 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006460 "\n"
6461 "layout(location=0) out vec4 color;\n"
6462 "void main(){\n"
6463 " color = vec4(1);\n"
6464 "}\n";
6465
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006466 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6467 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12006468
6469 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006470 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12006471 pipe.AddShader(&vs);
6472 pipe.AddShader(&fs);
6473
6474 pipe.AddVertexInputBindings(&input_binding, 1);
6475 pipe.AddVertexInputAttribs(&input_attrib, 1);
6476
Chris Forbesde136e02015-05-25 11:13:28 +12006477 VkDescriptorSetObj descriptorSet(m_device);
6478 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006479 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12006480
Tony Barbour5781e8f2015-08-04 16:23:11 -06006481 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12006482
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006483 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12006484}
6485
Karl Schultz6addd812016-02-02 17:17:23 -07006486TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006487 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006488 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13006489
6490 ASSERT_NO_FATAL_FAILURE(InitState());
6491 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6492
6493 VkVertexInputBindingDescription input_binding;
6494 memset(&input_binding, 0, sizeof(input_binding));
6495
6496 VkVertexInputAttributeDescription input_attrib;
6497 memset(&input_attrib, 0, sizeof(input_attrib));
6498 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6499
6500 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006501 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006502 "\n"
6503 "layout(location=1) in float x;\n"
6504 "out gl_PerVertex {\n"
6505 " vec4 gl_Position;\n"
6506 "};\n"
6507 "void main(){\n"
6508 " gl_Position = vec4(x);\n"
6509 "}\n";
6510 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006511 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006512 "\n"
6513 "layout(location=0) out vec4 color;\n"
6514 "void main(){\n"
6515 " color = vec4(1);\n"
6516 "}\n";
6517
6518 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6519 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6520
6521 VkPipelineObj pipe(m_device);
6522 pipe.AddColorAttachment();
6523 pipe.AddShader(&vs);
6524 pipe.AddShader(&fs);
6525
6526 pipe.AddVertexInputBindings(&input_binding, 1);
6527 pipe.AddVertexInputAttribs(&input_attrib, 1);
6528
6529 VkDescriptorSetObj descriptorSet(m_device);
6530 descriptorSet.AppendDummy();
6531 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6532
6533 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6534
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006535 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13006536}
6537
Karl Schultz6addd812016-02-02 17:17:23 -07006538TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
6539 m_errorMonitor->SetDesiredFailureMsg(
6540 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006541 "VS consumes input at location 0 but not provided");
6542
Chris Forbes62e8e502015-05-25 11:13:29 +12006543 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006544 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12006545
6546 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006547 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006548 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006549 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07006550 "out gl_PerVertex {\n"
6551 " vec4 gl_Position;\n"
6552 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006553 "void main(){\n"
6554 " gl_Position = x;\n"
6555 "}\n";
6556 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006557 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006558 "\n"
6559 "layout(location=0) out vec4 color;\n"
6560 "void main(){\n"
6561 " color = vec4(1);\n"
6562 "}\n";
6563
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006564 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6565 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12006566
6567 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006568 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12006569 pipe.AddShader(&vs);
6570 pipe.AddShader(&fs);
6571
Chris Forbes62e8e502015-05-25 11:13:29 +12006572 VkDescriptorSetObj descriptorSet(m_device);
6573 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006574 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12006575
Tony Barbour5781e8f2015-08-04 16:23:11 -06006576 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12006577
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006578 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12006579}
6580
Karl Schultz6addd812016-02-02 17:17:23 -07006581TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
6582 m_errorMonitor->SetDesiredFailureMsg(
6583 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006584 "location 0 does not match VS input type");
6585
Chris Forbesc97d98e2015-05-25 11:13:31 +12006586 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006587 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006588
6589 VkVertexInputBindingDescription input_binding;
6590 memset(&input_binding, 0, sizeof(input_binding));
6591
6592 VkVertexInputAttributeDescription input_attrib;
6593 memset(&input_attrib, 0, sizeof(input_attrib));
6594 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6595
6596 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006597 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006598 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006599 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006600 "out gl_PerVertex {\n"
6601 " vec4 gl_Position;\n"
6602 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006603 "void main(){\n"
6604 " gl_Position = vec4(x);\n"
6605 "}\n";
6606 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006607 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006608 "\n"
6609 "layout(location=0) out vec4 color;\n"
6610 "void main(){\n"
6611 " color = vec4(1);\n"
6612 "}\n";
6613
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006614 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6615 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006616
6617 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006618 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006619 pipe.AddShader(&vs);
6620 pipe.AddShader(&fs);
6621
6622 pipe.AddVertexInputBindings(&input_binding, 1);
6623 pipe.AddVertexInputAttribs(&input_attrib, 1);
6624
Chris Forbesc97d98e2015-05-25 11:13:31 +12006625 VkDescriptorSetObj descriptorSet(m_device);
6626 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006627 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006628
Tony Barbour5781e8f2015-08-04 16:23:11 -06006629 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006630
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006631 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006632}
6633
Chris Forbesc68b43c2016-04-06 11:18:47 +12006634TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
6635 m_errorMonitor->SetDesiredFailureMsg(
6636 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6637 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
6638
6639 ASSERT_NO_FATAL_FAILURE(InitState());
6640 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6641
6642 char const *vsSource =
6643 "#version 450\n"
6644 "\n"
6645 "out gl_PerVertex {\n"
6646 " vec4 gl_Position;\n"
6647 "};\n"
6648 "void main(){\n"
6649 " gl_Position = vec4(1);\n"
6650 "}\n";
6651 char const *fsSource =
6652 "#version 450\n"
6653 "\n"
6654 "layout(location=0) out vec4 color;\n"
6655 "void main(){\n"
6656 " color = vec4(1);\n"
6657 "}\n";
6658
6659 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6660 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6661
6662 VkPipelineObj pipe(m_device);
6663 pipe.AddColorAttachment();
6664 pipe.AddShader(&vs);
6665 pipe.AddShader(&vs);
6666 pipe.AddShader(&fs);
6667
6668 VkDescriptorSetObj descriptorSet(m_device);
6669 descriptorSet.AppendDummy();
6670 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6671
6672 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6673
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006674 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12006675}
6676
Karl Schultz6addd812016-02-02 17:17:23 -07006677TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006678 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006679
6680 ASSERT_NO_FATAL_FAILURE(InitState());
6681 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6682
6683 VkVertexInputBindingDescription input_binding;
6684 memset(&input_binding, 0, sizeof(input_binding));
6685
6686 VkVertexInputAttributeDescription input_attribs[2];
6687 memset(input_attribs, 0, sizeof(input_attribs));
6688
6689 for (int i = 0; i < 2; i++) {
6690 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6691 input_attribs[i].location = i;
6692 }
6693
6694 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006695 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006696 "\n"
6697 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006698 "out gl_PerVertex {\n"
6699 " vec4 gl_Position;\n"
6700 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006701 "void main(){\n"
6702 " gl_Position = x[0] + x[1];\n"
6703 "}\n";
6704 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006705 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006706 "\n"
6707 "layout(location=0) out vec4 color;\n"
6708 "void main(){\n"
6709 " color = vec4(1);\n"
6710 "}\n";
6711
6712 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6713 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6714
6715 VkPipelineObj pipe(m_device);
6716 pipe.AddColorAttachment();
6717 pipe.AddShader(&vs);
6718 pipe.AddShader(&fs);
6719
6720 pipe.AddVertexInputBindings(&input_binding, 1);
6721 pipe.AddVertexInputAttribs(input_attribs, 2);
6722
6723 VkDescriptorSetObj descriptorSet(m_device);
6724 descriptorSet.AppendDummy();
6725 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6726
6727 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6728
6729 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006730 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006731}
6732
Chris Forbes2682b242015-11-24 11:13:14 +13006733TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
6734{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006735 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006736
6737 ASSERT_NO_FATAL_FAILURE(InitState());
6738 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6739
6740 VkVertexInputBindingDescription input_binding;
6741 memset(&input_binding, 0, sizeof(input_binding));
6742
6743 VkVertexInputAttributeDescription input_attribs[2];
6744 memset(input_attribs, 0, sizeof(input_attribs));
6745
6746 for (int i = 0; i < 2; i++) {
6747 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6748 input_attribs[i].location = i;
6749 }
6750
6751 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006752 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006753 "\n"
6754 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07006755 "out gl_PerVertex {\n"
6756 " vec4 gl_Position;\n"
6757 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006758 "void main(){\n"
6759 " gl_Position = x[0] + x[1];\n"
6760 "}\n";
6761 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006762 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006763 "\n"
6764 "layout(location=0) out vec4 color;\n"
6765 "void main(){\n"
6766 " color = vec4(1);\n"
6767 "}\n";
6768
6769 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6770 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6771
6772 VkPipelineObj pipe(m_device);
6773 pipe.AddColorAttachment();
6774 pipe.AddShader(&vs);
6775 pipe.AddShader(&fs);
6776
6777 pipe.AddVertexInputBindings(&input_binding, 1);
6778 pipe.AddVertexInputAttribs(input_attribs, 2);
6779
6780 VkDescriptorSetObj descriptorSet(m_device);
6781 descriptorSet.AppendDummy();
6782 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6783
6784 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6785
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006786 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006787}
Chris Forbes2682b242015-11-24 11:13:14 +13006788
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006789TEST_F(VkLayerTest, CreatePipelineSimplePositive)
6790{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006791 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006792
6793 ASSERT_NO_FATAL_FAILURE(InitState());
6794 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6795
6796 char const *vsSource =
6797 "#version 450\n"
6798 "out gl_PerVertex {\n"
6799 " vec4 gl_Position;\n"
6800 "};\n"
6801 "void main(){\n"
6802 " gl_Position = vec4(0);\n"
6803 "}\n";
6804 char const *fsSource =
6805 "#version 450\n"
6806 "\n"
6807 "layout(location=0) out vec4 color;\n"
6808 "void main(){\n"
6809 " color = vec4(1);\n"
6810 "}\n";
6811
6812 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6813 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6814
6815 VkPipelineObj pipe(m_device);
6816 pipe.AddColorAttachment();
6817 pipe.AddShader(&vs);
6818 pipe.AddShader(&fs);
6819
6820 VkDescriptorSetObj descriptorSet(m_device);
6821 descriptorSet.AppendDummy();
6822 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6823
6824 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6825
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006826 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006827}
6828
Chris Forbes912c9192016-04-05 17:50:35 +12006829TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
6830{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006831 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12006832
6833 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
6834
6835 ASSERT_NO_FATAL_FAILURE(InitState());
6836 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6837
6838 char const *vsSource =
6839 "#version 450\n"
6840 "out gl_PerVertex {\n"
6841 " vec4 gl_Position;\n"
6842 "};\n"
6843 "layout(location=0) out vec3 x;\n"
6844 "layout(location=1) out ivec3 y;\n"
6845 "layout(location=2) out vec3 z;\n"
6846 "void main(){\n"
6847 " gl_Position = vec4(0);\n"
6848 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
6849 "}\n";
6850 char const *fsSource =
6851 "#version 450\n"
6852 "\n"
6853 "layout(location=0) out vec4 color;\n"
6854 "layout(location=0) in float x;\n"
6855 "layout(location=1) flat in int y;\n"
6856 "layout(location=2) in vec2 z;\n"
6857 "void main(){\n"
6858 " color = vec4(1 + x + y + z.x);\n"
6859 "}\n";
6860
6861 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6862 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6863
6864 VkPipelineObj pipe(m_device);
6865 pipe.AddColorAttachment();
6866 pipe.AddShader(&vs);
6867 pipe.AddShader(&fs);
6868
6869 VkDescriptorSetObj descriptorSet(m_device);
6870 descriptorSet.AppendDummy();
6871 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6872
6873 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6874
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006875 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12006876}
6877
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006878TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
6879{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006880 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006881
6882 ASSERT_NO_FATAL_FAILURE(InitState());
6883 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6884
Chris Forbesc1e852d2016-04-04 19:26:42 +12006885 if (!m_device->phy().features().tessellationShader) {
6886 printf("Device does not support tessellation shaders; skipped.\n");
6887 return;
6888 }
6889
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006890 char const *vsSource =
6891 "#version 450\n"
6892 "void main(){}\n";
6893 char const *tcsSource =
6894 "#version 450\n"
6895 "layout(location=0) out int x[];\n"
6896 "layout(vertices=3) out;\n"
6897 "void main(){\n"
6898 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
6899 " gl_TessLevelInner[0] = 1;\n"
6900 " x[gl_InvocationID] = gl_InvocationID;\n"
6901 "}\n";
6902 char const *tesSource =
6903 "#version 450\n"
6904 "layout(triangles, equal_spacing, cw) in;\n"
6905 "layout(location=0) in int x[];\n"
6906 "out gl_PerVertex { vec4 gl_Position; };\n"
6907 "void main(){\n"
6908 " gl_Position.xyz = gl_TessCoord;\n"
6909 " gl_Position.w = x[0] + x[1] + x[2];\n"
6910 "}\n";
6911 char const *fsSource =
6912 "#version 450\n"
6913 "layout(location=0) out vec4 color;\n"
6914 "void main(){\n"
6915 " color = vec4(1);\n"
6916 "}\n";
6917
6918 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6919 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
6920 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
6921 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6922
6923 VkPipelineInputAssemblyStateCreateInfo iasci{
6924 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
6925 nullptr,
6926 0,
6927 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
6928 VK_FALSE};
6929
Chris Forbesb4cacb62016-04-04 19:15:00 +12006930 VkPipelineTessellationStateCreateInfo tsci{
6931 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
6932 nullptr,
6933 0,
6934 3};
6935
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006936 VkPipelineObj pipe(m_device);
6937 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12006938 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006939 pipe.AddColorAttachment();
6940 pipe.AddShader(&vs);
6941 pipe.AddShader(&tcs);
6942 pipe.AddShader(&tes);
6943 pipe.AddShader(&fs);
6944
6945 VkDescriptorSetObj descriptorSet(m_device);
6946 descriptorSet.AppendDummy();
6947 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6948
6949 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6950
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006951 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006952}
6953
Chris Forbesa0ab8152016-04-20 13:34:27 +12006954TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
6955{
6956 m_errorMonitor->ExpectSuccess();
6957
6958 ASSERT_NO_FATAL_FAILURE(InitState());
6959 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6960
6961 if (!m_device->phy().features().geometryShader) {
6962 printf("Device does not support geometry shaders; skipped.\n");
6963 return;
6964 }
6965
6966 char const *vsSource =
6967 "#version 450\n"
6968 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
6969 "void main(){\n"
6970 " vs_out.x = vec4(1);\n"
6971 "}\n";
6972 char const *gsSource =
6973 "#version 450\n"
6974 "layout(triangles) in;\n"
6975 "layout(triangle_strip, max_vertices=3) out;\n"
6976 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
6977 "out gl_PerVertex { vec4 gl_Position; };\n"
6978 "void main() {\n"
6979 " gl_Position = gs_in[0].x;\n"
6980 " EmitVertex();\n"
6981 "}\n";
6982 char const *fsSource =
6983 "#version 450\n"
6984 "layout(location=0) out vec4 color;\n"
6985 "void main(){\n"
6986 " color = vec4(1);\n"
6987 "}\n";
6988
6989 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6990 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
6991 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6992
6993 VkPipelineObj pipe(m_device);
6994 pipe.AddColorAttachment();
6995 pipe.AddShader(&vs);
6996 pipe.AddShader(&gs);
6997 pipe.AddShader(&fs);
6998
6999 VkDescriptorSetObj descriptorSet(m_device);
7000 descriptorSet.AppendDummy();
7001 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7002
7003 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7004
7005 m_errorMonitor->VerifyNotFound();
7006}
7007
Chris Forbesa0193bc2016-04-04 19:19:47 +12007008TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
7009{
7010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7011 "is per-vertex in tessellation control shader stage "
7012 "but per-patch in tessellation evaluation shader stage");
7013
7014 ASSERT_NO_FATAL_FAILURE(InitState());
7015 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7016
Chris Forbesc1e852d2016-04-04 19:26:42 +12007017 if (!m_device->phy().features().tessellationShader) {
7018 printf("Device does not support tessellation shaders; skipped.\n");
7019 return;
7020 }
7021
Chris Forbesa0193bc2016-04-04 19:19:47 +12007022 char const *vsSource =
7023 "#version 450\n"
7024 "void main(){}\n";
7025 char const *tcsSource =
7026 "#version 450\n"
7027 "layout(location=0) out int x[];\n"
7028 "layout(vertices=3) out;\n"
7029 "void main(){\n"
7030 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7031 " gl_TessLevelInner[0] = 1;\n"
7032 " x[gl_InvocationID] = gl_InvocationID;\n"
7033 "}\n";
7034 char const *tesSource =
7035 "#version 450\n"
7036 "layout(triangles, equal_spacing, cw) in;\n"
7037 "layout(location=0) patch in int x;\n"
7038 "out gl_PerVertex { vec4 gl_Position; };\n"
7039 "void main(){\n"
7040 " gl_Position.xyz = gl_TessCoord;\n"
7041 " gl_Position.w = x;\n"
7042 "}\n";
7043 char const *fsSource =
7044 "#version 450\n"
7045 "layout(location=0) out vec4 color;\n"
7046 "void main(){\n"
7047 " color = vec4(1);\n"
7048 "}\n";
7049
7050 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7051 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7052 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7053 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7054
7055 VkPipelineInputAssemblyStateCreateInfo iasci{
7056 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7057 nullptr,
7058 0,
7059 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7060 VK_FALSE};
7061
7062 VkPipelineTessellationStateCreateInfo tsci{
7063 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7064 nullptr,
7065 0,
7066 3};
7067
7068 VkPipelineObj pipe(m_device);
7069 pipe.SetInputAssembly(&iasci);
7070 pipe.SetTessellation(&tsci);
7071 pipe.AddColorAttachment();
7072 pipe.AddShader(&vs);
7073 pipe.AddShader(&tcs);
7074 pipe.AddShader(&tes);
7075 pipe.AddShader(&fs);
7076
7077 VkDescriptorSetObj descriptorSet(m_device);
7078 descriptorSet.AppendDummy();
7079 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7080
7081 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7082
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007083 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12007084}
7085
Karl Schultz6addd812016-02-02 17:17:23 -07007086TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
7087 m_errorMonitor->SetDesiredFailureMsg(
7088 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007089 "Duplicate vertex input binding descriptions for binding 0");
7090
Chris Forbes280ba2c2015-06-12 11:16:41 +12007091 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007092 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007093
7094 /* Two binding descriptions for binding 0 */
7095 VkVertexInputBindingDescription input_bindings[2];
7096 memset(input_bindings, 0, sizeof(input_bindings));
7097
7098 VkVertexInputAttributeDescription input_attrib;
7099 memset(&input_attrib, 0, sizeof(input_attrib));
7100 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7101
7102 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007103 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007104 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007105 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007106 "out gl_PerVertex {\n"
7107 " vec4 gl_Position;\n"
7108 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007109 "void main(){\n"
7110 " gl_Position = vec4(x);\n"
7111 "}\n";
7112 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007113 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007114 "\n"
7115 "layout(location=0) out vec4 color;\n"
7116 "void main(){\n"
7117 " color = vec4(1);\n"
7118 "}\n";
7119
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007120 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7121 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007122
7123 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007124 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007125 pipe.AddShader(&vs);
7126 pipe.AddShader(&fs);
7127
7128 pipe.AddVertexInputBindings(input_bindings, 2);
7129 pipe.AddVertexInputAttribs(&input_attrib, 1);
7130
Chris Forbes280ba2c2015-06-12 11:16:41 +12007131 VkDescriptorSetObj descriptorSet(m_device);
7132 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007133 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007134
Tony Barbour5781e8f2015-08-04 16:23:11 -06007135 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007136
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007137 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007138}
Chris Forbes8f68b562015-05-25 11:13:32 +12007139
Chris Forbes35efec72016-04-21 14:32:08 +12007140TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
7141 m_errorMonitor->ExpectSuccess();
7142
7143 ASSERT_NO_FATAL_FAILURE(InitState());
7144 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7145
7146 if (!m_device->phy().features().tessellationShader) {
7147 printf("Device does not support 64bit vertex attributes; skipped.\n");
7148 return;
7149 }
7150
7151 VkVertexInputBindingDescription input_bindings[1];
7152 memset(input_bindings, 0, sizeof(input_bindings));
7153
7154 VkVertexInputAttributeDescription input_attribs[4];
7155 memset(input_attribs, 0, sizeof(input_attribs));
7156 input_attribs[0].location = 0;
7157 input_attribs[0].offset = 0;
7158 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7159 input_attribs[1].location = 2;
7160 input_attribs[1].offset = 32;
7161 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7162 input_attribs[2].location = 4;
7163 input_attribs[2].offset = 64;
7164 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7165 input_attribs[3].location = 6;
7166 input_attribs[3].offset = 96;
7167 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7168
7169 char const *vsSource =
7170 "#version 450\n"
7171 "\n"
7172 "layout(location=0) in dmat4 x;\n"
7173 "out gl_PerVertex {\n"
7174 " vec4 gl_Position;\n"
7175 "};\n"
7176 "void main(){\n"
7177 " gl_Position = vec4(x[0][0]);\n"
7178 "}\n";
7179 char const *fsSource =
7180 "#version 450\n"
7181 "\n"
7182 "layout(location=0) out vec4 color;\n"
7183 "void main(){\n"
7184 " color = vec4(1);\n"
7185 "}\n";
7186
7187 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7188 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7189
7190 VkPipelineObj pipe(m_device);
7191 pipe.AddColorAttachment();
7192 pipe.AddShader(&vs);
7193 pipe.AddShader(&fs);
7194
7195 pipe.AddVertexInputBindings(input_bindings, 1);
7196 pipe.AddVertexInputAttribs(input_attribs, 4);
7197
7198 VkDescriptorSetObj descriptorSet(m_device);
7199 descriptorSet.AppendDummy();
7200 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7201
7202 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7203
7204 m_errorMonitor->VerifyNotFound();
7205}
7206
Karl Schultz6addd812016-02-02 17:17:23 -07007207TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007208 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007209 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007210
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007211 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007212
7213 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007214 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007215 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007216 "out gl_PerVertex {\n"
7217 " vec4 gl_Position;\n"
7218 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007219 "void main(){\n"
7220 " gl_Position = vec4(1);\n"
7221 "}\n";
7222 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007223 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007224 "\n"
7225 "void main(){\n"
7226 "}\n";
7227
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007228 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7229 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007230
7231 VkPipelineObj pipe(m_device);
7232 pipe.AddShader(&vs);
7233 pipe.AddShader(&fs);
7234
Chia-I Wu08accc62015-07-07 11:50:03 +08007235 /* set up CB 0, not written */
7236 pipe.AddColorAttachment();
7237 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007238
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007239 VkDescriptorSetObj descriptorSet(m_device);
7240 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007241 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007242
Tony Barbour5781e8f2015-08-04 16:23:11 -06007243 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007244
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007245 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007246}
7247
Karl Schultz6addd812016-02-02 17:17:23 -07007248TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07007249 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007250 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007251 "FS writes to output location 1 with no matching attachment");
7252
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007253 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007254
7255 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007256 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007257 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007258 "out gl_PerVertex {\n"
7259 " vec4 gl_Position;\n"
7260 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007261 "void main(){\n"
7262 " gl_Position = vec4(1);\n"
7263 "}\n";
7264 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007265 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007266 "\n"
7267 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007268 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007269 "void main(){\n"
7270 " x = vec4(1);\n"
7271 " y = vec4(1);\n"
7272 "}\n";
7273
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007274 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7275 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007276
7277 VkPipelineObj pipe(m_device);
7278 pipe.AddShader(&vs);
7279 pipe.AddShader(&fs);
7280
Chia-I Wu08accc62015-07-07 11:50:03 +08007281 /* set up CB 0, not written */
7282 pipe.AddColorAttachment();
7283 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007284 /* FS writes CB 1, but we don't configure it */
7285
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007286 VkDescriptorSetObj descriptorSet(m_device);
7287 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007288 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007289
Tony Barbour5781e8f2015-08-04 16:23:11 -06007290 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007291
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007292 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007293}
7294
Karl Schultz6addd812016-02-02 17:17:23 -07007295TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007296 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007297 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007298
Chris Forbesa36d69e2015-05-25 11:13:44 +12007299 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007300
7301 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007302 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007303 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007304 "out gl_PerVertex {\n"
7305 " vec4 gl_Position;\n"
7306 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007307 "void main(){\n"
7308 " gl_Position = vec4(1);\n"
7309 "}\n";
7310 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007311 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007312 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007313 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12007314 "void main(){\n"
7315 " x = ivec4(1);\n"
7316 "}\n";
7317
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007318 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7319 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007320
7321 VkPipelineObj pipe(m_device);
7322 pipe.AddShader(&vs);
7323 pipe.AddShader(&fs);
7324
Chia-I Wu08accc62015-07-07 11:50:03 +08007325 /* set up CB 0; type is UNORM by default */
7326 pipe.AddColorAttachment();
7327 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007328
Chris Forbesa36d69e2015-05-25 11:13:44 +12007329 VkDescriptorSetObj descriptorSet(m_device);
7330 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007331 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007332
Tony Barbour5781e8f2015-08-04 16:23:11 -06007333 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007334
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007335 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12007336}
Chris Forbes7b1b8932015-06-05 14:43:36 +12007337
Karl Schultz6addd812016-02-02 17:17:23 -07007338TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
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 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007341
Chris Forbes556c76c2015-08-14 12:04:59 +12007342 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12007343
7344 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007345 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007346 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007347 "out gl_PerVertex {\n"
7348 " vec4 gl_Position;\n"
7349 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007350 "void main(){\n"
7351 " gl_Position = vec4(1);\n"
7352 "}\n";
7353 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007354 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007355 "\n"
7356 "layout(location=0) out vec4 x;\n"
7357 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7358 "void main(){\n"
7359 " x = vec4(bar.y);\n"
7360 "}\n";
7361
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007362 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7363 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12007364
Chris Forbes556c76c2015-08-14 12:04:59 +12007365 VkPipelineObj pipe(m_device);
7366 pipe.AddShader(&vs);
7367 pipe.AddShader(&fs);
7368
7369 /* set up CB 0; type is UNORM by default */
7370 pipe.AddColorAttachment();
7371 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7372
7373 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007374 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12007375
7376 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7377
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007378 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12007379}
7380
Chris Forbes5c59e902016-02-26 16:56:09 +13007381TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
7382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7383 "not declared in layout");
7384
7385 ASSERT_NO_FATAL_FAILURE(InitState());
7386
7387 char const *vsSource =
7388 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007389 "\n"
7390 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
7391 "out gl_PerVertex {\n"
7392 " vec4 gl_Position;\n"
7393 "};\n"
7394 "void main(){\n"
7395 " gl_Position = vec4(consts.x);\n"
7396 "}\n";
7397 char const *fsSource =
7398 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007399 "\n"
7400 "layout(location=0) out vec4 x;\n"
7401 "void main(){\n"
7402 " x = vec4(1);\n"
7403 "}\n";
7404
7405 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7406 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7407
7408 VkPipelineObj pipe(m_device);
7409 pipe.AddShader(&vs);
7410 pipe.AddShader(&fs);
7411
7412 /* set up CB 0; type is UNORM by default */
7413 pipe.AddColorAttachment();
7414 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7415
7416 VkDescriptorSetObj descriptorSet(m_device);
7417 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7418
7419 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7420
7421 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007422 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13007423}
7424
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007425#endif // SHADER_CHECKER_TESTS
7426
7427#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06007428TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07007429 m_errorMonitor->SetDesiredFailureMsg(
7430 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007431 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007432
7433 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007434
7435 // Create an image
7436 VkImage image;
7437
Karl Schultz6addd812016-02-02 17:17:23 -07007438 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7439 const int32_t tex_width = 32;
7440 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007441
7442 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007443 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7444 image_create_info.pNext = NULL;
7445 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7446 image_create_info.format = tex_format;
7447 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007448 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07007449 image_create_info.extent.depth = 1;
7450 image_create_info.mipLevels = 1;
7451 image_create_info.arrayLayers = 1;
7452 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7453 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7454 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7455 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007456
7457 // Introduce error by sending down a bogus width extent
7458 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007459 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007460
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007461 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007462}
7463
Mark Youngc48c4c12016-04-11 14:26:49 -06007464TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
7465 m_errorMonitor->SetDesiredFailureMsg(
7466 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7467 "CreateImage extents is 0 for at least one required dimension");
7468
7469 ASSERT_NO_FATAL_FAILURE(InitState());
7470
7471 // Create an image
7472 VkImage image;
7473
7474 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7475 const int32_t tex_width = 32;
7476 const int32_t tex_height = 32;
7477
7478 VkImageCreateInfo image_create_info = {};
7479 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7480 image_create_info.pNext = NULL;
7481 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7482 image_create_info.format = tex_format;
7483 image_create_info.extent.width = tex_width;
7484 image_create_info.extent.height = tex_height;
7485 image_create_info.extent.depth = 1;
7486 image_create_info.mipLevels = 1;
7487 image_create_info.arrayLayers = 1;
7488 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7489 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7490 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7491 image_create_info.flags = 0;
7492
7493 // Introduce error by sending down a bogus width extent
7494 image_create_info.extent.width = 0;
7495 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7496
7497 m_errorMonitor->VerifyFound();
7498}
7499
Karl Schultz6addd812016-02-02 17:17:23 -07007500TEST_F(VkLayerTest, UpdateBufferAlignment) {
7501 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06007502
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007504 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007505
Mike Stroyana3082432015-09-25 13:39:21 -06007506 ASSERT_NO_FATAL_FAILURE(InitState());
7507
7508 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7509 vk_testing::Buffer buffer;
7510 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7511
7512 BeginCommandBuffer();
7513 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007514 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007515 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007516
Mike Stroyana3082432015-09-25 13:39:21 -06007517 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007518 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007519 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007520
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007521 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007522 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007523 EndCommandBuffer();
7524}
7525
Karl Schultz6addd812016-02-02 17:17:23 -07007526TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007528 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06007529
7530 ASSERT_NO_FATAL_FAILURE(InitState());
7531
7532 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7533 vk_testing::Buffer buffer;
7534 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7535
7536 BeginCommandBuffer();
7537 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007538 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007539 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007540
Mike Stroyana3082432015-09-25 13:39:21 -06007541 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007543 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007544
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007545 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007546
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007547 m_errorMonitor->VerifyFound();
7548
Mike Stroyana3082432015-09-25 13:39:21 -06007549 EndCommandBuffer();
7550}
7551
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007552#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12007553
Tobin Ehliscde08892015-09-22 10:11:37 -06007554#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007555TEST_F(VkLayerTest, InvalidImageView) {
7556 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06007557
Karl Schultz6addd812016-02-02 17:17:23 -07007558 m_errorMonitor->SetDesiredFailureMsg(
7559 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007560 "vkCreateImageView called with baseMipLevel 10 ");
7561
Tobin Ehliscde08892015-09-22 10:11:37 -06007562 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06007563
Mike Stroyana3082432015-09-25 13:39:21 -06007564 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07007565 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06007566
Karl Schultz6addd812016-02-02 17:17:23 -07007567 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7568 const int32_t tex_width = 32;
7569 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06007570
7571 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007572 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7573 image_create_info.pNext = NULL;
7574 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7575 image_create_info.format = tex_format;
7576 image_create_info.extent.width = tex_width;
7577 image_create_info.extent.height = tex_height;
7578 image_create_info.extent.depth = 1;
7579 image_create_info.mipLevels = 1;
7580 image_create_info.arrayLayers = 1;
7581 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7582 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7583 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7584 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06007585
Chia-I Wuf7458c52015-10-26 21:10:41 +08007586 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06007587 ASSERT_VK_SUCCESS(err);
7588
7589 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007590 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7591 image_view_create_info.image = image;
7592 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7593 image_view_create_info.format = tex_format;
7594 image_view_create_info.subresourceRange.layerCount = 1;
7595 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
7596 image_view_create_info.subresourceRange.levelCount = 1;
7597 image_view_create_info.subresourceRange.aspectMask =
7598 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06007599
7600 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007601 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7602 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06007603
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007604 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06007605}
Mike Stroyana3082432015-09-25 13:39:21 -06007606
Karl Schultz6addd812016-02-02 17:17:23 -07007607TEST_F(VkLayerTest, InvalidImageViewAspect) {
7608 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007609
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007610 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007611 "vkCreateImageView: Color image "
7612 "formats must have ONLY the "
7613 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007614
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007615 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007616
7617 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07007618 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007619
Karl Schultz6addd812016-02-02 17:17:23 -07007620 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7621 const int32_t tex_width = 32;
7622 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007623
7624 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007625 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7626 image_create_info.pNext = NULL;
7627 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7628 image_create_info.format = tex_format;
7629 image_create_info.extent.width = tex_width;
7630 image_create_info.extent.height = tex_height;
7631 image_create_info.extent.depth = 1;
7632 image_create_info.mipLevels = 1;
7633 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7634 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7635 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7636 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007637
Chia-I Wuf7458c52015-10-26 21:10:41 +08007638 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007639 ASSERT_VK_SUCCESS(err);
7640
7641 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007642 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7643 image_view_create_info.image = image;
7644 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7645 image_view_create_info.format = tex_format;
7646 image_view_create_info.subresourceRange.baseMipLevel = 0;
7647 image_view_create_info.subresourceRange.levelCount = 1;
7648 // Cause an error by setting an invalid image aspect
7649 image_view_create_info.subresourceRange.aspectMask =
7650 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007651
7652 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007653 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7654 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007655
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007656 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007657}
7658
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007659TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07007660 VkResult err;
7661 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007662
Karl Schultz6addd812016-02-02 17:17:23 -07007663 m_errorMonitor->SetDesiredFailureMsg(
7664 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007665 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007666
Mike Stroyana3082432015-09-25 13:39:21 -06007667 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007668
7669 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007670 VkImage srcImage;
7671 VkImage dstImage;
7672 VkDeviceMemory srcMem;
7673 VkDeviceMemory destMem;
7674 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007675
7676 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007677 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7678 image_create_info.pNext = NULL;
7679 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7680 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7681 image_create_info.extent.width = 32;
7682 image_create_info.extent.height = 32;
7683 image_create_info.extent.depth = 1;
7684 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007685 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07007686 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7687 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7688 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7689 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007690
Karl Schultz6addd812016-02-02 17:17:23 -07007691 err =
7692 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007693 ASSERT_VK_SUCCESS(err);
7694
Karl Schultz6addd812016-02-02 17:17:23 -07007695 err =
7696 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007697 ASSERT_VK_SUCCESS(err);
7698
7699 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007700 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007701 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7702 memAlloc.pNext = NULL;
7703 memAlloc.allocationSize = 0;
7704 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007705
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007706 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007707 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007708 pass =
7709 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007710 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007711 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007712 ASSERT_VK_SUCCESS(err);
7713
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007714 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007715 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007716 pass =
7717 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007718 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007719 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007720 ASSERT_VK_SUCCESS(err);
7721
7722 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7723 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007724 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007725 ASSERT_VK_SUCCESS(err);
7726
7727 BeginCommandBuffer();
7728 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007729 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007730 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007731 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007732 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06007733 copyRegion.srcOffset.x = 0;
7734 copyRegion.srcOffset.y = 0;
7735 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007736 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007737 copyRegion.dstSubresource.mipLevel = 0;
7738 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007739 // Introduce failure by forcing the dst layerCount to differ from src
7740 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007741 copyRegion.dstOffset.x = 0;
7742 copyRegion.dstOffset.y = 0;
7743 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007744 copyRegion.extent.width = 1;
7745 copyRegion.extent.height = 1;
7746 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007747 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7748 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007749 EndCommandBuffer();
7750
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007751 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007752
Chia-I Wuf7458c52015-10-26 21:10:41 +08007753 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007754 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007755 vkFreeMemory(m_device->device(), srcMem, NULL);
7756 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007757}
7758
Karl Schultz6addd812016-02-02 17:17:23 -07007759TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06007760 VkResult err;
7761 bool pass;
7762
7763 // Create color images with different format sizes and try to copy between them
7764 m_errorMonitor->SetDesiredFailureMsg(
7765 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7766 "vkCmdCopyImage called with unmatched source and dest image format sizes");
7767
7768 ASSERT_NO_FATAL_FAILURE(InitState());
7769
7770 // Create two images of different types and try to copy between them
7771 VkImage srcImage;
7772 VkImage dstImage;
7773 VkDeviceMemory srcMem;
7774 VkDeviceMemory destMem;
7775 VkMemoryRequirements memReqs;
7776
7777 VkImageCreateInfo image_create_info = {};
7778 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7779 image_create_info.pNext = NULL;
7780 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7781 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7782 image_create_info.extent.width = 32;
7783 image_create_info.extent.height = 32;
7784 image_create_info.extent.depth = 1;
7785 image_create_info.mipLevels = 1;
7786 image_create_info.arrayLayers = 1;
7787 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7788 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7789 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7790 image_create_info.flags = 0;
7791
7792 err =
7793 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
7794 ASSERT_VK_SUCCESS(err);
7795
7796 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7797 // Introduce failure by creating second image with a different-sized format.
7798 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
7799
7800 err =
7801 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
7802 ASSERT_VK_SUCCESS(err);
7803
7804 // Allocate memory
7805 VkMemoryAllocateInfo memAlloc = {};
7806 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7807 memAlloc.pNext = NULL;
7808 memAlloc.allocationSize = 0;
7809 memAlloc.memoryTypeIndex = 0;
7810
7811 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
7812 memAlloc.allocationSize = memReqs.size;
7813 pass =
7814 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7815 ASSERT_TRUE(pass);
7816 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
7817 ASSERT_VK_SUCCESS(err);
7818
7819 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
7820 memAlloc.allocationSize = memReqs.size;
7821 pass =
7822 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7823 ASSERT_TRUE(pass);
7824 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
7825 ASSERT_VK_SUCCESS(err);
7826
7827 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7828 ASSERT_VK_SUCCESS(err);
7829 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
7830 ASSERT_VK_SUCCESS(err);
7831
7832 BeginCommandBuffer();
7833 VkImageCopy copyRegion;
7834 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7835 copyRegion.srcSubresource.mipLevel = 0;
7836 copyRegion.srcSubresource.baseArrayLayer = 0;
7837 copyRegion.srcSubresource.layerCount = 0;
7838 copyRegion.srcOffset.x = 0;
7839 copyRegion.srcOffset.y = 0;
7840 copyRegion.srcOffset.z = 0;
7841 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7842 copyRegion.dstSubresource.mipLevel = 0;
7843 copyRegion.dstSubresource.baseArrayLayer = 0;
7844 copyRegion.dstSubresource.layerCount = 0;
7845 copyRegion.dstOffset.x = 0;
7846 copyRegion.dstOffset.y = 0;
7847 copyRegion.dstOffset.z = 0;
7848 copyRegion.extent.width = 1;
7849 copyRegion.extent.height = 1;
7850 copyRegion.extent.depth = 1;
7851 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7852 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7853 EndCommandBuffer();
7854
7855 m_errorMonitor->VerifyFound();
7856
7857 vkDestroyImage(m_device->device(), srcImage, NULL);
7858 vkDestroyImage(m_device->device(), dstImage, NULL);
7859 vkFreeMemory(m_device->device(), srcMem, NULL);
7860 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007861}
7862
Karl Schultz6addd812016-02-02 17:17:23 -07007863TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
7864 VkResult err;
7865 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007866
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007867 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007868 m_errorMonitor->SetDesiredFailureMsg(
7869 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007870 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007871
Mike Stroyana3082432015-09-25 13:39:21 -06007872 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007873
7874 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007875 VkImage srcImage;
7876 VkImage dstImage;
7877 VkDeviceMemory srcMem;
7878 VkDeviceMemory destMem;
7879 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007880
7881 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007882 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7883 image_create_info.pNext = NULL;
7884 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7885 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7886 image_create_info.extent.width = 32;
7887 image_create_info.extent.height = 32;
7888 image_create_info.extent.depth = 1;
7889 image_create_info.mipLevels = 1;
7890 image_create_info.arrayLayers = 1;
7891 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7892 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7893 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7894 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007895
Karl Schultz6addd812016-02-02 17:17:23 -07007896 err =
7897 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007898 ASSERT_VK_SUCCESS(err);
7899
Karl Schultzbdb75952016-04-19 11:36:49 -06007900 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7901
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007902 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07007903 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007904 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
7905 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
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, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007909 ASSERT_VK_SUCCESS(err);
7910
7911 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007912 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007913 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7914 memAlloc.pNext = NULL;
7915 memAlloc.allocationSize = 0;
7916 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007917
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007918 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007919 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007920 pass =
7921 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007922 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007923 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007924 ASSERT_VK_SUCCESS(err);
7925
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007926 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007927 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007928 pass =
7929 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007930 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007931 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007932 ASSERT_VK_SUCCESS(err);
7933
7934 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7935 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007936 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007937 ASSERT_VK_SUCCESS(err);
7938
7939 BeginCommandBuffer();
7940 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007941 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007942 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007943 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007944 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007945 copyRegion.srcOffset.x = 0;
7946 copyRegion.srcOffset.y = 0;
7947 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007948 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007949 copyRegion.dstSubresource.mipLevel = 0;
7950 copyRegion.dstSubresource.baseArrayLayer = 0;
7951 copyRegion.dstSubresource.layerCount = 0;
7952 copyRegion.dstOffset.x = 0;
7953 copyRegion.dstOffset.y = 0;
7954 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007955 copyRegion.extent.width = 1;
7956 copyRegion.extent.height = 1;
7957 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007958 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7959 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007960 EndCommandBuffer();
7961
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007962 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007963
Chia-I Wuf7458c52015-10-26 21:10:41 +08007964 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007965 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007966 vkFreeMemory(m_device->device(), srcMem, NULL);
7967 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007968}
7969
Karl Schultz6addd812016-02-02 17:17:23 -07007970TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
7971 VkResult err;
7972 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007973
Karl Schultz6addd812016-02-02 17:17:23 -07007974 m_errorMonitor->SetDesiredFailureMsg(
7975 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007976 "vkCmdResolveImage called with source sample count less than 2.");
7977
Mike Stroyana3082432015-09-25 13:39:21 -06007978 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007979
7980 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07007981 VkImage srcImage;
7982 VkImage dstImage;
7983 VkDeviceMemory srcMem;
7984 VkDeviceMemory destMem;
7985 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007986
7987 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007988 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7989 image_create_info.pNext = NULL;
7990 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7991 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7992 image_create_info.extent.width = 32;
7993 image_create_info.extent.height = 1;
7994 image_create_info.extent.depth = 1;
7995 image_create_info.mipLevels = 1;
7996 image_create_info.arrayLayers = 1;
7997 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7998 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7999 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8000 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008001
Karl Schultz6addd812016-02-02 17:17:23 -07008002 err =
8003 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008004 ASSERT_VK_SUCCESS(err);
8005
Karl Schultz6addd812016-02-02 17:17:23 -07008006 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8007 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008008
Karl Schultz6addd812016-02-02 17:17:23 -07008009 err =
8010 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008011 ASSERT_VK_SUCCESS(err);
8012
8013 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008014 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008015 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8016 memAlloc.pNext = NULL;
8017 memAlloc.allocationSize = 0;
8018 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008019
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008020 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008021 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008022 pass =
8023 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008024 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008025 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008026 ASSERT_VK_SUCCESS(err);
8027
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008028 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008029 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008030 pass =
8031 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008032 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008033 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008034 ASSERT_VK_SUCCESS(err);
8035
8036 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8037 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008038 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008039 ASSERT_VK_SUCCESS(err);
8040
8041 BeginCommandBuffer();
8042 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008043 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8044 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008045 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008046 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008047 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008048 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008049 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008050 resolveRegion.srcOffset.x = 0;
8051 resolveRegion.srcOffset.y = 0;
8052 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008053 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008054 resolveRegion.dstSubresource.mipLevel = 0;
8055 resolveRegion.dstSubresource.baseArrayLayer = 0;
8056 resolveRegion.dstSubresource.layerCount = 0;
8057 resolveRegion.dstOffset.x = 0;
8058 resolveRegion.dstOffset.y = 0;
8059 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008060 resolveRegion.extent.width = 1;
8061 resolveRegion.extent.height = 1;
8062 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008063 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8064 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008065 EndCommandBuffer();
8066
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008067 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008068
Chia-I Wuf7458c52015-10-26 21:10:41 +08008069 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008070 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008071 vkFreeMemory(m_device->device(), srcMem, NULL);
8072 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008073}
8074
Karl Schultz6addd812016-02-02 17:17:23 -07008075TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
8076 VkResult err;
8077 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008078
Karl Schultz6addd812016-02-02 17:17:23 -07008079 m_errorMonitor->SetDesiredFailureMsg(
8080 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008081 "vkCmdResolveImage called with dest sample count greater than 1.");
8082
Mike Stroyana3082432015-09-25 13:39:21 -06008083 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008084
8085 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008086 VkImage srcImage;
8087 VkImage dstImage;
8088 VkDeviceMemory srcMem;
8089 VkDeviceMemory destMem;
8090 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008091
8092 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008093 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8094 image_create_info.pNext = NULL;
8095 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8096 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8097 image_create_info.extent.width = 32;
8098 image_create_info.extent.height = 1;
8099 image_create_info.extent.depth = 1;
8100 image_create_info.mipLevels = 1;
8101 image_create_info.arrayLayers = 1;
8102 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8103 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8104 // Note: Some implementations expect color attachment usage for any
8105 // multisample surface
8106 image_create_info.usage =
8107 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8108 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008109
Karl Schultz6addd812016-02-02 17:17:23 -07008110 err =
8111 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008112 ASSERT_VK_SUCCESS(err);
8113
Karl Schultz6addd812016-02-02 17:17:23 -07008114 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8115 // Note: Some implementations expect color attachment usage for any
8116 // multisample surface
8117 image_create_info.usage =
8118 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008119
Karl Schultz6addd812016-02-02 17:17:23 -07008120 err =
8121 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008122 ASSERT_VK_SUCCESS(err);
8123
8124 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008125 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008126 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8127 memAlloc.pNext = NULL;
8128 memAlloc.allocationSize = 0;
8129 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008130
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008131 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008132 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008133 pass =
8134 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008135 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008136 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008137 ASSERT_VK_SUCCESS(err);
8138
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008139 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008140 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008141 pass =
8142 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008143 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008144 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008145 ASSERT_VK_SUCCESS(err);
8146
8147 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8148 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008149 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008150 ASSERT_VK_SUCCESS(err);
8151
8152 BeginCommandBuffer();
8153 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008154 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8155 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008156 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008157 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008158 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008159 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008160 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008161 resolveRegion.srcOffset.x = 0;
8162 resolveRegion.srcOffset.y = 0;
8163 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008164 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008165 resolveRegion.dstSubresource.mipLevel = 0;
8166 resolveRegion.dstSubresource.baseArrayLayer = 0;
8167 resolveRegion.dstSubresource.layerCount = 0;
8168 resolveRegion.dstOffset.x = 0;
8169 resolveRegion.dstOffset.y = 0;
8170 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008171 resolveRegion.extent.width = 1;
8172 resolveRegion.extent.height = 1;
8173 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008174 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8175 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008176 EndCommandBuffer();
8177
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008178 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008179
Chia-I Wuf7458c52015-10-26 21:10:41 +08008180 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008181 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008182 vkFreeMemory(m_device->device(), srcMem, NULL);
8183 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008184}
8185
Karl Schultz6addd812016-02-02 17:17:23 -07008186TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
8187 VkResult err;
8188 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008189
Karl Schultz6addd812016-02-02 17:17:23 -07008190 m_errorMonitor->SetDesiredFailureMsg(
8191 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008192 "vkCmdResolveImage called with unmatched source and dest formats.");
8193
Mike Stroyana3082432015-09-25 13:39:21 -06008194 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008195
8196 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008197 VkImage srcImage;
8198 VkImage dstImage;
8199 VkDeviceMemory srcMem;
8200 VkDeviceMemory destMem;
8201 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008202
8203 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008204 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8205 image_create_info.pNext = NULL;
8206 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8207 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8208 image_create_info.extent.width = 32;
8209 image_create_info.extent.height = 1;
8210 image_create_info.extent.depth = 1;
8211 image_create_info.mipLevels = 1;
8212 image_create_info.arrayLayers = 1;
8213 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8214 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8215 // Note: Some implementations expect color attachment usage for any
8216 // multisample surface
8217 image_create_info.usage =
8218 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8219 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008220
Karl Schultz6addd812016-02-02 17:17:23 -07008221 err =
8222 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008223 ASSERT_VK_SUCCESS(err);
8224
Karl Schultz6addd812016-02-02 17:17:23 -07008225 // Set format to something other than source image
8226 image_create_info.format = VK_FORMAT_R32_SFLOAT;
8227 // Note: Some implementations expect color attachment usage for any
8228 // multisample surface
8229 image_create_info.usage =
8230 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8231 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008232
Karl Schultz6addd812016-02-02 17:17:23 -07008233 err =
8234 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008235 ASSERT_VK_SUCCESS(err);
8236
8237 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008238 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008239 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8240 memAlloc.pNext = NULL;
8241 memAlloc.allocationSize = 0;
8242 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008243
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008244 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008245 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008246 pass =
8247 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008248 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008249 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008250 ASSERT_VK_SUCCESS(err);
8251
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008252 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008253 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008254 pass =
8255 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008256 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008257 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008258 ASSERT_VK_SUCCESS(err);
8259
8260 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8261 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008262 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008263 ASSERT_VK_SUCCESS(err);
8264
8265 BeginCommandBuffer();
8266 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008267 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8268 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008269 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008270 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008271 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008272 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008273 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008274 resolveRegion.srcOffset.x = 0;
8275 resolveRegion.srcOffset.y = 0;
8276 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008277 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008278 resolveRegion.dstSubresource.mipLevel = 0;
8279 resolveRegion.dstSubresource.baseArrayLayer = 0;
8280 resolveRegion.dstSubresource.layerCount = 0;
8281 resolveRegion.dstOffset.x = 0;
8282 resolveRegion.dstOffset.y = 0;
8283 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008284 resolveRegion.extent.width = 1;
8285 resolveRegion.extent.height = 1;
8286 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008287 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8288 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008289 EndCommandBuffer();
8290
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008291 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008292
Chia-I Wuf7458c52015-10-26 21:10:41 +08008293 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008294 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008295 vkFreeMemory(m_device->device(), srcMem, NULL);
8296 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008297}
8298
Karl Schultz6addd812016-02-02 17:17:23 -07008299TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
8300 VkResult err;
8301 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008302
Karl Schultz6addd812016-02-02 17:17:23 -07008303 m_errorMonitor->SetDesiredFailureMsg(
8304 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008305 "vkCmdResolveImage called with unmatched source and dest image types.");
8306
Mike Stroyana3082432015-09-25 13:39:21 -06008307 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008308
8309 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008310 VkImage srcImage;
8311 VkImage dstImage;
8312 VkDeviceMemory srcMem;
8313 VkDeviceMemory destMem;
8314 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008315
8316 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008317 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8318 image_create_info.pNext = NULL;
8319 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8320 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8321 image_create_info.extent.width = 32;
8322 image_create_info.extent.height = 1;
8323 image_create_info.extent.depth = 1;
8324 image_create_info.mipLevels = 1;
8325 image_create_info.arrayLayers = 1;
8326 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8327 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8328 // Note: Some implementations expect color attachment usage for any
8329 // multisample surface
8330 image_create_info.usage =
8331 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8332 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008333
Karl Schultz6addd812016-02-02 17:17:23 -07008334 err =
8335 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008336 ASSERT_VK_SUCCESS(err);
8337
Karl Schultz6addd812016-02-02 17:17:23 -07008338 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8339 // Note: Some implementations expect color attachment usage for any
8340 // multisample surface
8341 image_create_info.usage =
8342 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8343 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008344
Karl Schultz6addd812016-02-02 17:17:23 -07008345 err =
8346 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008347 ASSERT_VK_SUCCESS(err);
8348
8349 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008350 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008351 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8352 memAlloc.pNext = NULL;
8353 memAlloc.allocationSize = 0;
8354 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008355
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008356 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008357 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008358 pass =
8359 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008360 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008361 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008362 ASSERT_VK_SUCCESS(err);
8363
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008364 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008365 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008366 pass =
8367 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008368 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008369 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008370 ASSERT_VK_SUCCESS(err);
8371
8372 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8373 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008374 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008375 ASSERT_VK_SUCCESS(err);
8376
8377 BeginCommandBuffer();
8378 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008379 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8380 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008381 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008382 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008383 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008384 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008385 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008386 resolveRegion.srcOffset.x = 0;
8387 resolveRegion.srcOffset.y = 0;
8388 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008389 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008390 resolveRegion.dstSubresource.mipLevel = 0;
8391 resolveRegion.dstSubresource.baseArrayLayer = 0;
8392 resolveRegion.dstSubresource.layerCount = 0;
8393 resolveRegion.dstOffset.x = 0;
8394 resolveRegion.dstOffset.y = 0;
8395 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008396 resolveRegion.extent.width = 1;
8397 resolveRegion.extent.height = 1;
8398 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008399 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8400 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008401 EndCommandBuffer();
8402
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008403 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008404
Chia-I Wuf7458c52015-10-26 21:10:41 +08008405 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008406 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008407 vkFreeMemory(m_device->device(), srcMem, NULL);
8408 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008409}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008410
Karl Schultz6addd812016-02-02 17:17:23 -07008411TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008412 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07008413 // to using a DS format, then cause it to hit error due to COLOR_BIT not
8414 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008415 // The image format check comes 2nd in validation so we trigger it first,
8416 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07008417 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008418
Karl Schultz6addd812016-02-02 17:17:23 -07008419 m_errorMonitor->SetDesiredFailureMsg(
8420 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008421 "Combination depth/stencil image formats can have only the ");
8422
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008423 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008424
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008425 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008426 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8427 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008428
8429 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008430 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8431 ds_pool_ci.pNext = NULL;
8432 ds_pool_ci.maxSets = 1;
8433 ds_pool_ci.poolSizeCount = 1;
8434 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008435
8436 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008437 err =
8438 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008439 ASSERT_VK_SUCCESS(err);
8440
8441 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008442 dsl_binding.binding = 0;
8443 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8444 dsl_binding.descriptorCount = 1;
8445 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8446 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008447
8448 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008449 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8450 ds_layout_ci.pNext = NULL;
8451 ds_layout_ci.bindingCount = 1;
8452 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008453 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008454 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8455 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008456 ASSERT_VK_SUCCESS(err);
8457
8458 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008459 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008460 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008461 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008462 alloc_info.descriptorPool = ds_pool;
8463 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008464 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8465 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008466 ASSERT_VK_SUCCESS(err);
8467
Karl Schultz6addd812016-02-02 17:17:23 -07008468 VkImage image_bad;
8469 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008470 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07008471 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008472 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07008473 const int32_t tex_width = 32;
8474 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008475
8476 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008477 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8478 image_create_info.pNext = NULL;
8479 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8480 image_create_info.format = tex_format_bad;
8481 image_create_info.extent.width = tex_width;
8482 image_create_info.extent.height = tex_height;
8483 image_create_info.extent.depth = 1;
8484 image_create_info.mipLevels = 1;
8485 image_create_info.arrayLayers = 1;
8486 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8487 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8488 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
8489 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
8490 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008491
Karl Schultz6addd812016-02-02 17:17:23 -07008492 err =
8493 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008494 ASSERT_VK_SUCCESS(err);
8495 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07008496 image_create_info.usage =
8497 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8498 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
8499 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008500 ASSERT_VK_SUCCESS(err);
8501
8502 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008503 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8504 image_view_create_info.image = image_bad;
8505 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8506 image_view_create_info.format = tex_format_bad;
8507 image_view_create_info.subresourceRange.baseArrayLayer = 0;
8508 image_view_create_info.subresourceRange.baseMipLevel = 0;
8509 image_view_create_info.subresourceRange.layerCount = 1;
8510 image_view_create_info.subresourceRange.levelCount = 1;
8511 image_view_create_info.subresourceRange.aspectMask =
8512 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008513
8514 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008515 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8516 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008517
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008518 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008519
Chia-I Wuf7458c52015-10-26 21:10:41 +08008520 vkDestroyImage(m_device->device(), image_bad, NULL);
8521 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008522 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8523 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008524}
Tobin Ehliscde08892015-09-22 10:11:37 -06008525#endif // IMAGE_TESTS
8526
Tony Barbour300a6082015-04-07 13:44:53 -06008527int main(int argc, char **argv) {
8528 int result;
8529
Cody Northrop8e54a402016-03-08 22:25:52 -07008530#ifdef ANDROID
8531 int vulkanSupport = InitVulkan();
8532 if (vulkanSupport == 0)
8533 return 1;
8534#endif
8535
Tony Barbour300a6082015-04-07 13:44:53 -06008536 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06008537 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06008538
8539 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
8540
8541 result = RUN_ALL_TESTS();
8542
Tony Barbour6918cd52015-04-09 12:58:51 -06008543 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06008544 return result;
8545}