blob: 2aee0ae248fbf25083e2fab5a64c5ef68c878024 [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
657 // Use the functions from the VK_KHR_surface extension without enabling
658 // that extension:
659
660 // Destroy a surface:
661 m_errorMonitor->SetDesiredFailureMsg(
662 VK_DEBUG_REPORT_ERROR_BIT_EXT,
663 "extension was not enabled for this");
664 vkDestroySurfaceKHR(instance(), surface, NULL);
665 m_errorMonitor->VerifyFound();
666
667 // Check if surface supports presentation:
668 VkBool32 supported = false;
669 m_errorMonitor->SetDesiredFailureMsg(
670 VK_DEBUG_REPORT_ERROR_BIT_EXT,
671 "extension was not enabled for this");
672 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
673 pass = (err != VK_SUCCESS);
674 ASSERT_TRUE(pass);
675 m_errorMonitor->VerifyFound();
676
677 // Check surface capabilities:
678 VkSurfaceCapabilitiesKHR capabilities = {};
679 m_errorMonitor->SetDesiredFailureMsg(
680 VK_DEBUG_REPORT_ERROR_BIT_EXT,
681 "extension was not enabled for this");
682 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
683 &capabilities);
684 pass = (err != VK_SUCCESS);
685 ASSERT_TRUE(pass);
686 m_errorMonitor->VerifyFound();
687
688 // Check surface formats:
689 uint32_t format_count = 0;
690 VkSurfaceFormatKHR *formats = NULL;
691 m_errorMonitor->SetDesiredFailureMsg(
692 VK_DEBUG_REPORT_ERROR_BIT_EXT,
693 "extension was not enabled for this");
694 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
695 &format_count, formats);
696 pass = (err != VK_SUCCESS);
697 ASSERT_TRUE(pass);
698 m_errorMonitor->VerifyFound();
699
700 // Check surface present modes:
701 uint32_t present_mode_count = 0;
702 VkSurfaceFormatKHR *present_modes = NULL;
703 m_errorMonitor->SetDesiredFailureMsg(
704 VK_DEBUG_REPORT_ERROR_BIT_EXT,
705 "extension was not enabled for this");
706 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
707 &present_mode_count, present_modes);
708 pass = (err != VK_SUCCESS);
709 ASSERT_TRUE(pass);
710 m_errorMonitor->VerifyFound();
711
712
713 // Use the functions from the VK_KHR_swapchain extension without enabling
714 // that extension:
715
716 // Create a swapchain:
717 m_errorMonitor->SetDesiredFailureMsg(
718 VK_DEBUG_REPORT_ERROR_BIT_EXT,
719 "extension was not enabled for this");
720 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
721 swapchain_create_info.pNext = NULL;
722#if 0
723 swapchain_create_info.flags = 0;
724 swapchain_create_info.surface = 0;
725 swapchain_create_info.minImageCount = 0;
726 swapchain_create_info.imageFormat = 0;
727 swapchain_create_info.imageColorSpace = 0;
728 swapchain_create_info.imageExtent.width = 0;
729 swapchain_create_info.imageExtent.height = 0;
730 swapchain_create_info.imageArrayLayers = 0;
731 swapchain_create_info.imageUsage = 0;
732 swapchain_create_info.imageSharingMode = 0;
733 swapchain_create_info.queueFamilyIndexCount = 0;
734 swapchain_create_info.preTransform = 0;
735 swapchain_create_info.compositeAlpha = 0;
736 swapchain_create_info.presentMode = 0;
737 swapchain_create_info.clipped = 0;
738 swapchain_create_info.oldSwapchain = NULL;
739#endif
740 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
741 NULL, &swapchain);
742 pass = (err != VK_SUCCESS);
743 ASSERT_TRUE(pass);
744 m_errorMonitor->VerifyFound();
745
746 // Get the images from the swapchain:
747 m_errorMonitor->SetDesiredFailureMsg(
748 VK_DEBUG_REPORT_ERROR_BIT_EXT,
749 "extension was not enabled for this");
750 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
751 &swapchain_image_count, NULL);
752 pass = (err != VK_SUCCESS);
753 ASSERT_TRUE(pass);
754 m_errorMonitor->VerifyFound();
755
756 // Try to acquire an image:
757 m_errorMonitor->SetDesiredFailureMsg(
758 VK_DEBUG_REPORT_ERROR_BIT_EXT,
759 "extension was not enabled for this");
760 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
761 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
762 pass = (err != VK_SUCCESS);
763 ASSERT_TRUE(pass);
764 m_errorMonitor->VerifyFound();
765
766 // Try to present an image:
767#if 0 // NOTE: Currently can't test this because a real swapchain is needed
768 // (as opposed to the fake one we created) in order for the layer to
769 // lookup the VkDevice used to enable the extension:
770 m_errorMonitor->SetDesiredFailureMsg(
771 VK_DEBUG_REPORT_ERROR_BIT_EXT,
772 "extension was not enabled for this");
773 present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
774 present_info.pNext = NULL;
775#if 0
776#endif
777 err = vkQueuePresentKHR(m_device->m_queue, &present_info);
778 pass = (err != VK_SUCCESS);
779 ASSERT_TRUE(pass);
780 m_errorMonitor->VerifyFound();
781#endif
782
783 // Destroy the swapchain:
784 m_errorMonitor->SetDesiredFailureMsg(
785 VK_DEBUG_REPORT_ERROR_BIT_EXT,
786 "extension was not enabled for this");
787 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
788 m_errorMonitor->VerifyFound();
789}
790
Karl Schultz6addd812016-02-02 17:17:23 -0700791TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
792 VkResult err;
793 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500794
Karl Schultz6addd812016-02-02 17:17:23 -0700795 m_errorMonitor->SetDesiredFailureMsg(
796 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600797 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
798
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500799 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500800
801 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700802 VkImage image;
803 VkDeviceMemory mem;
804 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500805
Karl Schultz6addd812016-02-02 17:17:23 -0700806 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
807 const int32_t tex_width = 32;
808 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500809
Tony Barboureb254902015-07-15 12:50:33 -0600810 VkImageCreateInfo image_create_info = {};
811 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700812 image_create_info.pNext = NULL;
813 image_create_info.imageType = VK_IMAGE_TYPE_2D;
814 image_create_info.format = tex_format;
815 image_create_info.extent.width = tex_width;
816 image_create_info.extent.height = tex_height;
817 image_create_info.extent.depth = 1;
818 image_create_info.mipLevels = 1;
819 image_create_info.arrayLayers = 1;
820 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
821 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
822 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
823 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600824
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800825 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800826 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700827 mem_alloc.pNext = NULL;
828 mem_alloc.allocationSize = 0;
829 // Introduce failure, do NOT set memProps to
830 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
831 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500832
Chia-I Wuf7458c52015-10-26 21:10:41 +0800833 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500834 ASSERT_VK_SUCCESS(err);
835
Karl Schultz6addd812016-02-02 17:17:23 -0700836 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500837
Mark Lobodzinski23065352015-05-29 09:32:35 -0500838 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500839
Karl Schultz6addd812016-02-02 17:17:23 -0700840 pass =
841 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
842 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
843 if (!pass) { // If we can't find any unmappable memory this test doesn't
844 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +0800845 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -0600846 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -0600847 }
Mike Stroyan713b2d72015-08-04 10:49:29 -0600848
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500849 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800850 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500851 ASSERT_VK_SUCCESS(err);
852
853 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -0600854 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500855 ASSERT_VK_SUCCESS(err);
856
857 // Map memory as if to initialize the image
858 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -0700859 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
860 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500861
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200862 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600863
Chia-I Wuf7458c52015-10-26 21:10:41 +0800864 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500865}
866
Karl Schultz6addd812016-02-02 17:17:23 -0700867TEST_F(VkLayerTest, RebindMemory) {
868 VkResult err;
869 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500870
Karl Schultz6addd812016-02-02 17:17:23 -0700871 m_errorMonitor->SetDesiredFailureMsg(
872 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600873 "which has already been bound to mem object");
874
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500875 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500876
877 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700878 VkImage image;
879 VkDeviceMemory mem1;
880 VkDeviceMemory mem2;
881 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500882
Karl Schultz6addd812016-02-02 17:17:23 -0700883 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
884 const int32_t tex_width = 32;
885 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500886
Tony Barboureb254902015-07-15 12:50:33 -0600887 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700888 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
889 image_create_info.pNext = NULL;
890 image_create_info.imageType = VK_IMAGE_TYPE_2D;
891 image_create_info.format = tex_format;
892 image_create_info.extent.width = tex_width;
893 image_create_info.extent.height = tex_height;
894 image_create_info.extent.depth = 1;
895 image_create_info.mipLevels = 1;
896 image_create_info.arrayLayers = 1;
897 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
898 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
899 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
900 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500901
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800902 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700903 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
904 mem_alloc.pNext = NULL;
905 mem_alloc.allocationSize = 0;
906 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -0600907
Karl Schultz6addd812016-02-02 17:17:23 -0700908 // Introduce failure, do NOT set memProps to
909 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -0600910 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800911 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500912 ASSERT_VK_SUCCESS(err);
913
Karl Schultz6addd812016-02-02 17:17:23 -0700914 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500915
916 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -0700917 pass =
918 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -0600919 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500920
921 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800922 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500923 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800924 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500925 ASSERT_VK_SUCCESS(err);
926
927 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -0600928 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500929 ASSERT_VK_SUCCESS(err);
930
Karl Schultz6addd812016-02-02 17:17:23 -0700931 // Introduce validation failure, try to bind a different memory object to
932 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -0600933 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500934
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200935 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600936
Chia-I Wuf7458c52015-10-26 21:10:41 +0800937 vkDestroyImage(m_device->device(), image, NULL);
938 vkFreeMemory(m_device->device(), mem1, NULL);
939 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500940}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500941
Karl Schultz6addd812016-02-02 17:17:23 -0700942TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600943 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600944
Karl Schultz6addd812016-02-02 17:17:23 -0700945 m_errorMonitor->SetDesiredFailureMsg(
946 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
947 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600948
949 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600950 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
951 fenceInfo.pNext = NULL;
952 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -0600953
Tony Barbour300a6082015-04-07 13:44:53 -0600954 ASSERT_NO_FATAL_FAILURE(InitState());
955 ASSERT_NO_FATAL_FAILURE(InitViewport());
956 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
957
Tony Barbourfe3351b2015-07-28 10:17:20 -0600958 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700959 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
960 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600961 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600962
963 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600964
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600965 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800966 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
967 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800968 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600969 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700970 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800971 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800972 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800973 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600974 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600975
976 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -0700977 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600978
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200979 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600980}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600981// This is a positive test. We used to expect error in this case but spec now
982// allows it
Karl Schultz6addd812016-02-02 17:17:23 -0700983TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600984 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600985 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600986 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600987 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
988 fenceInfo.pNext = NULL;
989
Tony Barbour0b4d9562015-04-09 10:48:04 -0600990 ASSERT_NO_FATAL_FAILURE(InitState());
991 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +0800992 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600993 VkResult result = vkResetFences(m_device->device(), 1, fences);
994 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -0600995
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600996 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -0600997}
Tobin Ehlis41376e12015-07-03 08:45:14 -0600998
Chia-I Wu08accc62015-07-07 11:50:03 +0800999/* TODO: Update for changes due to bug-14075 tiling across render passes */
1000#if 0
Tobin Ehlis41376e12015-07-03 08:45:14 -06001001TEST_F(VkLayerTest, InvalidUsageBits)
1002{
1003 // Initiate Draw w/o a PSO bound
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001004
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001006 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001007
1008 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001009 VkCommandBufferObj commandBuffer(m_device);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001010 BeginCommandBuffer();
Tobin Ehlis41376e12015-07-03 08:45:14 -06001011
1012 const VkExtent3D e3d = {
1013 .width = 128,
1014 .height = 128,
1015 .depth = 1,
1016 };
1017 const VkImageCreateInfo ici = {
1018 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
1019 .pNext = NULL,
1020 .imageType = VK_IMAGE_TYPE_2D,
1021 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
1022 .extent = e3d,
1023 .mipLevels = 1,
1024 .arraySize = 1,
Chia-I Wu5c17c962015-10-31 00:31:16 +08001025 .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlis41376e12015-07-03 08:45:14 -06001026 .tiling = VK_IMAGE_TILING_LINEAR,
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -06001027 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
Tobin Ehlis41376e12015-07-03 08:45:14 -06001028 .flags = 0,
1029 };
1030
1031 VkImage dsi;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001032 vkCreateImage(m_device->device(), &ici, NULL, &dsi);
Tobin Ehlis41376e12015-07-03 08:45:14 -06001033 VkDepthStencilView dsv;
1034 const VkDepthStencilViewCreateInfo dsvci = {
1035 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
1036 .pNext = NULL,
1037 .image = dsi,
1038 .mipLevel = 0,
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -06001039 .baseArrayLayer = 0,
Tobin Ehlis41376e12015-07-03 08:45:14 -06001040 .arraySize = 1,
1041 .flags = 0,
1042 };
Chia-I Wuf7458c52015-10-26 21:10:41 +08001043 vkCreateDepthStencilView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001044
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001045 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06001046}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001047#endif // 0
1048#endif // MEM_TRACKER_TESTS
1049
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06001050#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07001051TEST_F(VkLayerTest, PipelineNotBound) {
1052 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001053
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001055 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001056
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001057 ASSERT_NO_FATAL_FAILURE(InitState());
1058 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001059
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001060 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001061 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1062 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001063
1064 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001065 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1066 ds_pool_ci.pNext = NULL;
1067 ds_pool_ci.maxSets = 1;
1068 ds_pool_ci.poolSizeCount = 1;
1069 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001070
1071 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001072 err =
1073 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001074 ASSERT_VK_SUCCESS(err);
1075
1076 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001077 dsl_binding.binding = 0;
1078 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1079 dsl_binding.descriptorCount = 1;
1080 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1081 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001082
1083 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001084 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1085 ds_layout_ci.pNext = NULL;
1086 ds_layout_ci.bindingCount = 1;
1087 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001088
1089 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001090 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1091 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001092 ASSERT_VK_SUCCESS(err);
1093
1094 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001095 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001096 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001097 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001098 alloc_info.descriptorPool = ds_pool;
1099 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001100 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1101 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001102 ASSERT_VK_SUCCESS(err);
1103
1104 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001105 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1106 pipeline_layout_ci.pNext = NULL;
1107 pipeline_layout_ci.setLayoutCount = 1;
1108 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001109
1110 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001111 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1112 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001113 ASSERT_VK_SUCCESS(err);
1114
Mark Youngad779052016-01-06 14:26:04 -07001115 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001116
1117 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001118 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1119 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001120
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001121 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001122
Chia-I Wuf7458c52015-10-26 21:10:41 +08001123 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1124 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1125 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001126}
1127
Karl Schultz6addd812016-02-02 17:17:23 -07001128TEST_F(VkLayerTest, BindInvalidMemory) {
1129 VkResult err;
1130 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001131
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001133 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001134
Tobin Ehlisec598302015-09-15 15:02:17 -06001135 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001136
1137 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001138 VkImage image;
1139 VkDeviceMemory mem;
1140 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001141
Karl Schultz6addd812016-02-02 17:17:23 -07001142 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1143 const int32_t tex_width = 32;
1144 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001145
1146 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001147 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1148 image_create_info.pNext = NULL;
1149 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1150 image_create_info.format = tex_format;
1151 image_create_info.extent.width = tex_width;
1152 image_create_info.extent.height = tex_height;
1153 image_create_info.extent.depth = 1;
1154 image_create_info.mipLevels = 1;
1155 image_create_info.arrayLayers = 1;
1156 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1157 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1158 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1159 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001160
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001161 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001162 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1163 mem_alloc.pNext = NULL;
1164 mem_alloc.allocationSize = 0;
1165 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001166
Chia-I Wuf7458c52015-10-26 21:10:41 +08001167 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001168 ASSERT_VK_SUCCESS(err);
1169
Karl Schultz6addd812016-02-02 17:17:23 -07001170 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001171
1172 mem_alloc.allocationSize = mem_reqs.size;
1173
Karl Schultz6addd812016-02-02 17:17:23 -07001174 pass =
1175 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001176 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001177
1178 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001179 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001180 ASSERT_VK_SUCCESS(err);
1181
1182 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001183 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001184
1185 // Try to bind free memory that has been freed
1186 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1187 // This may very well return an error.
1188 (void)err;
1189
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001190 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001191
Chia-I Wuf7458c52015-10-26 21:10:41 +08001192 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001193}
1194
Karl Schultz6addd812016-02-02 17:17:23 -07001195TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1196 VkResult err;
1197 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001198
Karl Schultz6addd812016-02-02 17:17:23 -07001199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1200 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001201
Tobin Ehlisec598302015-09-15 15:02:17 -06001202 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001203
Karl Schultz6addd812016-02-02 17:17:23 -07001204 // Create an image object, allocate memory, destroy the object and then try
1205 // to bind it
1206 VkImage image;
1207 VkDeviceMemory mem;
1208 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001209
Karl Schultz6addd812016-02-02 17:17:23 -07001210 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1211 const int32_t tex_width = 32;
1212 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001213
1214 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001215 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1216 image_create_info.pNext = NULL;
1217 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1218 image_create_info.format = tex_format;
1219 image_create_info.extent.width = tex_width;
1220 image_create_info.extent.height = tex_height;
1221 image_create_info.extent.depth = 1;
1222 image_create_info.mipLevels = 1;
1223 image_create_info.arrayLayers = 1;
1224 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1225 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1226 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1227 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001228
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001229 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001230 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1231 mem_alloc.pNext = NULL;
1232 mem_alloc.allocationSize = 0;
1233 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001234
Chia-I Wuf7458c52015-10-26 21:10:41 +08001235 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001236 ASSERT_VK_SUCCESS(err);
1237
Karl Schultz6addd812016-02-02 17:17:23 -07001238 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001239
1240 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001241 pass =
1242 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001243 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001244
1245 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001246 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001247 ASSERT_VK_SUCCESS(err);
1248
1249 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001250 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001251 ASSERT_VK_SUCCESS(err);
1252
1253 // Now Try to bind memory to this destroyed object
1254 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1255 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001256 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001257
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001258 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001259
Chia-I Wuf7458c52015-10-26 21:10:41 +08001260 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001261}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001262
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001263#endif // OBJ_TRACKER_TESTS
1264
Tobin Ehlis0788f522015-05-26 16:11:58 -06001265#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001266
1267// This is a positive test. No errors should be generated.
1268TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
1269
1270 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1271 "submitted on separate queues followed by a QueueWaitIdle.");
1272
Dustin Graves48458142016-04-29 16:11:55 -06001273 if ((m_device->queue_props.empty()) ||
1274 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001275 return;
1276
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001277 m_errorMonitor->ExpectSuccess();
1278
1279 VkSemaphore semaphore;
1280 VkSemaphoreCreateInfo semaphore_create_info{};
1281 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1282 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1283 &semaphore);
1284
1285 VkCommandPool command_pool;
1286 VkCommandPoolCreateInfo pool_create_info{};
1287 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1288 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1289 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1290 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1291 &command_pool);
1292
1293 VkCommandBuffer command_buffer[2];
1294 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1295 command_buffer_allocate_info.sType =
1296 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1297 command_buffer_allocate_info.commandPool = command_pool;
1298 command_buffer_allocate_info.commandBufferCount = 2;
1299 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1300 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1301 command_buffer);
1302
1303 VkQueue queue = VK_NULL_HANDLE;
1304 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1305 1, &queue);
1306
1307 {
1308 VkCommandBufferBeginInfo begin_info{};
1309 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1310 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1311
1312 vkCmdPipelineBarrier(command_buffer[0],
1313 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1314 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1315 0, nullptr, 0, nullptr);
1316
1317 VkViewport viewport{};
1318 viewport.maxDepth = 1.0f;
1319 viewport.minDepth = 0.0f;
1320 viewport.width = 512;
1321 viewport.height = 512;
1322 viewport.x = 0;
1323 viewport.y = 0;
1324 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1325 vkEndCommandBuffer(command_buffer[0]);
1326 }
1327 {
1328 VkCommandBufferBeginInfo begin_info{};
1329 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1330 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1331
1332 VkViewport viewport{};
1333 viewport.maxDepth = 1.0f;
1334 viewport.minDepth = 0.0f;
1335 viewport.width = 512;
1336 viewport.height = 512;
1337 viewport.x = 0;
1338 viewport.y = 0;
1339 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1340 vkEndCommandBuffer(command_buffer[1]);
1341 }
1342 {
1343 VkSubmitInfo submit_info{};
1344 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1345 submit_info.commandBufferCount = 1;
1346 submit_info.pCommandBuffers = &command_buffer[0];
1347 submit_info.signalSemaphoreCount = 1;
1348 submit_info.pSignalSemaphores = &semaphore;
1349 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1350 }
1351 {
1352 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1353 VkSubmitInfo submit_info{};
1354 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1355 submit_info.commandBufferCount = 1;
1356 submit_info.pCommandBuffers = &command_buffer[1];
1357 submit_info.waitSemaphoreCount = 1;
1358 submit_info.pWaitSemaphores = &semaphore;
1359 submit_info.pWaitDstStageMask = flags;
1360 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1361 }
1362
1363 vkQueueWaitIdle(m_device->m_queue);
1364
1365 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1366 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1367 &command_buffer[0]);
1368 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1369
1370 m_errorMonitor->VerifyNotFound();
1371}
1372
1373// This is a positive test. No errors should be generated.
1374TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
1375
1376 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1377 "submitted on separate queues, the second having a fence"
1378 "followed by a QueueWaitIdle.");
1379
Dustin Graves48458142016-04-29 16:11:55 -06001380 if ((m_device->queue_props.empty()) ||
1381 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001382 return;
1383
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001384 m_errorMonitor->ExpectSuccess();
1385
1386 VkFence fence;
1387 VkFenceCreateInfo fence_create_info{};
1388 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1389 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1390
1391 VkSemaphore semaphore;
1392 VkSemaphoreCreateInfo semaphore_create_info{};
1393 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1394 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1395 &semaphore);
1396
1397 VkCommandPool command_pool;
1398 VkCommandPoolCreateInfo pool_create_info{};
1399 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1400 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1401 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1402 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1403 &command_pool);
1404
1405 VkCommandBuffer command_buffer[2];
1406 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1407 command_buffer_allocate_info.sType =
1408 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1409 command_buffer_allocate_info.commandPool = command_pool;
1410 command_buffer_allocate_info.commandBufferCount = 2;
1411 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1412 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1413 command_buffer);
1414
1415 VkQueue queue = VK_NULL_HANDLE;
1416 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1417 1, &queue);
1418
1419 {
1420 VkCommandBufferBeginInfo begin_info{};
1421 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1422 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1423
1424 vkCmdPipelineBarrier(command_buffer[0],
1425 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1426 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1427 0, nullptr, 0, nullptr);
1428
1429 VkViewport viewport{};
1430 viewport.maxDepth = 1.0f;
1431 viewport.minDepth = 0.0f;
1432 viewport.width = 512;
1433 viewport.height = 512;
1434 viewport.x = 0;
1435 viewport.y = 0;
1436 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1437 vkEndCommandBuffer(command_buffer[0]);
1438 }
1439 {
1440 VkCommandBufferBeginInfo begin_info{};
1441 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1442 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1443
1444 VkViewport viewport{};
1445 viewport.maxDepth = 1.0f;
1446 viewport.minDepth = 0.0f;
1447 viewport.width = 512;
1448 viewport.height = 512;
1449 viewport.x = 0;
1450 viewport.y = 0;
1451 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1452 vkEndCommandBuffer(command_buffer[1]);
1453 }
1454 {
1455 VkSubmitInfo submit_info{};
1456 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1457 submit_info.commandBufferCount = 1;
1458 submit_info.pCommandBuffers = &command_buffer[0];
1459 submit_info.signalSemaphoreCount = 1;
1460 submit_info.pSignalSemaphores = &semaphore;
1461 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1462 }
1463 {
1464 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1465 VkSubmitInfo submit_info{};
1466 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1467 submit_info.commandBufferCount = 1;
1468 submit_info.pCommandBuffers = &command_buffer[1];
1469 submit_info.waitSemaphoreCount = 1;
1470 submit_info.pWaitSemaphores = &semaphore;
1471 submit_info.pWaitDstStageMask = flags;
1472 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1473 }
1474
1475 vkQueueWaitIdle(m_device->m_queue);
1476
1477 vkDestroyFence(m_device->device(), fence, nullptr);
1478 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1479 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1480 &command_buffer[0]);
1481 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1482
1483 m_errorMonitor->VerifyNotFound();
1484}
1485
1486// This is a positive test. No errors should be generated.
1487TEST_F(VkLayerTest,
1488 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
1489
1490 TEST_DESCRIPTION(
1491 "Two command buffers, each in a separate QueueSubmit call "
1492 "submitted on separate queues, the second having a fence"
1493 "followed by two consecutive WaitForFences calls on the same fence.");
1494
Dustin Graves48458142016-04-29 16:11:55 -06001495 if ((m_device->queue_props.empty()) ||
1496 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001497 return;
1498
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001499 m_errorMonitor->ExpectSuccess();
1500
1501 VkFence fence;
1502 VkFenceCreateInfo fence_create_info{};
1503 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1504 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1505
1506 VkSemaphore semaphore;
1507 VkSemaphoreCreateInfo semaphore_create_info{};
1508 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1509 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1510 &semaphore);
1511
1512 VkCommandPool command_pool;
1513 VkCommandPoolCreateInfo pool_create_info{};
1514 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1515 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1516 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1517 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1518 &command_pool);
1519
1520 VkCommandBuffer command_buffer[2];
1521 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1522 command_buffer_allocate_info.sType =
1523 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1524 command_buffer_allocate_info.commandPool = command_pool;
1525 command_buffer_allocate_info.commandBufferCount = 2;
1526 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1527 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1528 command_buffer);
1529
1530 VkQueue queue = VK_NULL_HANDLE;
1531 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1532 1, &queue);
1533
1534 {
1535 VkCommandBufferBeginInfo begin_info{};
1536 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1537 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1538
1539 vkCmdPipelineBarrier(command_buffer[0],
1540 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1541 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1542 0, nullptr, 0, nullptr);
1543
1544 VkViewport viewport{};
1545 viewport.maxDepth = 1.0f;
1546 viewport.minDepth = 0.0f;
1547 viewport.width = 512;
1548 viewport.height = 512;
1549 viewport.x = 0;
1550 viewport.y = 0;
1551 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1552 vkEndCommandBuffer(command_buffer[0]);
1553 }
1554 {
1555 VkCommandBufferBeginInfo begin_info{};
1556 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1557 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1558
1559 VkViewport viewport{};
1560 viewport.maxDepth = 1.0f;
1561 viewport.minDepth = 0.0f;
1562 viewport.width = 512;
1563 viewport.height = 512;
1564 viewport.x = 0;
1565 viewport.y = 0;
1566 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1567 vkEndCommandBuffer(command_buffer[1]);
1568 }
1569 {
1570 VkSubmitInfo submit_info{};
1571 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1572 submit_info.commandBufferCount = 1;
1573 submit_info.pCommandBuffers = &command_buffer[0];
1574 submit_info.signalSemaphoreCount = 1;
1575 submit_info.pSignalSemaphores = &semaphore;
1576 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1577 }
1578 {
1579 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1580 VkSubmitInfo submit_info{};
1581 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1582 submit_info.commandBufferCount = 1;
1583 submit_info.pCommandBuffers = &command_buffer[1];
1584 submit_info.waitSemaphoreCount = 1;
1585 submit_info.pWaitSemaphores = &semaphore;
1586 submit_info.pWaitDstStageMask = flags;
1587 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1588 }
1589
1590 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1591 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1592
1593 vkDestroyFence(m_device->device(), fence, nullptr);
1594 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1595 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1596 &command_buffer[0]);
1597 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1598
1599 m_errorMonitor->VerifyNotFound();
1600}
1601
1602// This is a positive test. No errors should be generated.
1603TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
1604
1605 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1606 "submitted on separate queues, the second having a fence, "
1607 "followed by a WaitForFences call.");
1608
Dustin Graves48458142016-04-29 16:11:55 -06001609 if ((m_device->queue_props.empty()) ||
1610 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001611 return;
1612
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001613 m_errorMonitor->ExpectSuccess();
1614
1615 VkFence fence;
1616 VkFenceCreateInfo fence_create_info{};
1617 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1618 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1619
1620 VkSemaphore semaphore;
1621 VkSemaphoreCreateInfo semaphore_create_info{};
1622 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1623 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1624 &semaphore);
1625
1626 VkCommandPool command_pool;
1627 VkCommandPoolCreateInfo pool_create_info{};
1628 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1629 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1630 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1631 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1632 &command_pool);
1633
1634 VkCommandBuffer command_buffer[2];
1635 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1636 command_buffer_allocate_info.sType =
1637 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1638 command_buffer_allocate_info.commandPool = command_pool;
1639 command_buffer_allocate_info.commandBufferCount = 2;
1640 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1641 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1642 command_buffer);
1643
1644 VkQueue queue = VK_NULL_HANDLE;
1645 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1646 1, &queue);
1647
1648
1649 {
1650 VkCommandBufferBeginInfo begin_info{};
1651 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1652 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1653
1654 vkCmdPipelineBarrier(command_buffer[0],
1655 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1656 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1657 0, nullptr, 0, nullptr);
1658
1659 VkViewport viewport{};
1660 viewport.maxDepth = 1.0f;
1661 viewport.minDepth = 0.0f;
1662 viewport.width = 512;
1663 viewport.height = 512;
1664 viewport.x = 0;
1665 viewport.y = 0;
1666 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1667 vkEndCommandBuffer(command_buffer[0]);
1668 }
1669 {
1670 VkCommandBufferBeginInfo begin_info{};
1671 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1672 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1673
1674 VkViewport viewport{};
1675 viewport.maxDepth = 1.0f;
1676 viewport.minDepth = 0.0f;
1677 viewport.width = 512;
1678 viewport.height = 512;
1679 viewport.x = 0;
1680 viewport.y = 0;
1681 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1682 vkEndCommandBuffer(command_buffer[1]);
1683 }
1684 {
1685 VkSubmitInfo submit_info{};
1686 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1687 submit_info.commandBufferCount = 1;
1688 submit_info.pCommandBuffers = &command_buffer[0];
1689 submit_info.signalSemaphoreCount = 1;
1690 submit_info.pSignalSemaphores = &semaphore;
1691 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1692 }
1693 {
1694 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1695 VkSubmitInfo submit_info{};
1696 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1697 submit_info.commandBufferCount = 1;
1698 submit_info.pCommandBuffers = &command_buffer[1];
1699 submit_info.waitSemaphoreCount = 1;
1700 submit_info.pWaitSemaphores = &semaphore;
1701 submit_info.pWaitDstStageMask = flags;
1702 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1703 }
1704
1705 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1706
1707 vkDestroyFence(m_device->device(), fence, nullptr);
1708 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1709 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1710 &command_buffer[0]);
1711 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1712
1713 m_errorMonitor->VerifyNotFound();
1714}
1715
1716// This is a positive test. No errors should be generated.
1717TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
1718
1719 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1720 "on the same queue, sharing a signal/wait semaphore, the "
1721 "second having a fence, "
1722 "followed by a WaitForFences call.");
1723
1724 m_errorMonitor->ExpectSuccess();
1725
1726 VkFence fence;
1727 VkFenceCreateInfo fence_create_info{};
1728 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1729 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1730
1731 VkSemaphore semaphore;
1732 VkSemaphoreCreateInfo semaphore_create_info{};
1733 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1734 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1735 &semaphore);
1736
1737 VkCommandPool command_pool;
1738 VkCommandPoolCreateInfo pool_create_info{};
1739 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1740 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1741 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1742 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1743 &command_pool);
1744
1745 VkCommandBuffer command_buffer[2];
1746 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1747 command_buffer_allocate_info.sType =
1748 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1749 command_buffer_allocate_info.commandPool = command_pool;
1750 command_buffer_allocate_info.commandBufferCount = 2;
1751 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1752 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1753 command_buffer);
1754
1755 {
1756 VkCommandBufferBeginInfo begin_info{};
1757 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1758 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1759
1760 vkCmdPipelineBarrier(command_buffer[0],
1761 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1762 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1763 0, nullptr, 0, nullptr);
1764
1765 VkViewport viewport{};
1766 viewport.maxDepth = 1.0f;
1767 viewport.minDepth = 0.0f;
1768 viewport.width = 512;
1769 viewport.height = 512;
1770 viewport.x = 0;
1771 viewport.y = 0;
1772 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1773 vkEndCommandBuffer(command_buffer[0]);
1774 }
1775 {
1776 VkCommandBufferBeginInfo begin_info{};
1777 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1778 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1779
1780 VkViewport viewport{};
1781 viewport.maxDepth = 1.0f;
1782 viewport.minDepth = 0.0f;
1783 viewport.width = 512;
1784 viewport.height = 512;
1785 viewport.x = 0;
1786 viewport.y = 0;
1787 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1788 vkEndCommandBuffer(command_buffer[1]);
1789 }
1790 {
1791 VkSubmitInfo submit_info{};
1792 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1793 submit_info.commandBufferCount = 1;
1794 submit_info.pCommandBuffers = &command_buffer[0];
1795 submit_info.signalSemaphoreCount = 1;
1796 submit_info.pSignalSemaphores = &semaphore;
1797 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1798 }
1799 {
1800 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1801 VkSubmitInfo submit_info{};
1802 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1803 submit_info.commandBufferCount = 1;
1804 submit_info.pCommandBuffers = &command_buffer[1];
1805 submit_info.waitSemaphoreCount = 1;
1806 submit_info.pWaitSemaphores = &semaphore;
1807 submit_info.pWaitDstStageMask = flags;
1808 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1809 }
1810
1811 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1812
1813 vkDestroyFence(m_device->device(), fence, nullptr);
1814 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1815 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1816 &command_buffer[0]);
1817 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1818
1819 m_errorMonitor->VerifyNotFound();
1820}
1821
1822// This is a positive test. No errors should be generated.
1823TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
1824
1825 TEST_DESCRIPTION(
1826 "Two command buffers, each in a separate QueueSubmit call "
1827 "on the same queue, no fences, followed by a third QueueSubmit with NO "
1828 "SubmitInfos but with a fence, followed by a WaitForFences call.");
1829
1830 m_errorMonitor->ExpectSuccess();
1831
1832 VkFence fence;
1833 VkFenceCreateInfo fence_create_info{};
1834 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1835 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1836
1837 VkCommandPool command_pool;
1838 VkCommandPoolCreateInfo pool_create_info{};
1839 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1840 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1841 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1842 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1843 &command_pool);
1844
1845 VkCommandBuffer command_buffer[2];
1846 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1847 command_buffer_allocate_info.sType =
1848 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1849 command_buffer_allocate_info.commandPool = command_pool;
1850 command_buffer_allocate_info.commandBufferCount = 2;
1851 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1852 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1853 command_buffer);
1854
1855 {
1856 VkCommandBufferBeginInfo begin_info{};
1857 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1858 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1859
1860 vkCmdPipelineBarrier(command_buffer[0],
1861 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1862 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1863 0, nullptr, 0, nullptr);
1864
1865 VkViewport viewport{};
1866 viewport.maxDepth = 1.0f;
1867 viewport.minDepth = 0.0f;
1868 viewport.width = 512;
1869 viewport.height = 512;
1870 viewport.x = 0;
1871 viewport.y = 0;
1872 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1873 vkEndCommandBuffer(command_buffer[0]);
1874 }
1875 {
1876 VkCommandBufferBeginInfo begin_info{};
1877 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1878 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1879
1880 VkViewport viewport{};
1881 viewport.maxDepth = 1.0f;
1882 viewport.minDepth = 0.0f;
1883 viewport.width = 512;
1884 viewport.height = 512;
1885 viewport.x = 0;
1886 viewport.y = 0;
1887 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1888 vkEndCommandBuffer(command_buffer[1]);
1889 }
1890 {
1891 VkSubmitInfo submit_info{};
1892 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1893 submit_info.commandBufferCount = 1;
1894 submit_info.pCommandBuffers = &command_buffer[0];
1895 submit_info.signalSemaphoreCount = 0;
1896 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
1897 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1898 }
1899 {
1900 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1901 VkSubmitInfo submit_info{};
1902 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1903 submit_info.commandBufferCount = 1;
1904 submit_info.pCommandBuffers = &command_buffer[1];
1905 submit_info.waitSemaphoreCount = 0;
1906 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
1907 submit_info.pWaitDstStageMask = flags;
1908 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1909 }
1910
1911 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
1912
1913 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1914
1915 vkDestroyFence(m_device->device(), fence, nullptr);
1916 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1917 &command_buffer[0]);
1918 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1919
1920 m_errorMonitor->VerifyNotFound();
1921}
1922
1923// This is a positive test. No errors should be generated.
1924TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
1925
1926 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1927 "on the same queue, the second having a fence, followed "
1928 "by a WaitForFences call.");
1929
1930 m_errorMonitor->ExpectSuccess();
1931
1932 VkFence fence;
1933 VkFenceCreateInfo fence_create_info{};
1934 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1935 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1936
1937 VkCommandPool command_pool;
1938 VkCommandPoolCreateInfo pool_create_info{};
1939 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1940 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1941 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1942 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1943 &command_pool);
1944
1945 VkCommandBuffer command_buffer[2];
1946 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1947 command_buffer_allocate_info.sType =
1948 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1949 command_buffer_allocate_info.commandPool = command_pool;
1950 command_buffer_allocate_info.commandBufferCount = 2;
1951 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1952 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1953 command_buffer);
1954
1955 {
1956 VkCommandBufferBeginInfo begin_info{};
1957 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1958 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1959
1960 vkCmdPipelineBarrier(command_buffer[0],
1961 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1962 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1963 0, nullptr, 0, nullptr);
1964
1965 VkViewport viewport{};
1966 viewport.maxDepth = 1.0f;
1967 viewport.minDepth = 0.0f;
1968 viewport.width = 512;
1969 viewport.height = 512;
1970 viewport.x = 0;
1971 viewport.y = 0;
1972 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1973 vkEndCommandBuffer(command_buffer[0]);
1974 }
1975 {
1976 VkCommandBufferBeginInfo begin_info{};
1977 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1978 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1979
1980 VkViewport viewport{};
1981 viewport.maxDepth = 1.0f;
1982 viewport.minDepth = 0.0f;
1983 viewport.width = 512;
1984 viewport.height = 512;
1985 viewport.x = 0;
1986 viewport.y = 0;
1987 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1988 vkEndCommandBuffer(command_buffer[1]);
1989 }
1990 {
1991 VkSubmitInfo submit_info{};
1992 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1993 submit_info.commandBufferCount = 1;
1994 submit_info.pCommandBuffers = &command_buffer[0];
1995 submit_info.signalSemaphoreCount = 0;
1996 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
1997 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1998 }
1999 {
2000 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2001 VkSubmitInfo submit_info{};
2002 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2003 submit_info.commandBufferCount = 1;
2004 submit_info.pCommandBuffers = &command_buffer[1];
2005 submit_info.waitSemaphoreCount = 0;
2006 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2007 submit_info.pWaitDstStageMask = flags;
2008 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2009 }
2010
2011 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2012
2013 vkDestroyFence(m_device->device(), fence, nullptr);
2014 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2015 &command_buffer[0]);
2016 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2017
2018 m_errorMonitor->VerifyNotFound();
2019}
2020
2021// This is a positive test. No errors should be generated.
2022TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
2023
2024 TEST_DESCRIPTION(
2025 "Two command buffers each in a separate SubmitInfo sent in a single "
2026 "QueueSubmit call followed by a WaitForFences call.");
2027
2028 m_errorMonitor->ExpectSuccess();
2029
2030 VkFence fence;
2031 VkFenceCreateInfo fence_create_info{};
2032 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2033 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2034
2035 VkSemaphore semaphore;
2036 VkSemaphoreCreateInfo semaphore_create_info{};
2037 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2038 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2039 &semaphore);
2040
2041 VkCommandPool command_pool;
2042 VkCommandPoolCreateInfo pool_create_info{};
2043 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2044 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2045 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2046 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2047 &command_pool);
2048
2049 VkCommandBuffer command_buffer[2];
2050 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2051 command_buffer_allocate_info.sType =
2052 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2053 command_buffer_allocate_info.commandPool = command_pool;
2054 command_buffer_allocate_info.commandBufferCount = 2;
2055 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2056 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2057 command_buffer);
2058
2059 {
2060 VkCommandBufferBeginInfo begin_info{};
2061 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2062 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2063
2064 vkCmdPipelineBarrier(command_buffer[0],
2065 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2066 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2067 0, nullptr, 0, nullptr);
2068
2069 VkViewport viewport{};
2070 viewport.maxDepth = 1.0f;
2071 viewport.minDepth = 0.0f;
2072 viewport.width = 512;
2073 viewport.height = 512;
2074 viewport.x = 0;
2075 viewport.y = 0;
2076 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2077 vkEndCommandBuffer(command_buffer[0]);
2078 }
2079 {
2080 VkCommandBufferBeginInfo begin_info{};
2081 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2082 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2083
2084 VkViewport viewport{};
2085 viewport.maxDepth = 1.0f;
2086 viewport.minDepth = 0.0f;
2087 viewport.width = 512;
2088 viewport.height = 512;
2089 viewport.x = 0;
2090 viewport.y = 0;
2091 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2092 vkEndCommandBuffer(command_buffer[1]);
2093 }
2094 {
2095 VkSubmitInfo submit_info[2];
2096 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2097
2098 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2099 submit_info[0].pNext = NULL;
2100 submit_info[0].commandBufferCount = 1;
2101 submit_info[0].pCommandBuffers = &command_buffer[0];
2102 submit_info[0].signalSemaphoreCount = 1;
2103 submit_info[0].pSignalSemaphores = &semaphore;
2104 submit_info[0].waitSemaphoreCount = 0;
2105 submit_info[0].pWaitSemaphores = NULL;
2106 submit_info[0].pWaitDstStageMask = 0;
2107
2108 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2109 submit_info[1].pNext = NULL;
2110 submit_info[1].commandBufferCount = 1;
2111 submit_info[1].pCommandBuffers = &command_buffer[1];
2112 submit_info[1].waitSemaphoreCount = 1;
2113 submit_info[1].pWaitSemaphores = &semaphore;
2114 submit_info[1].pWaitDstStageMask = flags;
2115 submit_info[1].signalSemaphoreCount = 0;
2116 submit_info[1].pSignalSemaphores = NULL;
2117 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
2118 }
2119
2120 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2121
2122 vkDestroyFence(m_device->device(), fence, nullptr);
2123 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2124 &command_buffer[0]);
2125 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2126
2127 m_errorMonitor->VerifyNotFound();
2128}
2129
Karl Schultz6addd812016-02-02 17:17:23 -07002130TEST_F(VkLayerTest, LineWidthStateNotBound) {
2131 m_errorMonitor->SetDesiredFailureMsg(
2132 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002133 "Dynamic line width state not set for this command buffer");
2134
Karl Schultz6addd812016-02-02 17:17:23 -07002135 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line "
2136 "width state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002137
Karl Schultz6addd812016-02-02 17:17:23 -07002138 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2139 BsoFailLineWidth);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002140
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002141 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002142}
2143
Karl Schultz6addd812016-02-02 17:17:23 -07002144TEST_F(VkLayerTest, DepthBiasStateNotBound) {
2145 m_errorMonitor->SetDesiredFailureMsg(
2146 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002147 "Dynamic depth bias state not set for this command buffer");
2148
Karl Schultz6addd812016-02-02 17:17:23 -07002149 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
2150 "bias state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002151
Karl Schultz6addd812016-02-02 17:17:23 -07002152 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2153 BsoFailDepthBias);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002154
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002155 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002156}
2157
Karl Schultz6addd812016-02-02 17:17:23 -07002158// Disable these two tests until we can sort out how to track multiple layer
2159// errors
2160TEST_F(VkLayerTest, ViewportStateNotBound) {
2161 m_errorMonitor->SetDesiredFailureMsg(
2162 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002163 "Dynamic viewport state not set for this command buffer");
2164
Karl Schultz6addd812016-02-02 17:17:23 -07002165 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
2166 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002167
Karl Schultz6addd812016-02-02 17:17:23 -07002168 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2169 BsoFailViewport);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002170
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002171 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002172}
2173
Karl Schultz6addd812016-02-02 17:17:23 -07002174TEST_F(VkLayerTest, ScissorStateNotBound) {
2175 m_errorMonitor->SetDesiredFailureMsg(
2176 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002177 "Dynamic scissor state not set for this command buffer");
2178
Karl Schultz6addd812016-02-02 17:17:23 -07002179 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
2180 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002181
Karl Schultz6addd812016-02-02 17:17:23 -07002182 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2183 BsoFailScissor);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002184
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002185 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002186}
2187
Karl Schultz6addd812016-02-02 17:17:23 -07002188TEST_F(VkLayerTest, BlendStateNotBound) {
2189 m_errorMonitor->SetDesiredFailureMsg(
2190 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7a1d2352016-03-28 11:18:19 -06002191 "Dynamic blend constants state not set for this command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002192
Karl Schultz6addd812016-02-02 17:17:23 -07002193 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend "
2194 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002195
Karl Schultz6addd812016-02-02 17:17:23 -07002196 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2197 BsoFailBlend);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002198
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002199 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002200}
2201
Karl Schultz6addd812016-02-02 17:17:23 -07002202TEST_F(VkLayerTest, DepthBoundsStateNotBound) {
2203 m_errorMonitor->SetDesiredFailureMsg(
2204 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002205 "Dynamic depth bounds state not set for this command buffer");
2206
Karl Schultz6addd812016-02-02 17:17:23 -07002207 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
2208 "bounds state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002209
Karl Schultz6addd812016-02-02 17:17:23 -07002210 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2211 BsoFailDepthBounds);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002212
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002213 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002214}
2215
Karl Schultz6addd812016-02-02 17:17:23 -07002216TEST_F(VkLayerTest, StencilReadMaskNotSet) {
2217 m_errorMonitor->SetDesiredFailureMsg(
2218 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002219 "Dynamic stencil read mask state not set for this command buffer");
2220
Tobin Ehlis963a4042015-09-29 08:18:34 -06002221 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002222
Karl Schultz6addd812016-02-02 17:17:23 -07002223 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2224 "read mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002225
Karl Schultz6addd812016-02-02 17:17:23 -07002226 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2227 BsoFailStencilReadMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002228
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002229 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002230}
2231
Karl Schultz6addd812016-02-02 17:17:23 -07002232TEST_F(VkLayerTest, StencilWriteMaskNotSet) {
2233 m_errorMonitor->SetDesiredFailureMsg(
2234 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002235 "Dynamic stencil write mask state not set for this command buffer");
2236
Tobin Ehlis963a4042015-09-29 08:18:34 -06002237 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002238
Karl Schultz6addd812016-02-02 17:17:23 -07002239 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2240 "write mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002241
Karl Schultz6addd812016-02-02 17:17:23 -07002242 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2243 BsoFailStencilWriteMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002244
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002245 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002246}
2247
Karl Schultz6addd812016-02-02 17:17:23 -07002248TEST_F(VkLayerTest, StencilReferenceNotSet) {
2249 m_errorMonitor->SetDesiredFailureMsg(
2250 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002251 "Dynamic stencil reference state not set for this command buffer");
2252
Karl Schultz6addd812016-02-02 17:17:23 -07002253 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2254 "reference is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002255
Karl Schultz6addd812016-02-02 17:17:23 -07002256 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2257 BsoFailStencilReference);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002258
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002259 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002260}
2261
Karl Schultz6addd812016-02-02 17:17:23 -07002262TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002263 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002264
Karl Schultz6addd812016-02-02 17:17:23 -07002265 m_errorMonitor->SetDesiredFailureMsg(
2266 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2267 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2268 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002269
2270 VkFenceCreateInfo fenceInfo = {};
2271 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2272 fenceInfo.pNext = NULL;
2273 fenceInfo.flags = 0;
2274
2275 ASSERT_NO_FATAL_FAILURE(InitState());
2276 ASSERT_NO_FATAL_FAILURE(InitViewport());
2277 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2278
Karl Schultz6addd812016-02-02 17:17:23 -07002279 // We luck out b/c by default the framework creates CB w/ the
2280 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002281 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002282 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2283 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002284 EndCommandBuffer();
2285
2286 testFence.init(*m_device, fenceInfo);
2287
2288 // Bypass framework since it does the waits automatically
2289 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002290 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002291 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2292 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002293 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002294 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002295 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002296 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002297 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002298 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002299 submit_info.pSignalSemaphores = NULL;
2300
Karl Schultz6addd812016-02-02 17:17:23 -07002301 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2302 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002303
Karl Schultz6addd812016-02-02 17:17:23 -07002304 // Cause validation error by re-submitting cmd buffer that should only be
2305 // submitted once
2306 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002307
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002308 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002309}
2310
Karl Schultz6addd812016-02-02 17:17:23 -07002311TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002312 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002313 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002314
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002315 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002316 "Unable to allocate 1 descriptors of "
2317 "type "
2318 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002319
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002320 ASSERT_NO_FATAL_FAILURE(InitState());
2321 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002322
Karl Schultz6addd812016-02-02 17:17:23 -07002323 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
2324 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002325 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002326 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2327 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002328
2329 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002330 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2331 ds_pool_ci.pNext = NULL;
2332 ds_pool_ci.flags = 0;
2333 ds_pool_ci.maxSets = 1;
2334 ds_pool_ci.poolSizeCount = 1;
2335 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002336
2337 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002338 err =
2339 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002340 ASSERT_VK_SUCCESS(err);
2341
2342 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002343 dsl_binding.binding = 0;
2344 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2345 dsl_binding.descriptorCount = 1;
2346 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2347 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002348
2349 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002350 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2351 ds_layout_ci.pNext = NULL;
2352 ds_layout_ci.bindingCount = 1;
2353 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002354
2355 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002356 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2357 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002358 ASSERT_VK_SUCCESS(err);
2359
2360 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002361 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002362 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002363 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002364 alloc_info.descriptorPool = ds_pool;
2365 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002366 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2367 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002368
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002369 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002370
Chia-I Wuf7458c52015-10-26 21:10:41 +08002371 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2372 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002373}
2374
Karl Schultz6addd812016-02-02 17:17:23 -07002375TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
2376 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06002377
Karl Schultz6addd812016-02-02 17:17:23 -07002378 m_errorMonitor->SetDesiredFailureMsg(
2379 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2380 "It is invalid to call vkFreeDescriptorSets() with a pool created "
2381 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002382
Tobin Ehlise735c692015-10-08 13:13:50 -06002383 ASSERT_NO_FATAL_FAILURE(InitState());
2384 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06002385
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002386 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002387 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2388 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06002389
2390 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002391 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2392 ds_pool_ci.pNext = NULL;
2393 ds_pool_ci.maxSets = 1;
2394 ds_pool_ci.poolSizeCount = 1;
2395 ds_pool_ci.flags = 0;
2396 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
2397 // app can only call vkResetDescriptorPool on this pool.;
2398 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06002399
2400 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002401 err =
2402 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06002403 ASSERT_VK_SUCCESS(err);
2404
2405 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002406 dsl_binding.binding = 0;
2407 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2408 dsl_binding.descriptorCount = 1;
2409 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2410 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06002411
2412 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002413 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2414 ds_layout_ci.pNext = NULL;
2415 ds_layout_ci.bindingCount = 1;
2416 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06002417
2418 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002419 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2420 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06002421 ASSERT_VK_SUCCESS(err);
2422
2423 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002424 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002425 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002426 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002427 alloc_info.descriptorPool = ds_pool;
2428 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002429 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2430 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06002431 ASSERT_VK_SUCCESS(err);
2432
2433 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002434 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06002435
Chia-I Wuf7458c52015-10-26 21:10:41 +08002436 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2437 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06002438}
2439
Karl Schultz6addd812016-02-02 17:17:23 -07002440TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002441 // Attempt to clear Descriptor Pool with bad object.
2442 // ObjectTracker should catch this.
2443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2444 "Invalid VkDescriptorPool Object 0xbaad6001");
2445 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
2446 vkResetDescriptorPool(device(), badPool, 0);
2447 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002448}
2449
Karl Schultz6addd812016-02-02 17:17:23 -07002450TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002451 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
2452 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002453 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06002454 // call vkCmdBindDescriptorSets w/ false Descriptor Set
2455 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
2456 VkResult err;
2457 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2458 "Invalid VkDescriptorSet Object 0xbaad6001");
2459
2460 ASSERT_NO_FATAL_FAILURE(InitState());
2461
2462 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
2463 layout_bindings[0].binding = 0;
2464 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2465 layout_bindings[0].descriptorCount = 1;
2466 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2467 layout_bindings[0].pImmutableSamplers = NULL;
2468
2469 VkDescriptorSetLayout descriptor_set_layout;
2470 VkDescriptorSetLayoutCreateInfo dslci = {};
2471 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2472 dslci.pNext = NULL;
2473 dslci.bindingCount = 1;
2474 dslci.pBindings = layout_bindings;
2475 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002476 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002477
2478 VkPipelineLayout pipeline_layout;
2479 VkPipelineLayoutCreateInfo plci = {};
2480 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2481 plci.pNext = NULL;
2482 plci.setLayoutCount = 1;
2483 plci.pSetLayouts = &descriptor_set_layout;
2484 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002485 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002486
2487 BeginCommandBuffer();
2488 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2489 pipeline_layout, 0, 1, &badSet, 0, NULL);
2490 m_errorMonitor->VerifyFound();
2491 EndCommandBuffer();
2492 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
2493 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002494}
2495
Karl Schultz6addd812016-02-02 17:17:23 -07002496TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002497 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
2498 // ObjectTracker should catch this.
2499 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
2500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2501 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
2502
2503 VkPipelineLayout pipeline_layout;
2504 VkPipelineLayoutCreateInfo plci = {};
2505 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2506 plci.pNext = NULL;
2507 plci.setLayoutCount = 1;
2508 plci.pSetLayouts = &bad_layout;
2509 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
2510
2511 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002512}
2513
Karl Schultz6addd812016-02-02 17:17:23 -07002514TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002515 // Attempt to bind an invalid Pipeline to a valid Command Buffer
2516 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002517 // Create a valid cmd buffer
2518 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06002519 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
2520 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2521 "Invalid VkPipeline Object 0xbaad6001");
2522 ASSERT_NO_FATAL_FAILURE(InitState());
2523 BeginCommandBuffer();
2524 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2525 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
2526 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002527}
2528
Karl Schultz6addd812016-02-02 17:17:23 -07002529TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
2530 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
2531 // CommandBuffer
2532 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002533
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002535 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002536
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002537 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06002538 ASSERT_NO_FATAL_FAILURE(InitViewport());
2539 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002540 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002541 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2542 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002543
2544 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002545 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2546 ds_pool_ci.pNext = NULL;
2547 ds_pool_ci.maxSets = 1;
2548 ds_pool_ci.poolSizeCount = 1;
2549 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06002550
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002551 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002552 err =
2553 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002554 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002555
Tony Barboureb254902015-07-15 12:50:33 -06002556 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002557 dsl_binding.binding = 0;
2558 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2559 dsl_binding.descriptorCount = 1;
2560 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2561 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002562
Tony Barboureb254902015-07-15 12:50:33 -06002563 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002564 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2565 ds_layout_ci.pNext = NULL;
2566 ds_layout_ci.bindingCount = 1;
2567 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002568 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002569 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2570 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002571 ASSERT_VK_SUCCESS(err);
2572
2573 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002574 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002575 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002576 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002577 alloc_info.descriptorPool = ds_pool;
2578 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002579 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2580 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002581 ASSERT_VK_SUCCESS(err);
2582
Tony Barboureb254902015-07-15 12:50:33 -06002583 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002584 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2585 pipeline_layout_ci.pNext = NULL;
2586 pipeline_layout_ci.setLayoutCount = 1;
2587 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002588
2589 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002590 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2591 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002592 ASSERT_VK_SUCCESS(err);
2593
Karl Schultz6addd812016-02-02 17:17:23 -07002594 VkShaderObj vs(m_device, bindStateVertShaderText,
2595 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06002596 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07002597 // on more devices
2598 VkShaderObj fs(m_device, bindStateFragShaderText,
2599 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002600
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002601 VkPipelineObj pipe(m_device);
2602 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06002603 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06002604 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002605 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06002606
2607 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002608 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2609 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2610 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2611 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2612 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002613
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002614 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002615
Chia-I Wuf7458c52015-10-26 21:10:41 +08002616 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2617 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2618 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002619}
2620
Karl Schultz6addd812016-02-02 17:17:23 -07002621TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002622 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07002623 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002624
Karl Schultz6addd812016-02-02 17:17:23 -07002625 m_errorMonitor->SetDesiredFailureMsg(
2626 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002627 "Attempt to update descriptor with invalid bufferView ");
2628
2629 ASSERT_NO_FATAL_FAILURE(InitState());
2630 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002631 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2632 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002633
2634 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002635 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2636 ds_pool_ci.pNext = NULL;
2637 ds_pool_ci.maxSets = 1;
2638 ds_pool_ci.poolSizeCount = 1;
2639 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002640
2641 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002642 err =
2643 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002644 ASSERT_VK_SUCCESS(err);
2645
2646 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002647 dsl_binding.binding = 0;
2648 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2649 dsl_binding.descriptorCount = 1;
2650 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2651 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002652
2653 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002654 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2655 ds_layout_ci.pNext = NULL;
2656 ds_layout_ci.bindingCount = 1;
2657 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002658 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002659 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2660 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002661 ASSERT_VK_SUCCESS(err);
2662
2663 VkDescriptorSet descriptorSet;
2664 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002665 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002666 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002667 alloc_info.descriptorPool = ds_pool;
2668 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002669 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2670 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002671 ASSERT_VK_SUCCESS(err);
2672
Karl Schultz6addd812016-02-02 17:17:23 -07002673 VkBufferView view =
2674 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002675 VkWriteDescriptorSet descriptor_write;
2676 memset(&descriptor_write, 0, sizeof(descriptor_write));
2677 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2678 descriptor_write.dstSet = descriptorSet;
2679 descriptor_write.dstBinding = 0;
2680 descriptor_write.descriptorCount = 1;
2681 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2682 descriptor_write.pTexelBufferView = &view;
2683
2684 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2685
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002686 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002687
2688 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2689 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2690}
2691
Karl Schultz6addd812016-02-02 17:17:23 -07002692TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
2693 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
2694 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07002695 // 1. No dynamicOffset supplied
2696 // 2. Too many dynamicOffsets supplied
2697 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07002698 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002700 " requires 1 dynamicOffsets, but only "
2701 "0 dynamicOffsets are left in "
2702 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002703
2704 ASSERT_NO_FATAL_FAILURE(InitState());
2705 ASSERT_NO_FATAL_FAILURE(InitViewport());
2706 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2707
2708 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002709 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2710 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002711
2712 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002713 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2714 ds_pool_ci.pNext = NULL;
2715 ds_pool_ci.maxSets = 1;
2716 ds_pool_ci.poolSizeCount = 1;
2717 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002718
2719 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002720 err =
2721 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002722 ASSERT_VK_SUCCESS(err);
2723
2724 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002725 dsl_binding.binding = 0;
2726 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2727 dsl_binding.descriptorCount = 1;
2728 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2729 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002730
2731 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002732 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2733 ds_layout_ci.pNext = NULL;
2734 ds_layout_ci.bindingCount = 1;
2735 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002736 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002737 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2738 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002739 ASSERT_VK_SUCCESS(err);
2740
2741 VkDescriptorSet descriptorSet;
2742 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002743 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002744 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002745 alloc_info.descriptorPool = ds_pool;
2746 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002747 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2748 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002749 ASSERT_VK_SUCCESS(err);
2750
2751 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002752 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2753 pipeline_layout_ci.pNext = NULL;
2754 pipeline_layout_ci.setLayoutCount = 1;
2755 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002756
2757 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002758 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2759 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002760 ASSERT_VK_SUCCESS(err);
2761
2762 // Create a buffer to update the descriptor with
2763 uint32_t qfi = 0;
2764 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002765 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2766 buffCI.size = 1024;
2767 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2768 buffCI.queueFamilyIndexCount = 1;
2769 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002770
2771 VkBuffer dyub;
2772 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2773 ASSERT_VK_SUCCESS(err);
2774 // Correctly update descriptor to avoid "NOT_UPDATED" error
2775 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002776 buffInfo.buffer = dyub;
2777 buffInfo.offset = 0;
2778 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002779
2780 VkWriteDescriptorSet descriptor_write;
2781 memset(&descriptor_write, 0, sizeof(descriptor_write));
2782 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2783 descriptor_write.dstSet = descriptorSet;
2784 descriptor_write.dstBinding = 0;
2785 descriptor_write.descriptorCount = 1;
2786 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2787 descriptor_write.pBufferInfo = &buffInfo;
2788
2789 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2790
2791 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002792 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2793 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2794 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002795 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002796 uint32_t pDynOff[2] = {512, 756};
2797 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07002798 m_errorMonitor->SetDesiredFailureMsg(
2799 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002800 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07002801 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2802 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2803 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12002804 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002805 // Finally cause error due to dynamicOffset being too big
Karl Schultz6addd812016-02-02 17:17:23 -07002806 m_errorMonitor->SetDesiredFailureMsg(
2807 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002808 " from its update, this oversteps its buffer (");
2809 // Create PSO to be used for draw-time errors below
2810 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002811 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002812 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002813 "out gl_PerVertex { \n"
2814 " vec4 gl_Position;\n"
2815 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002816 "void main(){\n"
2817 " gl_Position = vec4(1);\n"
2818 "}\n";
2819 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002820 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002821 "\n"
2822 "layout(location=0) out vec4 x;\n"
2823 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2824 "void main(){\n"
2825 " x = vec4(bar.y);\n"
2826 "}\n";
2827 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2828 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2829 VkPipelineObj pipe(m_device);
2830 pipe.AddShader(&vs);
2831 pipe.AddShader(&fs);
2832 pipe.AddColorAttachment();
2833 pipe.CreateVKPipeline(pipeline_layout, renderPass());
2834
Karl Schultz6addd812016-02-02 17:17:23 -07002835 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2836 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2837 // This update should succeed, but offset size of 512 will overstep buffer
2838 // /w range 1024 & size 1024
2839 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2840 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2841 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07002842 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002843 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002844
2845 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2846 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2847}
2848
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002849TEST_F(VkLayerTest, InvalidPushConstants) {
2850 // Hit push constant error cases:
2851 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
2852 // 2. Incorrectly set push constant size to 0
2853 // 3. Incorrectly set push constant size to non-multiple of 4
2854 // 4. Attempt push constant update that exceeds maxPushConstantSize
2855 VkResult err;
2856 m_errorMonitor->SetDesiredFailureMsg(
2857 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2858 "vkCreatePipelineLayout() call has push constants with offset ");
2859
2860 ASSERT_NO_FATAL_FAILURE(InitState());
2861 ASSERT_NO_FATAL_FAILURE(InitViewport());
2862 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2863
2864 VkPushConstantRange pc_range = {};
2865 pc_range.size = 0xFFFFFFFFu;
2866 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2867 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
2868 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2869 pipeline_layout_ci.pushConstantRangeCount = 1;
2870 pipeline_layout_ci.pPushConstantRanges = &pc_range;
2871
2872 VkPipelineLayout pipeline_layout;
2873 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2874 &pipeline_layout);
2875
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002876 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002877 // Now cause errors due to size 0 and non-4 byte aligned size
2878 pc_range.size = 0;
2879 m_errorMonitor->SetDesiredFailureMsg(
2880 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2881 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
2882 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2883 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002884 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002885 pc_range.size = 1;
2886 m_errorMonitor->SetDesiredFailureMsg(
2887 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2888 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
2889 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2890 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002891 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002892 // Cause error due to bad size in vkCmdPushConstants() call
2893 m_errorMonitor->SetDesiredFailureMsg(
2894 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2895 "vkCmdPushConstants() call has push constants with offset ");
2896 pipeline_layout_ci.pushConstantRangeCount = 0;
2897 pipeline_layout_ci.pPushConstantRanges = NULL;
2898 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2899 &pipeline_layout);
2900 ASSERT_VK_SUCCESS(err);
2901 BeginCommandBuffer();
2902 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
2903 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002904 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002905 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2906}
2907
Karl Schultz6addd812016-02-02 17:17:23 -07002908TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002909 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07002910 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002911
2912 ASSERT_NO_FATAL_FAILURE(InitState());
2913 ASSERT_NO_FATAL_FAILURE(InitViewport());
2914 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2915
2916 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
2917 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002918 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2919 ds_type_count[0].descriptorCount = 10;
2920 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2921 ds_type_count[1].descriptorCount = 2;
2922 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2923 ds_type_count[2].descriptorCount = 2;
2924 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
2925 ds_type_count[3].descriptorCount = 5;
2926 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
2927 // type
2928 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
2929 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
2930 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002931
2932 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002933 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2934 ds_pool_ci.pNext = NULL;
2935 ds_pool_ci.maxSets = 5;
2936 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
2937 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002938
2939 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002940 err =
2941 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002942 ASSERT_VK_SUCCESS(err);
2943
2944 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
2945 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002946 dsl_binding[0].binding = 0;
2947 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2948 dsl_binding[0].descriptorCount = 5;
2949 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
2950 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002951
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002952 // Create layout identical to set0 layout but w/ different stageFlags
2953 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002954 dsl_fs_stage_only.binding = 0;
2955 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2956 dsl_fs_stage_only.descriptorCount = 5;
2957 dsl_fs_stage_only.stageFlags =
2958 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
2959 // bind time
2960 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002961 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002962 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2963 ds_layout_ci.pNext = NULL;
2964 ds_layout_ci.bindingCount = 1;
2965 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002966 static const uint32_t NUM_LAYOUTS = 4;
2967 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002968 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002969 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
2970 // layout for error case
2971 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2972 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002973 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002974 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002975 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2976 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002977 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002978 dsl_binding[0].binding = 0;
2979 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002980 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002981 dsl_binding[1].binding = 1;
2982 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2983 dsl_binding[1].descriptorCount = 2;
2984 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
2985 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002986 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002987 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07002988 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2989 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002990 ASSERT_VK_SUCCESS(err);
2991 dsl_binding[0].binding = 0;
2992 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002993 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002994 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07002995 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2996 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002997 ASSERT_VK_SUCCESS(err);
2998 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002999 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003000 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3001 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003002 ASSERT_VK_SUCCESS(err);
3003
3004 static const uint32_t NUM_SETS = 4;
3005 VkDescriptorSet descriptorSet[NUM_SETS] = {};
3006 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003007 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003008 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003009 alloc_info.descriptorPool = ds_pool;
3010 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003011 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3012 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003013 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003014 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003015 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003016 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003017 err =
3018 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003019 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003020
3021 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003022 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3023 pipeline_layout_ci.pNext = NULL;
3024 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
3025 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003026
3027 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003028 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3029 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003030 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003031 // Create pipelineLayout with only one setLayout
3032 pipeline_layout_ci.setLayoutCount = 1;
3033 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003034 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3035 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003036 ASSERT_VK_SUCCESS(err);
3037 // Create pipelineLayout with 2 descriptor setLayout at index 0
3038 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
3039 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07003040 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3041 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003042 ASSERT_VK_SUCCESS(err);
3043 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
3044 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
3045 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07003046 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3047 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003048 ASSERT_VK_SUCCESS(err);
3049 // Create pipelineLayout with UB type, but stageFlags for FS only
3050 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
3051 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003052 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3053 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003054 ASSERT_VK_SUCCESS(err);
3055 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
3056 VkDescriptorSetLayout pl_bad_s0[2] = {};
3057 pl_bad_s0[0] = ds_layout_fs_only;
3058 pl_bad_s0[1] = ds_layout[1];
3059 pipeline_layout_ci.setLayoutCount = 2;
3060 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
3061 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07003062 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3063 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003064 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003065
3066 // Create a buffer to update the descriptor with
3067 uint32_t qfi = 0;
3068 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003069 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3070 buffCI.size = 1024;
3071 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3072 buffCI.queueFamilyIndexCount = 1;
3073 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003074
3075 VkBuffer dyub;
3076 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3077 ASSERT_VK_SUCCESS(err);
3078 // Correctly update descriptor to avoid "NOT_UPDATED" error
3079 static const uint32_t NUM_BUFFS = 5;
3080 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003081 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003082 buffInfo[i].buffer = dyub;
3083 buffInfo[i].offset = 0;
3084 buffInfo[i].range = 1024;
3085 }
Karl Schultz6addd812016-02-02 17:17:23 -07003086 VkImage image;
3087 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3088 const int32_t tex_width = 32;
3089 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003090 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003091 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3092 image_create_info.pNext = NULL;
3093 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3094 image_create_info.format = tex_format;
3095 image_create_info.extent.width = tex_width;
3096 image_create_info.extent.height = tex_height;
3097 image_create_info.extent.depth = 1;
3098 image_create_info.mipLevels = 1;
3099 image_create_info.arrayLayers = 1;
3100 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3101 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3102 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3103 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003104 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3105 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003106
Karl Schultz6addd812016-02-02 17:17:23 -07003107 VkMemoryRequirements memReqs;
3108 VkDeviceMemory imageMem;
3109 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003110 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003111 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3112 memAlloc.pNext = NULL;
3113 memAlloc.allocationSize = 0;
3114 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003115 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
3116 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003117 pass =
3118 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003119 ASSERT_TRUE(pass);
3120 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
3121 ASSERT_VK_SUCCESS(err);
3122 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
3123 ASSERT_VK_SUCCESS(err);
3124
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003125 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003126 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3127 image_view_create_info.image = image;
3128 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
3129 image_view_create_info.format = tex_format;
3130 image_view_create_info.subresourceRange.layerCount = 1;
3131 image_view_create_info.subresourceRange.baseMipLevel = 0;
3132 image_view_create_info.subresourceRange.levelCount = 1;
3133 image_view_create_info.subresourceRange.aspectMask =
3134 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003135
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003136 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07003137 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
3138 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003139 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003140 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003141 imageInfo[0].imageView = view;
3142 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3143 imageInfo[1].imageView = view;
3144 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003145 imageInfo[2].imageView = view;
3146 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3147 imageInfo[3].imageView = view;
3148 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003149
3150 static const uint32_t NUM_SET_UPDATES = 3;
3151 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
3152 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3153 descriptor_write[0].dstSet = descriptorSet[0];
3154 descriptor_write[0].dstBinding = 0;
3155 descriptor_write[0].descriptorCount = 5;
3156 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3157 descriptor_write[0].pBufferInfo = buffInfo;
3158 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3159 descriptor_write[1].dstSet = descriptorSet[1];
3160 descriptor_write[1].dstBinding = 0;
3161 descriptor_write[1].descriptorCount = 2;
3162 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3163 descriptor_write[1].pImageInfo = imageInfo;
3164 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3165 descriptor_write[2].dstSet = descriptorSet[1];
3166 descriptor_write[2].dstBinding = 1;
3167 descriptor_write[2].descriptorCount = 2;
3168 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003169 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003170
3171 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003172
Tobin Ehlis88452832015-12-03 09:40:56 -07003173 // Create PSO to be used for draw-time errors below
3174 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003175 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003176 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003177 "out gl_PerVertex {\n"
3178 " vec4 gl_Position;\n"
3179 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003180 "void main(){\n"
3181 " gl_Position = vec4(1);\n"
3182 "}\n";
3183 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003184 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003185 "\n"
3186 "layout(location=0) out vec4 x;\n"
3187 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3188 "void main(){\n"
3189 " x = vec4(bar.y);\n"
3190 "}\n";
3191 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3192 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003193 VkPipelineObj pipe(m_device);
3194 pipe.AddShader(&vs);
3195 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07003196 pipe.AddColorAttachment();
3197 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003198
3199 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003200
Karl Schultz6addd812016-02-02 17:17:23 -07003201 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3202 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3203 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3204 // of PSO
3205 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3206 // cmd_pipeline.c
3207 // due to the fact that cmd_alloc_dset_data() has not been called in
3208 // cmd_bind_graphics_pipeline()
3209 // TODO : Want to cause various binding incompatibility issues here to test
3210 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003211 // First cause various verify_layout_compatibility() fails
3212 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003213 // verify_set_layout_compatibility fail cases:
3214 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3216 " due to: invalid VkPipelineLayout ");
3217 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3218 VK_PIPELINE_BIND_POINT_GRAPHICS,
3219 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3220 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003221 m_errorMonitor->VerifyFound();
3222
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003223 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3225 " attempting to bind set to index 1");
3226 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3227 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3228 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003229 m_errorMonitor->VerifyFound();
3230
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003231 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003232 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3233 // descriptors
3234 m_errorMonitor->SetDesiredFailureMsg(
3235 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003236 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003237 vkCmdBindDescriptorSets(
3238 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3239 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003240 m_errorMonitor->VerifyFound();
3241
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003242 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3243 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003244 m_errorMonitor->SetDesiredFailureMsg(
3245 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003246 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07003247 vkCmdBindDescriptorSets(
3248 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3249 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003250 m_errorMonitor->VerifyFound();
3251
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003252 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3253 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003254 m_errorMonitor->SetDesiredFailureMsg(
3255 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003256 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003257 vkCmdBindDescriptorSets(
3258 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3259 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003260 m_errorMonitor->VerifyFound();
3261
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003262 // Cause INFO messages due to disturbing previously bound Sets
3263 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003264 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3265 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3266 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003267 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07003268 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003269 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003270 " previously bound as set #0 was disturbed ");
3271 vkCmdBindDescriptorSets(
3272 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3273 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003274 m_errorMonitor->VerifyFound();
3275
Karl Schultz6addd812016-02-02 17:17:23 -07003276 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3277 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3278 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003279 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003280 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003281 " newly bound as set #0 so set #1 and "
3282 "any subsequent sets were disturbed ");
3283 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3284 VK_PIPELINE_BIND_POINT_GRAPHICS,
3285 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003286 m_errorMonitor->VerifyFound();
3287
Tobin Ehlis88452832015-12-03 09:40:56 -07003288 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07003289 // 1. Error due to not binding required set (we actually use same code as
3290 // above to disturb set0)
3291 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3292 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3293 2, &descriptorSet[0], 0, NULL);
3294 vkCmdBindDescriptorSets(
3295 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3296 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
3297 m_errorMonitor->SetDesiredFailureMsg(
3298 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3299 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07003300 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003301 m_errorMonitor->VerifyFound();
3302
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003303 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003304 // 2. Error due to bound set not being compatible with PSO's
3305 // VkPipelineLayout (diff stageFlags in this case)
3306 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3307 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3308 2, &descriptorSet[0], 0, NULL);
3309 m_errorMonitor->SetDesiredFailureMsg(
3310 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3311 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07003312 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003313 m_errorMonitor->VerifyFound();
3314
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003315 // Remaining clean-up
3316 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003317 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003318 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
3319 }
3320 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
3321 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
3322 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003323 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3324 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3325}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003326
Karl Schultz6addd812016-02-02 17:17:23 -07003327TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003328
Karl Schultz6addd812016-02-02 17:17:23 -07003329 m_errorMonitor->SetDesiredFailureMsg(
3330 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003331 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003332
3333 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003334 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003335 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003336 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003337
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003338 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003339}
3340
Karl Schultz6addd812016-02-02 17:17:23 -07003341TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3342 VkResult err;
3343 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003344
Karl Schultz6addd812016-02-02 17:17:23 -07003345 m_errorMonitor->SetDesiredFailureMsg(
3346 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003347 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003348
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003349 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003350
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003351 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003352 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003353 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003354 cmd.commandPool = m_commandPool;
3355 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003356 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003357
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003358 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003359 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003360
3361 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003362 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003363 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003364 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003365 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003366 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3367 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003368 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003369
3370 // The error should be caught by validation of the BeginCommandBuffer call
3371 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3372
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003373 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003374 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003375}
3376
Karl Schultz6addd812016-02-02 17:17:23 -07003377TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003378 // Cause error due to Begin while recording CB
3379 // Then cause 2 errors for attempting to reset CB w/o having
3380 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3381 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003383 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003384
3385 ASSERT_NO_FATAL_FAILURE(InitState());
3386
3387 // Calls AllocateCommandBuffers
3388 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3389
Karl Schultz6addd812016-02-02 17:17:23 -07003390 // Force the failure by setting the Renderpass and Framebuffer fields with
3391 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003392 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003393 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003394 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3395 cmd_buf_info.pNext = NULL;
3396 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003397 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003398
3399 // Begin CB to transition to recording state
3400 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3401 // Can't re-begin. This should trigger error
3402 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003403 m_errorMonitor->VerifyFound();
3404
Karl Schultz6addd812016-02-02 17:17:23 -07003405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3406 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003407 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3408 // Reset attempt will trigger error due to incorrect CommandPool state
3409 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003410 m_errorMonitor->VerifyFound();
3411
Karl Schultz6addd812016-02-02 17:17:23 -07003412 m_errorMonitor->SetDesiredFailureMsg(
3413 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3414 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003415 // Transition CB to RECORDED state
3416 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3417 // Now attempting to Begin will implicitly reset, which triggers error
3418 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003419 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003420}
3421
Karl Schultz6addd812016-02-02 17:17:23 -07003422TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003423 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003424 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003425
Karl Schultz6addd812016-02-02 17:17:23 -07003426 m_errorMonitor->SetDesiredFailureMsg(
3427 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003428 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3429
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003430 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003431 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003432
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003433 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003434 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3435 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003436
3437 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003438 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3439 ds_pool_ci.pNext = NULL;
3440 ds_pool_ci.maxSets = 1;
3441 ds_pool_ci.poolSizeCount = 1;
3442 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003443
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003444 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003445 err =
3446 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003447 ASSERT_VK_SUCCESS(err);
3448
Tony Barboureb254902015-07-15 12:50:33 -06003449 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003450 dsl_binding.binding = 0;
3451 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3452 dsl_binding.descriptorCount = 1;
3453 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3454 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003455
Tony Barboureb254902015-07-15 12:50:33 -06003456 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003457 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3458 ds_layout_ci.pNext = NULL;
3459 ds_layout_ci.bindingCount = 1;
3460 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003461
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003462 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003463 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3464 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003465 ASSERT_VK_SUCCESS(err);
3466
3467 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003468 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003469 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003470 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003471 alloc_info.descriptorPool = ds_pool;
3472 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003473 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3474 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003475 ASSERT_VK_SUCCESS(err);
3476
Tony Barboureb254902015-07-15 12:50:33 -06003477 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003478 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3479 pipeline_layout_ci.setLayoutCount = 1;
3480 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003481
3482 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003483 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3484 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003485 ASSERT_VK_SUCCESS(err);
3486
Tobin Ehlise68360f2015-10-01 11:15:13 -06003487 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07003488 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06003489
3490 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003491 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3492 vp_state_ci.scissorCount = 1;
3493 vp_state_ci.pScissors = &sc;
3494 vp_state_ci.viewportCount = 1;
3495 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003496
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003497 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3498 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3499 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3500 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3501 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3502 rs_state_ci.depthClampEnable = VK_FALSE;
3503 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3504 rs_state_ci.depthBiasEnable = VK_FALSE;
3505
Tony Barboureb254902015-07-15 12:50:33 -06003506 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003507 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3508 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003509 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003510 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3511 gp_ci.layout = pipeline_layout;
3512 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06003513
3514 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003515 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3516 pc_ci.initialDataSize = 0;
3517 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003518
3519 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003520 VkPipelineCache pipelineCache;
3521
Karl Schultz6addd812016-02-02 17:17:23 -07003522 err =
3523 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06003524 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003525 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3526 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003527
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003528 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003529
Chia-I Wuf7458c52015-10-26 21:10:41 +08003530 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3531 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3532 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3533 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003534}
Tobin Ehlis912df022015-09-17 08:46:18 -06003535/*// TODO : This test should be good, but needs Tess support in compiler to run
3536TEST_F(VkLayerTest, InvalidPatchControlPoints)
3537{
3538 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06003539 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003540
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003542 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
3543primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003544
Tobin Ehlis912df022015-09-17 08:46:18 -06003545 ASSERT_NO_FATAL_FAILURE(InitState());
3546 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06003547
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003548 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06003549 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003550 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003551
3552 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3553 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3554 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003555 ds_pool_ci.poolSizeCount = 1;
3556 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06003557
3558 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003559 err = vkCreateDescriptorPool(m_device->device(),
3560VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06003561 ASSERT_VK_SUCCESS(err);
3562
3563 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08003564 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06003565 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08003566 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003567 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3568 dsl_binding.pImmutableSamplers = NULL;
3569
3570 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003571 ds_layout_ci.sType =
3572VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003573 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003574 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003575 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06003576
3577 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003578 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3579&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003580 ASSERT_VK_SUCCESS(err);
3581
3582 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003583 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
3584VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06003585 ASSERT_VK_SUCCESS(err);
3586
3587 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003588 pipeline_layout_ci.sType =
3589VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003590 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003591 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003592 pipeline_layout_ci.pSetLayouts = &ds_layout;
3593
3594 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003595 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3596&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003597 ASSERT_VK_SUCCESS(err);
3598
3599 VkPipelineShaderStageCreateInfo shaderStages[3];
3600 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
3601
Karl Schultz6addd812016-02-02 17:17:23 -07003602 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
3603this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003604 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07003605 VkShaderObj
3606tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
3607this);
3608 VkShaderObj
3609te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
3610this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003611
Karl Schultz6addd812016-02-02 17:17:23 -07003612 shaderStages[0].sType =
3613VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003614 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003615 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003616 shaderStages[1].sType =
3617VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003618 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003619 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003620 shaderStages[2].sType =
3621VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003622 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003623 shaderStages[2].shader = te.handle();
3624
3625 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003626 iaCI.sType =
3627VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08003628 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06003629
3630 VkPipelineTessellationStateCreateInfo tsCI = {};
3631 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
3632 tsCI.patchControlPoints = 0; // This will cause an error
3633
3634 VkGraphicsPipelineCreateInfo gp_ci = {};
3635 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3636 gp_ci.pNext = NULL;
3637 gp_ci.stageCount = 3;
3638 gp_ci.pStages = shaderStages;
3639 gp_ci.pVertexInputState = NULL;
3640 gp_ci.pInputAssemblyState = &iaCI;
3641 gp_ci.pTessellationState = &tsCI;
3642 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003643 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06003644 gp_ci.pMultisampleState = NULL;
3645 gp_ci.pDepthStencilState = NULL;
3646 gp_ci.pColorBlendState = NULL;
3647 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3648 gp_ci.layout = pipeline_layout;
3649 gp_ci.renderPass = renderPass();
3650
3651 VkPipelineCacheCreateInfo pc_ci = {};
3652 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3653 pc_ci.pNext = NULL;
3654 pc_ci.initialSize = 0;
3655 pc_ci.initialData = 0;
3656 pc_ci.maxSize = 0;
3657
3658 VkPipeline pipeline;
3659 VkPipelineCache pipelineCache;
3660
Karl Schultz6addd812016-02-02 17:17:23 -07003661 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
3662&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06003663 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003664 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3665&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06003666
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003667 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003668
Chia-I Wuf7458c52015-10-26 21:10:41 +08003669 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3670 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3671 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3672 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06003673}
3674*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06003675// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07003676TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07003677 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003678
Karl Schultz6addd812016-02-02 17:17:23 -07003679 m_errorMonitor->SetDesiredFailureMsg(
3680 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003681 "Gfx Pipeline viewport count (1) must match scissor count (0).");
3682
Tobin Ehlise68360f2015-10-01 11:15:13 -06003683 ASSERT_NO_FATAL_FAILURE(InitState());
3684 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003685
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003686 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003687 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3688 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003689
3690 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003691 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3692 ds_pool_ci.maxSets = 1;
3693 ds_pool_ci.poolSizeCount = 1;
3694 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003695
3696 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003697 err =
3698 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003699 ASSERT_VK_SUCCESS(err);
3700
3701 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003702 dsl_binding.binding = 0;
3703 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3704 dsl_binding.descriptorCount = 1;
3705 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003706
3707 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003708 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3709 ds_layout_ci.bindingCount = 1;
3710 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003711
3712 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003713 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3714 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003715 ASSERT_VK_SUCCESS(err);
3716
3717 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003718 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003719 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003720 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003721 alloc_info.descriptorPool = ds_pool;
3722 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003723 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3724 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003725 ASSERT_VK_SUCCESS(err);
3726
3727 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003728 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3729 pipeline_layout_ci.setLayoutCount = 1;
3730 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003731
3732 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003733 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3734 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003735 ASSERT_VK_SUCCESS(err);
3736
3737 VkViewport vp = {}; // Just need dummy vp to point to
3738
3739 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003740 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3741 vp_state_ci.scissorCount = 0;
3742 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
3743 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003744
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003745 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3746 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3747 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3748 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3749 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3750 rs_state_ci.depthClampEnable = VK_FALSE;
3751 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3752 rs_state_ci.depthBiasEnable = VK_FALSE;
3753
Cody Northropeb3a6c12015-10-05 14:44:45 -06003754 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003755 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003756
Karl Schultz6addd812016-02-02 17:17:23 -07003757 VkShaderObj vs(m_device, bindStateVertShaderText,
3758 VK_SHADER_STAGE_VERTEX_BIT, this);
3759 VkShaderObj fs(m_device, bindStateFragShaderText,
3760 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003761 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003762 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003763 shaderStages[0] = vs.GetStageCreateInfo();
3764 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003765
3766 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003767 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3768 gp_ci.stageCount = 2;
3769 gp_ci.pStages = shaderStages;
3770 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003771 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003772 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3773 gp_ci.layout = pipeline_layout;
3774 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003775
3776 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003777 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003778
3779 VkPipeline pipeline;
3780 VkPipelineCache pipelineCache;
3781
Karl Schultz6addd812016-02-02 17:17:23 -07003782 err =
3783 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003784 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003785 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3786 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003787
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003788 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003789
Chia-I Wuf7458c52015-10-26 21:10:41 +08003790 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3791 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3792 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3793 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003794}
Karl Schultz6addd812016-02-02 17:17:23 -07003795// Don't set viewport state in PSO. This is an error b/c we always need this
3796// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06003797// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07003798TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06003799 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003800 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003801
Karl Schultz6addd812016-02-02 17:17:23 -07003802 m_errorMonitor->SetDesiredFailureMsg(
3803 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003804 "Gfx Pipeline pViewportState is null. Even if ");
3805
Tobin Ehlise68360f2015-10-01 11:15:13 -06003806 ASSERT_NO_FATAL_FAILURE(InitState());
3807 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003808
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003809 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003810 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3811 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003812
3813 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003814 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3815 ds_pool_ci.maxSets = 1;
3816 ds_pool_ci.poolSizeCount = 1;
3817 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003818
3819 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003820 err =
3821 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003822 ASSERT_VK_SUCCESS(err);
3823
3824 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003825 dsl_binding.binding = 0;
3826 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3827 dsl_binding.descriptorCount = 1;
3828 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003829
3830 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003831 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3832 ds_layout_ci.bindingCount = 1;
3833 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003834
3835 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003836 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3837 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003838 ASSERT_VK_SUCCESS(err);
3839
3840 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003841 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003842 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003843 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003844 alloc_info.descriptorPool = ds_pool;
3845 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003846 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3847 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003848 ASSERT_VK_SUCCESS(err);
3849
3850 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003851 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3852 pipeline_layout_ci.setLayoutCount = 1;
3853 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003854
3855 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003856 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3857 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003858 ASSERT_VK_SUCCESS(err);
3859
3860 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3861 // Set scissor as dynamic to avoid second error
3862 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003863 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3864 dyn_state_ci.dynamicStateCount = 1;
3865 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003866
Cody Northropeb3a6c12015-10-05 14:44:45 -06003867 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003868 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003869
Karl Schultz6addd812016-02-02 17:17:23 -07003870 VkShaderObj vs(m_device, bindStateVertShaderText,
3871 VK_SHADER_STAGE_VERTEX_BIT, this);
3872 VkShaderObj fs(m_device, bindStateFragShaderText,
3873 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003874 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003875 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003876 shaderStages[0] = vs.GetStageCreateInfo();
3877 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003878
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003879
3880 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3881 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3882 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3883 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3884 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3885 rs_state_ci.depthClampEnable = VK_FALSE;
3886 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3887 rs_state_ci.depthBiasEnable = VK_FALSE;
3888
Tobin Ehlise68360f2015-10-01 11:15:13 -06003889 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003890 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3891 gp_ci.stageCount = 2;
3892 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003893 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003894 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
3895 // should cause validation error
3896 gp_ci.pDynamicState = &dyn_state_ci;
3897 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3898 gp_ci.layout = pipeline_layout;
3899 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003900
3901 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003902 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003903
3904 VkPipeline pipeline;
3905 VkPipelineCache pipelineCache;
3906
Karl Schultz6addd812016-02-02 17:17:23 -07003907 err =
3908 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003909 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003910 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3911 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003912
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003913 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003914
Chia-I Wuf7458c52015-10-26 21:10:41 +08003915 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3916 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3917 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3918 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003919}
3920// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07003921// Then run second test where dynamic scissor count doesn't match PSO scissor
3922// count
3923TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
3924 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003925
Karl Schultz6addd812016-02-02 17:17:23 -07003926 m_errorMonitor->SetDesiredFailureMsg(
3927 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003928 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
3929
Tobin Ehlise68360f2015-10-01 11:15:13 -06003930 ASSERT_NO_FATAL_FAILURE(InitState());
3931 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003932
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003933 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003934 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3935 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003936
3937 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003938 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3939 ds_pool_ci.maxSets = 1;
3940 ds_pool_ci.poolSizeCount = 1;
3941 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003942
3943 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003944 err =
3945 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003946 ASSERT_VK_SUCCESS(err);
3947
3948 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003949 dsl_binding.binding = 0;
3950 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3951 dsl_binding.descriptorCount = 1;
3952 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003953
3954 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003955 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3956 ds_layout_ci.bindingCount = 1;
3957 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003958
3959 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003960 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3961 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003962 ASSERT_VK_SUCCESS(err);
3963
3964 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003965 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003966 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003967 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003968 alloc_info.descriptorPool = ds_pool;
3969 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003970 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3971 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003972 ASSERT_VK_SUCCESS(err);
3973
3974 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003975 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3976 pipeline_layout_ci.setLayoutCount = 1;
3977 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003978
3979 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003980 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3981 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003982 ASSERT_VK_SUCCESS(err);
3983
3984 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003985 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3986 vp_state_ci.viewportCount = 1;
3987 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
3988 vp_state_ci.scissorCount = 1;
3989 vp_state_ci.pScissors =
3990 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06003991
3992 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3993 // Set scissor as dynamic to avoid that error
3994 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003995 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3996 dyn_state_ci.dynamicStateCount = 1;
3997 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003998
Cody Northropeb3a6c12015-10-05 14:44:45 -06003999 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004000 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004001
Karl Schultz6addd812016-02-02 17:17:23 -07004002 VkShaderObj vs(m_device, bindStateVertShaderText,
4003 VK_SHADER_STAGE_VERTEX_BIT, this);
4004 VkShaderObj fs(m_device, bindStateFragShaderText,
4005 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004006 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004007 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004008 shaderStages[0] = vs.GetStageCreateInfo();
4009 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004010
Cody Northropf6622dc2015-10-06 10:33:21 -06004011 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4012 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4013 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004014 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004015 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004016 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004017 vi_ci.pVertexAttributeDescriptions = nullptr;
4018
4019 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4020 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4021 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4022
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004023 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004024 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06004025 rs_ci.pNext = nullptr;
4026
Mark Youngc89c6312016-03-31 16:03:20 -06004027 VkPipelineColorBlendAttachmentState att = {};
4028 att.blendEnable = VK_FALSE;
4029 att.colorWriteMask = 0xf;
4030
Cody Northropf6622dc2015-10-06 10:33:21 -06004031 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4032 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4033 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004034 cb_ci.attachmentCount = 1;
4035 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06004036
Tobin Ehlise68360f2015-10-01 11:15:13 -06004037 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004038 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4039 gp_ci.stageCount = 2;
4040 gp_ci.pStages = shaderStages;
4041 gp_ci.pVertexInputState = &vi_ci;
4042 gp_ci.pInputAssemblyState = &ia_ci;
4043 gp_ci.pViewportState = &vp_state_ci;
4044 gp_ci.pRasterizationState = &rs_ci;
4045 gp_ci.pColorBlendState = &cb_ci;
4046 gp_ci.pDynamicState = &dyn_state_ci;
4047 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4048 gp_ci.layout = pipeline_layout;
4049 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004050
4051 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004052 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004053
4054 VkPipeline pipeline;
4055 VkPipelineCache pipelineCache;
4056
Karl Schultz6addd812016-02-02 17:17:23 -07004057 err =
4058 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004059 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004060 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4061 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004062
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004063 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004064
Tobin Ehlisd332f282015-10-02 11:00:56 -06004065 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07004066 // First need to successfully create the PSO from above by setting
4067 // pViewports
4068 m_errorMonitor->SetDesiredFailureMsg(
4069 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4070 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
4071 "scissorCount is 1. These counts must match.");
4072
4073 VkViewport vp = {}; // Just need dummy vp to point to
4074 vp_state_ci.pViewports = &vp;
4075 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4076 &gp_ci, NULL, &pipeline);
4077 ASSERT_VK_SUCCESS(err);
4078 BeginCommandBuffer();
4079 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4080 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4081 VkRect2D scissors[2] = {}; // don't care about data
4082 // Count of 2 doesn't match PSO count of 1
4083 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
4084 Draw(1, 0, 0, 0);
4085
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004086 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004087
4088 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4089 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4090 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4091 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4092}
4093// Create PSO w/o non-zero scissorCount but no scissor data
4094// Then run second test where dynamic viewportCount doesn't match PSO
4095// viewportCount
4096TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
4097 VkResult err;
4098
4099 m_errorMonitor->SetDesiredFailureMsg(
4100 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4101 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
4102
4103 ASSERT_NO_FATAL_FAILURE(InitState());
4104 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4105
4106 VkDescriptorPoolSize ds_type_count = {};
4107 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4108 ds_type_count.descriptorCount = 1;
4109
4110 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4111 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4112 ds_pool_ci.maxSets = 1;
4113 ds_pool_ci.poolSizeCount = 1;
4114 ds_pool_ci.pPoolSizes = &ds_type_count;
4115
4116 VkDescriptorPool ds_pool;
4117 err =
4118 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4119 ASSERT_VK_SUCCESS(err);
4120
4121 VkDescriptorSetLayoutBinding dsl_binding = {};
4122 dsl_binding.binding = 0;
4123 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4124 dsl_binding.descriptorCount = 1;
4125 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4126
4127 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4128 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4129 ds_layout_ci.bindingCount = 1;
4130 ds_layout_ci.pBindings = &dsl_binding;
4131
4132 VkDescriptorSetLayout ds_layout;
4133 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4134 &ds_layout);
4135 ASSERT_VK_SUCCESS(err);
4136
4137 VkDescriptorSet descriptorSet;
4138 VkDescriptorSetAllocateInfo alloc_info = {};
4139 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4140 alloc_info.descriptorSetCount = 1;
4141 alloc_info.descriptorPool = ds_pool;
4142 alloc_info.pSetLayouts = &ds_layout;
4143 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4144 &descriptorSet);
4145 ASSERT_VK_SUCCESS(err);
4146
4147 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4148 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4149 pipeline_layout_ci.setLayoutCount = 1;
4150 pipeline_layout_ci.pSetLayouts = &ds_layout;
4151
4152 VkPipelineLayout pipeline_layout;
4153 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4154 &pipeline_layout);
4155 ASSERT_VK_SUCCESS(err);
4156
4157 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4158 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4159 vp_state_ci.scissorCount = 1;
4160 vp_state_ci.pScissors =
4161 NULL; // Null scissor w/ count of 1 should cause error
4162 vp_state_ci.viewportCount = 1;
4163 vp_state_ci.pViewports =
4164 NULL; // vp is dynamic (below) so this won't cause error
4165
4166 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
4167 // Set scissor as dynamic to avoid that error
4168 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4169 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4170 dyn_state_ci.dynamicStateCount = 1;
4171 dyn_state_ci.pDynamicStates = &vp_state;
4172
4173 VkPipelineShaderStageCreateInfo shaderStages[2];
4174 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4175
4176 VkShaderObj vs(m_device, bindStateVertShaderText,
4177 VK_SHADER_STAGE_VERTEX_BIT, this);
4178 VkShaderObj fs(m_device, bindStateFragShaderText,
4179 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004180 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004181 // but add it to be able to run on more devices
4182 shaderStages[0] = vs.GetStageCreateInfo();
4183 shaderStages[1] = fs.GetStageCreateInfo();
4184
4185 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4186 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4187 vi_ci.pNext = nullptr;
4188 vi_ci.vertexBindingDescriptionCount = 0;
4189 vi_ci.pVertexBindingDescriptions = nullptr;
4190 vi_ci.vertexAttributeDescriptionCount = 0;
4191 vi_ci.pVertexAttributeDescriptions = nullptr;
4192
4193 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4194 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4195 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4196
4197 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4198 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4199 rs_ci.pNext = nullptr;
4200
Mark Youngc89c6312016-03-31 16:03:20 -06004201 VkPipelineColorBlendAttachmentState att = {};
4202 att.blendEnable = VK_FALSE;
4203 att.colorWriteMask = 0xf;
4204
Karl Schultz6addd812016-02-02 17:17:23 -07004205 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4206 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4207 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004208 cb_ci.attachmentCount = 1;
4209 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004210
4211 VkGraphicsPipelineCreateInfo gp_ci = {};
4212 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4213 gp_ci.stageCount = 2;
4214 gp_ci.pStages = shaderStages;
4215 gp_ci.pVertexInputState = &vi_ci;
4216 gp_ci.pInputAssemblyState = &ia_ci;
4217 gp_ci.pViewportState = &vp_state_ci;
4218 gp_ci.pRasterizationState = &rs_ci;
4219 gp_ci.pColorBlendState = &cb_ci;
4220 gp_ci.pDynamicState = &dyn_state_ci;
4221 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4222 gp_ci.layout = pipeline_layout;
4223 gp_ci.renderPass = renderPass();
4224
4225 VkPipelineCacheCreateInfo pc_ci = {};
4226 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4227
4228 VkPipeline pipeline;
4229 VkPipelineCache pipelineCache;
4230
4231 err =
4232 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4233 ASSERT_VK_SUCCESS(err);
4234 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4235 &gp_ci, NULL, &pipeline);
4236
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004237 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004238
4239 // Now hit second fail case where we set scissor w/ different count than PSO
4240 // First need to successfully create the PSO from above by setting
4241 // pViewports
4242 m_errorMonitor->SetDesiredFailureMsg(
4243 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4244 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4245 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004246
Tobin Ehlisd332f282015-10-02 11:00:56 -06004247 VkRect2D sc = {}; // Just need dummy vp to point to
4248 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004249 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4250 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004251 ASSERT_VK_SUCCESS(err);
4252 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004253 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4254 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004255 VkViewport viewports[2] = {}; // don't care about data
4256 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004257 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004258 Draw(1, 0, 0, 0);
4259
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004260 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004261
Chia-I Wuf7458c52015-10-26 21:10:41 +08004262 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4263 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4264 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4265 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004266}
4267
Mark Young7394fdd2016-03-31 14:56:43 -06004268TEST_F(VkLayerTest, PSOLineWidthInvalid) {
4269 VkResult err;
4270
4271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4272 "Attempt to set lineWidth to 0");
4273
4274 ASSERT_NO_FATAL_FAILURE(InitState());
4275 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4276
4277 VkDescriptorPoolSize ds_type_count = {};
4278 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4279 ds_type_count.descriptorCount = 1;
4280
4281 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4282 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4283 ds_pool_ci.maxSets = 1;
4284 ds_pool_ci.poolSizeCount = 1;
4285 ds_pool_ci.pPoolSizes = &ds_type_count;
4286
4287 VkDescriptorPool ds_pool;
4288 err =
4289 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4290 ASSERT_VK_SUCCESS(err);
4291
4292 VkDescriptorSetLayoutBinding dsl_binding = {};
4293 dsl_binding.binding = 0;
4294 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4295 dsl_binding.descriptorCount = 1;
4296 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4297
4298 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4299 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4300 ds_layout_ci.bindingCount = 1;
4301 ds_layout_ci.pBindings = &dsl_binding;
4302
4303 VkDescriptorSetLayout ds_layout;
4304 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4305 &ds_layout);
4306 ASSERT_VK_SUCCESS(err);
4307
4308 VkDescriptorSet descriptorSet;
4309 VkDescriptorSetAllocateInfo alloc_info = {};
4310 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4311 alloc_info.descriptorSetCount = 1;
4312 alloc_info.descriptorPool = ds_pool;
4313 alloc_info.pSetLayouts = &ds_layout;
4314 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4315 &descriptorSet);
4316 ASSERT_VK_SUCCESS(err);
4317
4318 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4319 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4320 pipeline_layout_ci.setLayoutCount = 1;
4321 pipeline_layout_ci.pSetLayouts = &ds_layout;
4322
4323 VkPipelineLayout pipeline_layout;
4324 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4325 &pipeline_layout);
4326 ASSERT_VK_SUCCESS(err);
4327
4328 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4329 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4330 vp_state_ci.scissorCount = 1;
4331 vp_state_ci.pScissors = NULL;
4332 vp_state_ci.viewportCount = 1;
4333 vp_state_ci.pViewports = NULL;
4334
4335 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
4336 VK_DYNAMIC_STATE_SCISSOR,
4337 VK_DYNAMIC_STATE_LINE_WIDTH};
4338 // Set scissor as dynamic to avoid that error
4339 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4340 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4341 dyn_state_ci.dynamicStateCount = 2;
4342 dyn_state_ci.pDynamicStates = dynamic_states;
4343
4344 VkPipelineShaderStageCreateInfo shaderStages[2];
4345 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4346
4347 VkShaderObj vs(m_device, bindStateVertShaderText,
4348 VK_SHADER_STAGE_VERTEX_BIT, this);
4349 VkShaderObj fs(m_device, bindStateFragShaderText,
4350 VK_SHADER_STAGE_FRAGMENT_BIT,
4351 this); // TODO - We shouldn't need a fragment shader
4352 // but add it to be able to run on more devices
4353 shaderStages[0] = vs.GetStageCreateInfo();
4354 shaderStages[1] = fs.GetStageCreateInfo();
4355
4356 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4357 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4358 vi_ci.pNext = nullptr;
4359 vi_ci.vertexBindingDescriptionCount = 0;
4360 vi_ci.pVertexBindingDescriptions = nullptr;
4361 vi_ci.vertexAttributeDescriptionCount = 0;
4362 vi_ci.pVertexAttributeDescriptions = nullptr;
4363
4364 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4365 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4366 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4367
4368 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4369 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4370 rs_ci.pNext = nullptr;
4371
4372 // Check too low (line width of 0.0f).
4373 rs_ci.lineWidth = 0.0f;
4374
4375 VkPipelineColorBlendAttachmentState att = {};
4376 att.blendEnable = VK_FALSE;
4377 att.colorWriteMask = 0xf;
4378
4379 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4380 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4381 cb_ci.pNext = nullptr;
4382 cb_ci.attachmentCount = 1;
4383 cb_ci.pAttachments = &att;
4384
4385 VkGraphicsPipelineCreateInfo gp_ci = {};
4386 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4387 gp_ci.stageCount = 2;
4388 gp_ci.pStages = shaderStages;
4389 gp_ci.pVertexInputState = &vi_ci;
4390 gp_ci.pInputAssemblyState = &ia_ci;
4391 gp_ci.pViewportState = &vp_state_ci;
4392 gp_ci.pRasterizationState = &rs_ci;
4393 gp_ci.pColorBlendState = &cb_ci;
4394 gp_ci.pDynamicState = &dyn_state_ci;
4395 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4396 gp_ci.layout = pipeline_layout;
4397 gp_ci.renderPass = renderPass();
4398
4399 VkPipelineCacheCreateInfo pc_ci = {};
4400 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4401
4402 VkPipeline pipeline;
4403 VkPipelineCache pipelineCache;
4404
4405 err =
4406 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4407 ASSERT_VK_SUCCESS(err);
4408 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4409 &gp_ci, NULL, &pipeline);
4410
4411 m_errorMonitor->VerifyFound();
4412
4413 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4414 "Attempt to set lineWidth to 65536");
4415
4416 // Check too high (line width of 65536.0f).
4417 rs_ci.lineWidth = 65536.0f;
4418
4419 err =
4420 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4421 ASSERT_VK_SUCCESS(err);
4422 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4423 &gp_ci, NULL, &pipeline);
4424
4425 m_errorMonitor->VerifyFound();
4426
4427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4428 "Attempt to set lineWidth to 0");
4429
4430 dyn_state_ci.dynamicStateCount = 3;
4431
4432 rs_ci.lineWidth = 1.0f;
4433
4434 err =
4435 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4436 ASSERT_VK_SUCCESS(err);
4437 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4438 &gp_ci, NULL, &pipeline);
4439 BeginCommandBuffer();
4440 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4441 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4442
4443 // Check too low with dynamic setting.
4444 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 0.0f);
4445 m_errorMonitor->VerifyFound();
4446
4447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4448 "Attempt to set lineWidth to 65536");
4449
4450 // Check too high with dynamic setting.
4451 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
4452 m_errorMonitor->VerifyFound();
4453 EndCommandBuffer();
4454
4455 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4456 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4457 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4458 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4459}
4460
Karl Schultz6addd812016-02-02 17:17:23 -07004461TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004462 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004463 m_errorMonitor->SetDesiredFailureMsg(
4464 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004465 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004466
4467 ASSERT_NO_FATAL_FAILURE(InitState());
4468 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004469
Tony Barbourfe3351b2015-07-28 10:17:20 -06004470 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004471 // Don't care about RenderPass handle b/c error should be flagged before
4472 // that
4473 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
4474 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004475
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004476 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004477}
4478
Karl Schultz6addd812016-02-02 17:17:23 -07004479TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004480 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004481 m_errorMonitor->SetDesiredFailureMsg(
4482 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004483 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004484
4485 ASSERT_NO_FATAL_FAILURE(InitState());
4486 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004487
Tony Barbourfe3351b2015-07-28 10:17:20 -06004488 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004489 // Just create a dummy Renderpass that's non-NULL so we can get to the
4490 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06004491 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004492 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4493 rp_begin.pNext = NULL;
4494 rp_begin.renderPass = renderPass();
4495 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004496
Karl Schultz6addd812016-02-02 17:17:23 -07004497 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
4498 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004499
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004500 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004501}
4502
Karl Schultz6addd812016-02-02 17:17:23 -07004503TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004504 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004505 m_errorMonitor->SetDesiredFailureMsg(
4506 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004507 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004508
4509 ASSERT_NO_FATAL_FAILURE(InitState());
4510 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004511
4512 // Renderpass is started here
4513 BeginCommandBuffer();
4514
4515 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004516 vk_testing::Buffer dstBuffer;
4517 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004518
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004519 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004520
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004521 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004522}
4523
Karl Schultz6addd812016-02-02 17:17:23 -07004524TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004525 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004526 m_errorMonitor->SetDesiredFailureMsg(
4527 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004528 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004529
4530 ASSERT_NO_FATAL_FAILURE(InitState());
4531 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004532
4533 // Renderpass is started here
4534 BeginCommandBuffer();
4535
4536 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004537 vk_testing::Buffer dstBuffer;
4538 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004539
Karl Schultz6addd812016-02-02 17:17:23 -07004540 VkDeviceSize dstOffset = 0;
4541 VkDeviceSize dataSize = 1024;
4542 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004543
Karl Schultz6addd812016-02-02 17:17:23 -07004544 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
4545 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004546
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004547 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004548}
4549
Karl Schultz6addd812016-02-02 17:17:23 -07004550TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004551 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004552 m_errorMonitor->SetDesiredFailureMsg(
4553 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004554 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004555
4556 ASSERT_NO_FATAL_FAILURE(InitState());
4557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004558
4559 // Renderpass is started here
4560 BeginCommandBuffer();
4561
Michael Lentine0a369f62016-02-03 16:51:46 -06004562 VkClearColorValue clear_color;
4563 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07004564 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
4565 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4566 const int32_t tex_width = 32;
4567 const int32_t tex_height = 32;
4568 VkImageCreateInfo image_create_info = {};
4569 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4570 image_create_info.pNext = NULL;
4571 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4572 image_create_info.format = tex_format;
4573 image_create_info.extent.width = tex_width;
4574 image_create_info.extent.height = tex_height;
4575 image_create_info.extent.depth = 1;
4576 image_create_info.mipLevels = 1;
4577 image_create_info.arrayLayers = 1;
4578 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4579 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4580 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004581
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004582 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004583 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4584 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004585
Karl Schultz6addd812016-02-02 17:17:23 -07004586 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4587 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004588
Karl Schultz6addd812016-02-02 17:17:23 -07004589 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4590 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004591
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004592 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004593}
4594
Karl Schultz6addd812016-02-02 17:17:23 -07004595TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004596 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004597 m_errorMonitor->SetDesiredFailureMsg(
4598 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004599 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004600
4601 ASSERT_NO_FATAL_FAILURE(InitState());
4602 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004603
4604 // Renderpass is started here
4605 BeginCommandBuffer();
4606
4607 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07004608 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004609 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
4610 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4611 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
4612 image_create_info.extent.width = 64;
4613 image_create_info.extent.height = 64;
4614 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4615 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004616
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004617 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004618 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4619 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004620
Karl Schultz6addd812016-02-02 17:17:23 -07004621 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4622 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004623
Karl Schultz6addd812016-02-02 17:17:23 -07004624 vkCmdClearDepthStencilImage(
4625 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4626 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
4627 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004628
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004629 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004630}
4631
Karl Schultz6addd812016-02-02 17:17:23 -07004632TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004633 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004634 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004635
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004637 "vkCmdClearAttachments: This call "
4638 "must be issued inside an active "
4639 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004640
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004641 ASSERT_NO_FATAL_FAILURE(InitState());
4642 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004643
4644 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004645 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004646 ASSERT_VK_SUCCESS(err);
4647
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004648 VkClearAttachment color_attachment;
4649 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4650 color_attachment.clearValue.color.float32[0] = 0;
4651 color_attachment.clearValue.color.float32[1] = 0;
4652 color_attachment.clearValue.color.float32[2] = 0;
4653 color_attachment.clearValue.color.float32[3] = 0;
4654 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004655 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
4656 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4657 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004658
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004659 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004660}
4661
Karl Schultz9e66a292016-04-21 15:57:51 -06004662TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
4663 // Try to add a buffer memory barrier with no buffer.
4664 m_errorMonitor->SetDesiredFailureMsg(
4665 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4666 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
4667
4668 ASSERT_NO_FATAL_FAILURE(InitState());
4669 BeginCommandBuffer();
4670
4671 VkBufferMemoryBarrier buf_barrier = {};
4672 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
4673 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4674 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4675 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4676 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4677 buf_barrier.buffer = VK_NULL_HANDLE;
4678 buf_barrier.offset = 0;
4679 buf_barrier.size = VK_WHOLE_SIZE;
4680 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4681 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
4682 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
4683
4684 m_errorMonitor->VerifyFound();
4685}
4686
Karl Schultz6addd812016-02-02 17:17:23 -07004687TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004688 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004689 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004690
Karl Schultz6addd812016-02-02 17:17:23 -07004691 m_errorMonitor->SetDesiredFailureMsg(
4692 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004693 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
4694
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004695 ASSERT_NO_FATAL_FAILURE(InitState());
4696 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004697 uint32_t qfi = 0;
4698 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004699 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4700 buffCI.size = 1024;
4701 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4702 buffCI.queueFamilyIndexCount = 1;
4703 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004704
4705 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004706 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004707 ASSERT_VK_SUCCESS(err);
4708
4709 BeginCommandBuffer();
4710 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004711 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4712 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004713 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07004714 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
4715 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004716
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004717 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004718
Chia-I Wuf7458c52015-10-26 21:10:41 +08004719 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004720}
4721
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004722TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
4723 // Create an out-of-range queueFamilyIndex
4724 m_errorMonitor->SetDesiredFailureMsg(
4725 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06004726 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004727
4728 ASSERT_NO_FATAL_FAILURE(InitState());
4729 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4730 VkBufferCreateInfo buffCI = {};
4731 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4732 buffCI.size = 1024;
4733 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4734 buffCI.queueFamilyIndexCount = 1;
4735 // Introduce failure by specifying invalid queue_family_index
4736 uint32_t qfi = 777;
4737 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06004738 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004739
4740 VkBuffer ib;
4741 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
4742
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004743 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004744}
4745
Karl Schultz6addd812016-02-02 17:17:23 -07004746TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
4747 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
4748 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004749
Karl Schultz6addd812016-02-02 17:17:23 -07004750 m_errorMonitor->SetDesiredFailureMsg(
4751 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004752 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004753
4754 ASSERT_NO_FATAL_FAILURE(InitState());
4755 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004756
4757 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004758 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004759 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
4760 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004761
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004762 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004763}
4764
Karl Schultz6addd812016-02-02 17:17:23 -07004765TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004766 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07004767 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004768
Karl Schultz6addd812016-02-02 17:17:23 -07004769 m_errorMonitor->SetDesiredFailureMsg(
4770 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
4771 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
4772 "does not match ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004773
Tobin Ehlis3b780662015-05-28 12:11:26 -06004774 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004775 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004776 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004777 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4778 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004779
4780 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004781 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4782 ds_pool_ci.pNext = NULL;
4783 ds_pool_ci.maxSets = 1;
4784 ds_pool_ci.poolSizeCount = 1;
4785 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004786
Tobin Ehlis3b780662015-05-28 12:11:26 -06004787 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004788 err =
4789 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004790 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004791 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004792 dsl_binding.binding = 0;
4793 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4794 dsl_binding.descriptorCount = 1;
4795 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4796 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004797
Tony Barboureb254902015-07-15 12:50:33 -06004798 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004799 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4800 ds_layout_ci.pNext = NULL;
4801 ds_layout_ci.bindingCount = 1;
4802 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004803
Tobin Ehlis3b780662015-05-28 12:11:26 -06004804 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004805 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4806 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004807 ASSERT_VK_SUCCESS(err);
4808
4809 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004810 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004811 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004812 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004813 alloc_info.descriptorPool = ds_pool;
4814 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004815 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4816 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004817 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004818
Tony Barboureb254902015-07-15 12:50:33 -06004819 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004820 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4821 sampler_ci.pNext = NULL;
4822 sampler_ci.magFilter = VK_FILTER_NEAREST;
4823 sampler_ci.minFilter = VK_FILTER_NEAREST;
4824 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4825 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4826 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4827 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4828 sampler_ci.mipLodBias = 1.0;
4829 sampler_ci.anisotropyEnable = VK_FALSE;
4830 sampler_ci.maxAnisotropy = 1;
4831 sampler_ci.compareEnable = VK_FALSE;
4832 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4833 sampler_ci.minLod = 1.0;
4834 sampler_ci.maxLod = 1.0;
4835 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4836 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski52ac6582015-09-01 15:42:56 -06004837
Tobin Ehlis3b780662015-05-28 12:11:26 -06004838 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004839 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004840 ASSERT_VK_SUCCESS(err);
4841
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004842 VkDescriptorImageInfo info = {};
4843 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004844
4845 VkWriteDescriptorSet descriptor_write;
4846 memset(&descriptor_write, 0, sizeof(descriptor_write));
4847 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004848 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004849 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004850 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004851 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004852 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004853
4854 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4855
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004856 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004857
Chia-I Wuf7458c52015-10-26 21:10:41 +08004858 vkDestroySampler(m_device->device(), sampler, NULL);
4859 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4860 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004861}
4862
Karl Schultz6addd812016-02-02 17:17:23 -07004863TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004864 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07004865 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004866
Karl Schultz6addd812016-02-02 17:17:23 -07004867 m_errorMonitor->SetDesiredFailureMsg(
4868 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
4869 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
4870 "is out of bounds for matching binding");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004871
Tobin Ehlis3b780662015-05-28 12:11:26 -06004872 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004873 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004874 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004875 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4876 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004877
4878 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004879 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4880 ds_pool_ci.pNext = NULL;
4881 ds_pool_ci.maxSets = 1;
4882 ds_pool_ci.poolSizeCount = 1;
4883 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004884
Tobin Ehlis3b780662015-05-28 12:11:26 -06004885 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004886 err =
4887 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004888 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004889
Tony Barboureb254902015-07-15 12:50:33 -06004890 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004891 dsl_binding.binding = 0;
4892 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4893 dsl_binding.descriptorCount = 1;
4894 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4895 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06004896
4897 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004898 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4899 ds_layout_ci.pNext = NULL;
4900 ds_layout_ci.bindingCount = 1;
4901 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004902
Tobin Ehlis3b780662015-05-28 12:11:26 -06004903 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004904 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4905 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004906 ASSERT_VK_SUCCESS(err);
4907
4908 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004909 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004910 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004911 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004912 alloc_info.descriptorPool = ds_pool;
4913 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004914 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4915 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004916 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004917
Tony Barboureb254902015-07-15 12:50:33 -06004918 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004919 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4920 sampler_ci.pNext = NULL;
4921 sampler_ci.magFilter = VK_FILTER_NEAREST;
4922 sampler_ci.minFilter = VK_FILTER_NEAREST;
4923 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4924 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4925 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4926 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4927 sampler_ci.mipLodBias = 1.0;
4928 sampler_ci.anisotropyEnable = VK_FALSE;
4929 sampler_ci.maxAnisotropy = 1;
4930 sampler_ci.compareEnable = VK_FALSE;
4931 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4932 sampler_ci.minLod = 1.0;
4933 sampler_ci.maxLod = 1.0;
4934 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4935 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06004936
Tobin Ehlis3b780662015-05-28 12:11:26 -06004937 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004938 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004939 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004940
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004941 VkDescriptorImageInfo info = {};
4942 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004943
4944 VkWriteDescriptorSet descriptor_write;
4945 memset(&descriptor_write, 0, sizeof(descriptor_write));
4946 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004947 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004948 descriptor_write.dstArrayElement =
4949 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08004950 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004951 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004952 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004953 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004954
4955 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4956
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004957 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004958
Chia-I Wuf7458c52015-10-26 21:10:41 +08004959 vkDestroySampler(m_device->device(), sampler, NULL);
4960 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4961 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004962}
4963
Karl Schultz6addd812016-02-02 17:17:23 -07004964TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
4965 // Create layout w/ count of 1 and attempt update to that layout w/ binding
4966 // index 2
4967 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004968
Karl Schultz6addd812016-02-02 17:17:23 -07004969 m_errorMonitor->SetDesiredFailureMsg(
4970 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004971 " does not have binding to match update binding ");
4972
Tobin Ehlis3b780662015-05-28 12:11:26 -06004973 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004974 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004975 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004976 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4977 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004978
4979 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004980 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4981 ds_pool_ci.pNext = NULL;
4982 ds_pool_ci.maxSets = 1;
4983 ds_pool_ci.poolSizeCount = 1;
4984 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004985
Tobin Ehlis3b780662015-05-28 12:11:26 -06004986 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004987 err =
4988 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004989 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004990
Tony Barboureb254902015-07-15 12:50:33 -06004991 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004992 dsl_binding.binding = 0;
4993 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4994 dsl_binding.descriptorCount = 1;
4995 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4996 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06004997
4998 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004999 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5000 ds_layout_ci.pNext = NULL;
5001 ds_layout_ci.bindingCount = 1;
5002 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005003 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005004 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5005 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005006 ASSERT_VK_SUCCESS(err);
5007
5008 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005009 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005010 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005011 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005012 alloc_info.descriptorPool = ds_pool;
5013 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005014 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5015 &descriptorSet);
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 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005019 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5020 sampler_ci.pNext = NULL;
5021 sampler_ci.magFilter = VK_FILTER_NEAREST;
5022 sampler_ci.minFilter = VK_FILTER_NEAREST;
5023 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5024 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5025 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5026 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5027 sampler_ci.mipLodBias = 1.0;
5028 sampler_ci.anisotropyEnable = VK_FALSE;
5029 sampler_ci.maxAnisotropy = 1;
5030 sampler_ci.compareEnable = VK_FALSE;
5031 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5032 sampler_ci.minLod = 1.0;
5033 sampler_ci.maxLod = 1.0;
5034 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5035 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005036
Tobin Ehlis3b780662015-05-28 12:11:26 -06005037 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005038 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005039 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005040
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005041 VkDescriptorImageInfo info = {};
5042 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005043
5044 VkWriteDescriptorSet descriptor_write;
5045 memset(&descriptor_write, 0, sizeof(descriptor_write));
5046 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005047 descriptor_write.dstSet = descriptorSet;
5048 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005049 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005050 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005051 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005052 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005053
5054 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5055
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005056 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005057
Chia-I Wuf7458c52015-10-26 21:10:41 +08005058 vkDestroySampler(m_device->device(), sampler, NULL);
5059 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5060 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005061}
5062
Karl Schultz6addd812016-02-02 17:17:23 -07005063TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
5064 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
5065 // types
5066 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005067
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005068 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005069 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005070
Tobin Ehlis3b780662015-05-28 12:11:26 -06005071 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005072
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005073 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005074 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5075 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005076
5077 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005078 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5079 ds_pool_ci.pNext = NULL;
5080 ds_pool_ci.maxSets = 1;
5081 ds_pool_ci.poolSizeCount = 1;
5082 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005083
Tobin Ehlis3b780662015-05-28 12:11:26 -06005084 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005085 err =
5086 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005087 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005088 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005089 dsl_binding.binding = 0;
5090 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5091 dsl_binding.descriptorCount = 1;
5092 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5093 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005094
Tony Barboureb254902015-07-15 12:50:33 -06005095 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005096 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5097 ds_layout_ci.pNext = NULL;
5098 ds_layout_ci.bindingCount = 1;
5099 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005100
Tobin Ehlis3b780662015-05-28 12:11:26 -06005101 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005102 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5103 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005104 ASSERT_VK_SUCCESS(err);
5105
5106 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005107 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005108 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005109 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005110 alloc_info.descriptorPool = ds_pool;
5111 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005112 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5113 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005114 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005115
Tony Barboureb254902015-07-15 12:50:33 -06005116 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005117 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5118 sampler_ci.pNext = NULL;
5119 sampler_ci.magFilter = VK_FILTER_NEAREST;
5120 sampler_ci.minFilter = VK_FILTER_NEAREST;
5121 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5122 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5123 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5124 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5125 sampler_ci.mipLodBias = 1.0;
5126 sampler_ci.anisotropyEnable = VK_FALSE;
5127 sampler_ci.maxAnisotropy = 1;
5128 sampler_ci.compareEnable = VK_FALSE;
5129 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5130 sampler_ci.minLod = 1.0;
5131 sampler_ci.maxLod = 1.0;
5132 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5133 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005134 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005135 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005136 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005137
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005138 VkDescriptorImageInfo info = {};
5139 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005140
5141 VkWriteDescriptorSet descriptor_write;
5142 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07005143 descriptor_write.sType =
5144 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005145 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005146 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005147 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005148 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005149 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005150
5151 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5152
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005153 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005154
Chia-I Wuf7458c52015-10-26 21:10:41 +08005155 vkDestroySampler(m_device->device(), sampler, NULL);
5156 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5157 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005158}
5159
Karl Schultz6addd812016-02-02 17:17:23 -07005160TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005161 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07005162 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005163
Karl Schultz6addd812016-02-02 17:17:23 -07005164 m_errorMonitor->SetDesiredFailureMsg(
5165 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005166 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
5167
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005168 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005169 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
5170 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005171 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005172 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
5173 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005174
5175 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005176 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5177 ds_pool_ci.pNext = NULL;
5178 ds_pool_ci.maxSets = 1;
5179 ds_pool_ci.poolSizeCount = 1;
5180 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005181
5182 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005183 err =
5184 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005185 ASSERT_VK_SUCCESS(err);
5186
5187 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005188 dsl_binding.binding = 0;
5189 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5190 dsl_binding.descriptorCount = 1;
5191 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5192 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005193
5194 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005195 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5196 ds_layout_ci.pNext = NULL;
5197 ds_layout_ci.bindingCount = 1;
5198 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005199 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005200 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5201 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005202 ASSERT_VK_SUCCESS(err);
5203
5204 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005205 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005206 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005207 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005208 alloc_info.descriptorPool = ds_pool;
5209 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005210 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5211 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005212 ASSERT_VK_SUCCESS(err);
5213
Karl Schultz6addd812016-02-02 17:17:23 -07005214 VkSampler sampler =
5215 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005216
5217 VkDescriptorImageInfo descriptor_info;
5218 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5219 descriptor_info.sampler = sampler;
5220
5221 VkWriteDescriptorSet descriptor_write;
5222 memset(&descriptor_write, 0, sizeof(descriptor_write));
5223 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005224 descriptor_write.dstSet = descriptorSet;
5225 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005226 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005227 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5228 descriptor_write.pImageInfo = &descriptor_info;
5229
5230 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5231
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005232 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005233
Chia-I Wuf7458c52015-10-26 21:10:41 +08005234 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5235 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005236}
5237
Karl Schultz6addd812016-02-02 17:17:23 -07005238TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
5239 // Create a single combined Image/Sampler descriptor and send it an invalid
5240 // imageView
5241 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005242
Karl Schultz6addd812016-02-02 17:17:23 -07005243 m_errorMonitor->SetDesiredFailureMsg(
5244 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005245 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
5246
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005247 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005248 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005249 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5250 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005251
5252 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005253 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5254 ds_pool_ci.pNext = NULL;
5255 ds_pool_ci.maxSets = 1;
5256 ds_pool_ci.poolSizeCount = 1;
5257 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005258
5259 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005260 err =
5261 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005262 ASSERT_VK_SUCCESS(err);
5263
5264 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005265 dsl_binding.binding = 0;
5266 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5267 dsl_binding.descriptorCount = 1;
5268 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5269 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005270
5271 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005272 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5273 ds_layout_ci.pNext = NULL;
5274 ds_layout_ci.bindingCount = 1;
5275 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005276 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005277 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5278 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005279 ASSERT_VK_SUCCESS(err);
5280
5281 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005282 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005283 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005284 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005285 alloc_info.descriptorPool = ds_pool;
5286 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005287 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5288 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005289 ASSERT_VK_SUCCESS(err);
5290
5291 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005292 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5293 sampler_ci.pNext = NULL;
5294 sampler_ci.magFilter = VK_FILTER_NEAREST;
5295 sampler_ci.minFilter = VK_FILTER_NEAREST;
5296 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5297 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5298 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5299 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5300 sampler_ci.mipLodBias = 1.0;
5301 sampler_ci.anisotropyEnable = VK_FALSE;
5302 sampler_ci.maxAnisotropy = 1;
5303 sampler_ci.compareEnable = VK_FALSE;
5304 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5305 sampler_ci.minLod = 1.0;
5306 sampler_ci.maxLod = 1.0;
5307 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5308 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005309
5310 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005311 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005312 ASSERT_VK_SUCCESS(err);
5313
Karl Schultz6addd812016-02-02 17:17:23 -07005314 VkImageView view =
5315 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005316
5317 VkDescriptorImageInfo descriptor_info;
5318 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5319 descriptor_info.sampler = sampler;
5320 descriptor_info.imageView = view;
5321
5322 VkWriteDescriptorSet descriptor_write;
5323 memset(&descriptor_write, 0, sizeof(descriptor_write));
5324 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005325 descriptor_write.dstSet = descriptorSet;
5326 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005327 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005328 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5329 descriptor_write.pImageInfo = &descriptor_info;
5330
5331 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5332
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005333 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005334
Chia-I Wuf7458c52015-10-26 21:10:41 +08005335 vkDestroySampler(m_device->device(), sampler, NULL);
5336 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5337 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005338}
5339
Karl Schultz6addd812016-02-02 17:17:23 -07005340TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
5341 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
5342 // into the other
5343 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005344
Karl Schultz6addd812016-02-02 17:17:23 -07005345 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06005346 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5347 "Copy descriptor update index 0, has src update descriptor "
5348 "type VK_DESCRIPTOR_TYPE_SAMPLER that does not match overlapping "
5349 "dest ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005350
Tobin Ehlis04356f92015-10-27 16:35:27 -06005351 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005352 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005353 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005354 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5355 ds_type_count[0].descriptorCount = 1;
5356 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
5357 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005358
5359 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005360 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5361 ds_pool_ci.pNext = NULL;
5362 ds_pool_ci.maxSets = 1;
5363 ds_pool_ci.poolSizeCount = 2;
5364 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005365
5366 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005367 err =
5368 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005369 ASSERT_VK_SUCCESS(err);
5370 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005371 dsl_binding[0].binding = 0;
5372 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5373 dsl_binding[0].descriptorCount = 1;
5374 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
5375 dsl_binding[0].pImmutableSamplers = NULL;
5376 dsl_binding[1].binding = 1;
5377 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5378 dsl_binding[1].descriptorCount = 1;
5379 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
5380 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005381
5382 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005383 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5384 ds_layout_ci.pNext = NULL;
5385 ds_layout_ci.bindingCount = 2;
5386 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005387
5388 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005389 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5390 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005391 ASSERT_VK_SUCCESS(err);
5392
5393 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005394 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005395 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005396 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005397 alloc_info.descriptorPool = ds_pool;
5398 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005399 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5400 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005401 ASSERT_VK_SUCCESS(err);
5402
5403 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005404 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5405 sampler_ci.pNext = NULL;
5406 sampler_ci.magFilter = VK_FILTER_NEAREST;
5407 sampler_ci.minFilter = VK_FILTER_NEAREST;
5408 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5409 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5410 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5411 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5412 sampler_ci.mipLodBias = 1.0;
5413 sampler_ci.anisotropyEnable = VK_FALSE;
5414 sampler_ci.maxAnisotropy = 1;
5415 sampler_ci.compareEnable = VK_FALSE;
5416 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5417 sampler_ci.minLod = 1.0;
5418 sampler_ci.maxLod = 1.0;
5419 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5420 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005421
5422 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005423 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005424 ASSERT_VK_SUCCESS(err);
5425
5426 VkDescriptorImageInfo info = {};
5427 info.sampler = sampler;
5428
5429 VkWriteDescriptorSet descriptor_write;
5430 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
5431 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005432 descriptor_write.dstSet = descriptorSet;
5433 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08005434 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005435 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5436 descriptor_write.pImageInfo = &info;
5437 // This write update should succeed
5438 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5439 // Now perform a copy update that fails due to type mismatch
5440 VkCopyDescriptorSet copy_ds_update;
5441 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5442 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5443 copy_ds_update.srcSet = descriptorSet;
5444 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005445 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005446 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08005447 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005448 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5449
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005450 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005451 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005452 m_errorMonitor->SetDesiredFailureMsg(
5453 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005454 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis04356f92015-10-27 16:35:27 -06005455 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5456 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5457 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005458 copy_ds_update.srcBinding =
5459 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005460 copy_ds_update.dstSet = descriptorSet;
5461 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005462 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005463 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5464
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005465 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005466
Tobin Ehlis04356f92015-10-27 16:35:27 -06005467 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005468 m_errorMonitor->SetDesiredFailureMsg(
5469 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005470 "Copy descriptor src update is out of bounds for matching binding 1 ");
5471
Tobin Ehlis04356f92015-10-27 16:35:27 -06005472 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5473 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5474 copy_ds_update.srcSet = descriptorSet;
5475 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005476 copy_ds_update.dstSet = descriptorSet;
5477 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005478 copy_ds_update.descriptorCount =
5479 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06005480 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5481
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005482 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005483
Chia-I Wuf7458c52015-10-26 21:10:41 +08005484 vkDestroySampler(m_device->device(), sampler, NULL);
5485 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5486 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005487}
5488
Karl Schultz6addd812016-02-02 17:17:23 -07005489TEST_F(VkLayerTest, NumSamplesMismatch) {
5490 // Create CommandBuffer where MSAA samples doesn't match RenderPass
5491 // sampleCount
5492 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005493
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005495 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005496
Tobin Ehlis3b780662015-05-28 12:11:26 -06005497 ASSERT_NO_FATAL_FAILURE(InitState());
5498 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005499 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06005500 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005501 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005502
5503 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005504 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5505 ds_pool_ci.pNext = NULL;
5506 ds_pool_ci.maxSets = 1;
5507 ds_pool_ci.poolSizeCount = 1;
5508 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005509
Tobin Ehlis3b780662015-05-28 12:11:26 -06005510 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005511 err =
5512 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005513 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005514
Tony Barboureb254902015-07-15 12:50:33 -06005515 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08005516 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06005517 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08005518 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005519 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5520 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005521
Tony Barboureb254902015-07-15 12:50:33 -06005522 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5523 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5524 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005525 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07005526 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005527
Tobin Ehlis3b780662015-05-28 12:11:26 -06005528 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005529 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5530 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005531 ASSERT_VK_SUCCESS(err);
5532
5533 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005534 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005535 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005536 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005537 alloc_info.descriptorPool = ds_pool;
5538 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005539 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5540 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005541 ASSERT_VK_SUCCESS(err);
5542
Tony Barboureb254902015-07-15 12:50:33 -06005543 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005544 pipe_ms_state_ci.sType =
5545 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5546 pipe_ms_state_ci.pNext = NULL;
5547 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5548 pipe_ms_state_ci.sampleShadingEnable = 0;
5549 pipe_ms_state_ci.minSampleShading = 1.0;
5550 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005551
Tony Barboureb254902015-07-15 12:50:33 -06005552 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005553 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5554 pipeline_layout_ci.pNext = NULL;
5555 pipeline_layout_ci.setLayoutCount = 1;
5556 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005557
5558 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005559 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5560 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005561 ASSERT_VK_SUCCESS(err);
5562
Karl Schultz6addd812016-02-02 17:17:23 -07005563 VkShaderObj vs(m_device, bindStateVertShaderText,
5564 VK_SHADER_STAGE_VERTEX_BIT, this);
5565 VkShaderObj fs(m_device, bindStateFragShaderText,
5566 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005567 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005568 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005569 VkPipelineObj pipe(m_device);
5570 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005571 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005572 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005573 pipe.SetMSAA(&pipe_ms_state_ci);
5574 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005575
Tony Barbourfe3351b2015-07-28 10:17:20 -06005576 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005577 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5578 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005579
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005580 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005581
Chia-I Wuf7458c52015-10-26 21:10:41 +08005582 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5583 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5584 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005585}
Tobin Ehlis0f10db52016-04-04 10:00:21 -06005586#ifdef ADD_BACK_IN_WHEN_CHECK_IS_BACK // TODO : Re-enable when GH256 fixed
Mark Youngc89c6312016-03-31 16:03:20 -06005587TEST_F(VkLayerTest, NumBlendAttachMismatch) {
5588 // Create Pipeline where the number of blend attachments doesn't match the
5589 // number of color attachments. In this case, we don't add any color
5590 // blend attachments even though we have a color attachment.
5591 VkResult err;
5592
5593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5594 "Mismatch between blend state attachment");
5595
5596 ASSERT_NO_FATAL_FAILURE(InitState());
5597 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5598 VkDescriptorPoolSize ds_type_count = {};
5599 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5600 ds_type_count.descriptorCount = 1;
5601
5602 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5603 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5604 ds_pool_ci.pNext = NULL;
5605 ds_pool_ci.maxSets = 1;
5606 ds_pool_ci.poolSizeCount = 1;
5607 ds_pool_ci.pPoolSizes = &ds_type_count;
5608
5609 VkDescriptorPool ds_pool;
5610 err =
5611 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5612 ASSERT_VK_SUCCESS(err);
5613
5614 VkDescriptorSetLayoutBinding dsl_binding = {};
5615 dsl_binding.binding = 0;
5616 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5617 dsl_binding.descriptorCount = 1;
5618 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5619 dsl_binding.pImmutableSamplers = NULL;
5620
5621 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5622 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5623 ds_layout_ci.pNext = NULL;
5624 ds_layout_ci.bindingCount = 1;
5625 ds_layout_ci.pBindings = &dsl_binding;
5626
5627 VkDescriptorSetLayout ds_layout;
5628 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5629 &ds_layout);
5630 ASSERT_VK_SUCCESS(err);
5631
5632 VkDescriptorSet descriptorSet;
5633 VkDescriptorSetAllocateInfo alloc_info = {};
5634 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5635 alloc_info.descriptorSetCount = 1;
5636 alloc_info.descriptorPool = ds_pool;
5637 alloc_info.pSetLayouts = &ds_layout;
5638 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5639 &descriptorSet);
5640 ASSERT_VK_SUCCESS(err);
5641
5642 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
5643 pipe_ms_state_ci.sType =
5644 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5645 pipe_ms_state_ci.pNext = NULL;
5646 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
5647 pipe_ms_state_ci.sampleShadingEnable = 0;
5648 pipe_ms_state_ci.minSampleShading = 1.0;
5649 pipe_ms_state_ci.pSampleMask = NULL;
5650
5651 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5652 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5653 pipeline_layout_ci.pNext = NULL;
5654 pipeline_layout_ci.setLayoutCount = 1;
5655 pipeline_layout_ci.pSetLayouts = &ds_layout;
5656
5657 VkPipelineLayout pipeline_layout;
5658 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5659 &pipeline_layout);
5660 ASSERT_VK_SUCCESS(err);
5661
5662 VkShaderObj vs(m_device, bindStateVertShaderText,
5663 VK_SHADER_STAGE_VERTEX_BIT, this);
5664 VkShaderObj fs(m_device, bindStateFragShaderText,
5665 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005666 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06005667 // but add it to be able to run on more devices
5668 VkPipelineObj pipe(m_device);
5669 pipe.AddShader(&vs);
5670 pipe.AddShader(&fs);
5671 pipe.SetMSAA(&pipe_ms_state_ci);
5672 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5673
5674 BeginCommandBuffer();
5675 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5676 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5677
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005678 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06005679
5680 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5681 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5682 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5683}
Tony Barbour4e81a202016-04-04 11:09:40 -06005684#endif //ADD_BACK_IN_WHEN_CHECK_IS_BACK
Karl Schultz6addd812016-02-02 17:17:23 -07005685TEST_F(VkLayerTest, ClearCmdNoDraw) {
5686 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
5687 // to issuing a Draw
5688 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005689
Karl Schultz6addd812016-02-02 17:17:23 -07005690 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07005691 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005692 "vkCmdClearAttachments() issued on CB object ");
5693
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005694 ASSERT_NO_FATAL_FAILURE(InitState());
5695 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005696
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005697 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005698 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5699 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005700
5701 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005702 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5703 ds_pool_ci.pNext = NULL;
5704 ds_pool_ci.maxSets = 1;
5705 ds_pool_ci.poolSizeCount = 1;
5706 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005707
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005708 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005709 err =
5710 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005711 ASSERT_VK_SUCCESS(err);
5712
Tony Barboureb254902015-07-15 12:50:33 -06005713 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005714 dsl_binding.binding = 0;
5715 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5716 dsl_binding.descriptorCount = 1;
5717 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5718 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005719
Tony Barboureb254902015-07-15 12:50:33 -06005720 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005721 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5722 ds_layout_ci.pNext = NULL;
5723 ds_layout_ci.bindingCount = 1;
5724 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005725
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005726 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005727 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5728 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005729 ASSERT_VK_SUCCESS(err);
5730
5731 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005732 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005733 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005734 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005735 alloc_info.descriptorPool = ds_pool;
5736 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005737 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5738 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005739 ASSERT_VK_SUCCESS(err);
5740
Tony Barboureb254902015-07-15 12:50:33 -06005741 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005742 pipe_ms_state_ci.sType =
5743 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5744 pipe_ms_state_ci.pNext = NULL;
5745 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5746 pipe_ms_state_ci.sampleShadingEnable = 0;
5747 pipe_ms_state_ci.minSampleShading = 1.0;
5748 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005749
Tony Barboureb254902015-07-15 12:50:33 -06005750 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005751 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5752 pipeline_layout_ci.pNext = NULL;
5753 pipeline_layout_ci.setLayoutCount = 1;
5754 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005755
5756 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005757 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5758 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005759 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005760
Karl Schultz6addd812016-02-02 17:17:23 -07005761 VkShaderObj vs(m_device, bindStateVertShaderText,
5762 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06005763 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07005764 // on more devices
5765 VkShaderObj fs(m_device, bindStateFragShaderText,
5766 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005767
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005768 VkPipelineObj pipe(m_device);
5769 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005770 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005771 pipe.SetMSAA(&pipe_ms_state_ci);
5772 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005773
5774 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005775
Karl Schultz6addd812016-02-02 17:17:23 -07005776 // Main thing we care about for this test is that the VkImage obj we're
5777 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005778 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005779 VkClearAttachment color_attachment;
5780 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5781 color_attachment.clearValue.color.float32[0] = 1.0;
5782 color_attachment.clearValue.color.float32[1] = 1.0;
5783 color_attachment.clearValue.color.float32[2] = 1.0;
5784 color_attachment.clearValue.color.float32[3] = 1.0;
5785 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005786 VkClearRect clear_rect = {
5787 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005788
Karl Schultz6addd812016-02-02 17:17:23 -07005789 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5790 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005791
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005792 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005793
Chia-I Wuf7458c52015-10-26 21:10:41 +08005794 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5795 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5796 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005797}
5798
Karl Schultz6addd812016-02-02 17:17:23 -07005799TEST_F(VkLayerTest, VtxBufferBadIndex) {
5800 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005801
Karl Schultz6addd812016-02-02 17:17:23 -07005802 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005803 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07005804 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005805
Tobin Ehlis502480b2015-06-24 15:53:07 -06005806 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06005807 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06005808 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005809
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005810 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005811 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5812 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005813
5814 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005815 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5816 ds_pool_ci.pNext = NULL;
5817 ds_pool_ci.maxSets = 1;
5818 ds_pool_ci.poolSizeCount = 1;
5819 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005820
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005821 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005822 err =
5823 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005824 ASSERT_VK_SUCCESS(err);
5825
Tony Barboureb254902015-07-15 12:50:33 -06005826 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005827 dsl_binding.binding = 0;
5828 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5829 dsl_binding.descriptorCount = 1;
5830 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5831 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005832
Tony Barboureb254902015-07-15 12:50:33 -06005833 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005834 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5835 ds_layout_ci.pNext = NULL;
5836 ds_layout_ci.bindingCount = 1;
5837 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005838
Tobin Ehlis502480b2015-06-24 15:53:07 -06005839 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005840 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5841 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005842 ASSERT_VK_SUCCESS(err);
5843
5844 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005845 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005846 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005847 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005848 alloc_info.descriptorPool = ds_pool;
5849 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005850 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5851 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005852 ASSERT_VK_SUCCESS(err);
5853
Tony Barboureb254902015-07-15 12:50:33 -06005854 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005855 pipe_ms_state_ci.sType =
5856 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5857 pipe_ms_state_ci.pNext = NULL;
5858 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
5859 pipe_ms_state_ci.sampleShadingEnable = 0;
5860 pipe_ms_state_ci.minSampleShading = 1.0;
5861 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005862
Tony Barboureb254902015-07-15 12:50:33 -06005863 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005864 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5865 pipeline_layout_ci.pNext = NULL;
5866 pipeline_layout_ci.setLayoutCount = 1;
5867 pipeline_layout_ci.pSetLayouts = &ds_layout;
5868 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005869
Karl Schultz6addd812016-02-02 17:17:23 -07005870 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5871 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005872 ASSERT_VK_SUCCESS(err);
5873
Karl Schultz6addd812016-02-02 17:17:23 -07005874 VkShaderObj vs(m_device, bindStateVertShaderText,
5875 VK_SHADER_STAGE_VERTEX_BIT, this);
5876 VkShaderObj fs(m_device, bindStateFragShaderText,
5877 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005878 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005879 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005880 VkPipelineObj pipe(m_device);
5881 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005882 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005883 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005884 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005885 pipe.SetViewport(m_viewports);
5886 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005887 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005888
5889 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005890 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5891 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06005892 // Don't care about actual data, just need to get to draw to flag error
5893 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07005894 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
5895 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06005896 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06005897 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005898
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005899 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005900
Chia-I Wuf7458c52015-10-26 21:10:41 +08005901 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5902 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5903 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005904}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005905#endif // DRAW_STATE_TESTS
5906
Tobin Ehlis0788f522015-05-26 16:11:58 -06005907#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06005908#if GTEST_IS_THREADSAFE
5909struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005910 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005911 VkEvent event;
5912 bool bailout;
5913};
5914
Karl Schultz6addd812016-02-02 17:17:23 -07005915extern "C" void *AddToCommandBuffer(void *arg) {
5916 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005917
Karl Schultz6addd812016-02-02 17:17:23 -07005918 for (int i = 0; i < 10000; i++) {
5919 vkCmdSetEvent(data->commandBuffer, data->event,
5920 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005921 if (data->bailout) {
5922 break;
5923 }
5924 }
5925 return NULL;
5926}
5927
Karl Schultz6addd812016-02-02 17:17:23 -07005928TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005929 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005930
Karl Schultz6addd812016-02-02 17:17:23 -07005931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5932 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005933
Mike Stroyanaccf7692015-05-12 16:00:45 -06005934 ASSERT_NO_FATAL_FAILURE(InitState());
5935 ASSERT_NO_FATAL_FAILURE(InitViewport());
5936 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5937
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005938 // Calls AllocateCommandBuffers
5939 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06005940
5941 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005942 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005943
5944 VkEventCreateInfo event_info;
5945 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005946 VkResult err;
5947
5948 memset(&event_info, 0, sizeof(event_info));
5949 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5950
Chia-I Wuf7458c52015-10-26 21:10:41 +08005951 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005952 ASSERT_VK_SUCCESS(err);
5953
Mike Stroyanaccf7692015-05-12 16:00:45 -06005954 err = vkResetEvent(device(), event);
5955 ASSERT_VK_SUCCESS(err);
5956
5957 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005958 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005959 data.event = event;
5960 data.bailout = false;
5961 m_errorMonitor->SetBailout(&data.bailout);
5962 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005963 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005964 // Add many entries to command buffer from this thread at the same time.
5965 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06005966
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005967 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005968 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005969
Mike Stroyan10b8cb72016-01-22 15:22:03 -07005970 m_errorMonitor->SetBailout(NULL);
5971
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005972 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005973
Chia-I Wuf7458c52015-10-26 21:10:41 +08005974 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005975}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005976#endif // GTEST_IS_THREADSAFE
5977#endif // THREADING_TESTS
5978
Chris Forbes9f7ff632015-05-25 11:13:08 +12005979#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07005980TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12005982 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005983
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005984 ASSERT_NO_FATAL_FAILURE(InitState());
5985 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5986
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005987 VkShaderModule module;
5988 VkShaderModuleCreateInfo moduleCreateInfo;
5989 struct icd_spv_header spv;
5990
5991 spv.magic = ICD_SPV_MAGIC;
5992 spv.version = ICD_SPV_VERSION;
5993 spv.gen_magic = 0;
5994
5995 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
5996 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07005997 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005998 moduleCreateInfo.codeSize = 4;
5999 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006000 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006001
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006002 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006003}
6004
Karl Schultz6addd812016-02-02 17:17:23 -07006005TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006007 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006008
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006009 ASSERT_NO_FATAL_FAILURE(InitState());
6010 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6011
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006012 VkShaderModule module;
6013 VkShaderModuleCreateInfo moduleCreateInfo;
6014 struct icd_spv_header spv;
6015
6016 spv.magic = ~ICD_SPV_MAGIC;
6017 spv.version = ICD_SPV_VERSION;
6018 spv.gen_magic = 0;
6019
6020 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6021 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006022 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006023 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6024 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006025 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006026
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006027 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006028}
6029
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006030#if 0
6031// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07006032TEST_F(VkLayerTest, InvalidSPIRVVersion) {
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 header");
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;
6049
Karl Schultz6addd812016-02-02 17:17:23 -07006050 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006051 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6052 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006053 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006054
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006055 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006056}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006057#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006058
Karl Schultz6addd812016-02-02 17:17:23 -07006059TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006060 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006061 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006062
Chris Forbes9f7ff632015-05-25 11:13:08 +12006063 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006064 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006065
6066 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006067 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006068 "\n"
6069 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006070 "out gl_PerVertex {\n"
6071 " vec4 gl_Position;\n"
6072 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006073 "void main(){\n"
6074 " gl_Position = vec4(1);\n"
6075 " x = 0;\n"
6076 "}\n";
6077 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006078 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006079 "\n"
6080 "layout(location=0) out vec4 color;\n"
6081 "void main(){\n"
6082 " color = vec4(1);\n"
6083 "}\n";
6084
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006085 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6086 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006087
6088 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006089 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006090 pipe.AddShader(&vs);
6091 pipe.AddShader(&fs);
6092
Chris Forbes9f7ff632015-05-25 11:13:08 +12006093 VkDescriptorSetObj descriptorSet(m_device);
6094 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006095 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006096
Tony Barbour5781e8f2015-08-04 16:23:11 -06006097 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006098
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006099 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006100}
Chris Forbes9f7ff632015-05-25 11:13:08 +12006101
Karl Schultz6addd812016-02-02 17:17:23 -07006102TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006104 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006105
Chris Forbes59cb88d2015-05-25 11:13:13 +12006106 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006107 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006108
6109 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006110 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006111 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006112 "out gl_PerVertex {\n"
6113 " vec4 gl_Position;\n"
6114 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006115 "void main(){\n"
6116 " gl_Position = vec4(1);\n"
6117 "}\n";
6118 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006119 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006120 "\n"
6121 "layout(location=0) in float x;\n"
6122 "layout(location=0) out vec4 color;\n"
6123 "void main(){\n"
6124 " color = vec4(x);\n"
6125 "}\n";
6126
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006127 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6128 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006129
6130 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006131 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006132 pipe.AddShader(&vs);
6133 pipe.AddShader(&fs);
6134
Chris Forbes59cb88d2015-05-25 11:13:13 +12006135 VkDescriptorSetObj descriptorSet(m_device);
6136 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006137 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006138
Tony Barbour5781e8f2015-08-04 16:23:11 -06006139 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006140
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006141 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006142}
6143
Karl Schultz6addd812016-02-02 17:17:23 -07006144TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006145 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006146 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006147
6148 ASSERT_NO_FATAL_FAILURE(InitState());
6149 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6150
6151 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006152 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006153 "\n"
6154 "out gl_PerVertex {\n"
6155 " vec4 gl_Position;\n"
6156 "};\n"
6157 "void main(){\n"
6158 " gl_Position = vec4(1);\n"
6159 "}\n";
6160 char const *fsSource =
6161 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006162 "\n"
6163 "in block { layout(location=0) float x; } ins;\n"
6164 "layout(location=0) out vec4 color;\n"
6165 "void main(){\n"
6166 " color = vec4(ins.x);\n"
6167 "}\n";
6168
6169 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6170 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6171
6172 VkPipelineObj pipe(m_device);
6173 pipe.AddColorAttachment();
6174 pipe.AddShader(&vs);
6175 pipe.AddShader(&fs);
6176
6177 VkDescriptorSetObj descriptorSet(m_device);
6178 descriptorSet.AppendDummy();
6179 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6180
6181 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6182
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006183 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006184}
6185
Karl Schultz6addd812016-02-02 17:17:23 -07006186TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13006187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13006188 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07006189 "output arr[2] of float32' vs 'ptr to "
6190 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13006191
6192 ASSERT_NO_FATAL_FAILURE(InitState());
6193 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6194
6195 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006196 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006197 "\n"
6198 "layout(location=0) out float x[2];\n"
6199 "out gl_PerVertex {\n"
6200 " vec4 gl_Position;\n"
6201 "};\n"
6202 "void main(){\n"
6203 " x[0] = 0; x[1] = 0;\n"
6204 " gl_Position = vec4(1);\n"
6205 "}\n";
6206 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006207 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006208 "\n"
6209 "layout(location=0) in float x[3];\n"
6210 "layout(location=0) out vec4 color;\n"
6211 "void main(){\n"
6212 " color = vec4(x[0] + x[1] + x[2]);\n"
6213 "}\n";
6214
6215 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6216 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6217
6218 VkPipelineObj pipe(m_device);
6219 pipe.AddColorAttachment();
6220 pipe.AddShader(&vs);
6221 pipe.AddShader(&fs);
6222
6223 VkDescriptorSetObj descriptorSet(m_device);
6224 descriptorSet.AppendDummy();
6225 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6226
6227 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6228
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006229 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13006230}
6231
Karl Schultz6addd812016-02-02 17:17:23 -07006232TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006234 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006235
Chris Forbesb56af562015-05-25 11:13:17 +12006236 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006237 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12006238
6239 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006240 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006241 "\n"
6242 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006243 "out gl_PerVertex {\n"
6244 " vec4 gl_Position;\n"
6245 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006246 "void main(){\n"
6247 " x = 0;\n"
6248 " gl_Position = vec4(1);\n"
6249 "}\n";
6250 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006251 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006252 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006253 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12006254 "layout(location=0) out vec4 color;\n"
6255 "void main(){\n"
6256 " color = vec4(x);\n"
6257 "}\n";
6258
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006259 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6260 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12006261
6262 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006263 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12006264 pipe.AddShader(&vs);
6265 pipe.AddShader(&fs);
6266
Chris Forbesb56af562015-05-25 11:13:17 +12006267 VkDescriptorSetObj descriptorSet(m_device);
6268 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006269 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12006270
Tony Barbour5781e8f2015-08-04 16:23:11 -06006271 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12006272
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006273 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12006274}
6275
Karl Schultz6addd812016-02-02 17:17:23 -07006276TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006278 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006279
6280 ASSERT_NO_FATAL_FAILURE(InitState());
6281 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6282
6283 char const *vsSource =
6284 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006285 "\n"
6286 "out block { layout(location=0) int x; } outs;\n"
6287 "out gl_PerVertex {\n"
6288 " vec4 gl_Position;\n"
6289 "};\n"
6290 "void main(){\n"
6291 " outs.x = 0;\n"
6292 " gl_Position = vec4(1);\n"
6293 "}\n";
6294 char const *fsSource =
6295 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006296 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006297 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13006298 "layout(location=0) out vec4 color;\n"
6299 "void main(){\n"
6300 " color = vec4(ins.x);\n"
6301 "}\n";
6302
6303 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6304 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6305
6306 VkPipelineObj pipe(m_device);
6307 pipe.AddColorAttachment();
6308 pipe.AddShader(&vs);
6309 pipe.AddShader(&fs);
6310
6311 VkDescriptorSetObj descriptorSet(m_device);
6312 descriptorSet.AppendDummy();
6313 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6314
6315 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6316
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006317 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006318}
6319
6320TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
6321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6322 "location 0.0 which is not written by vertex shader");
6323
6324 ASSERT_NO_FATAL_FAILURE(InitState());
6325 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6326
6327 char const *vsSource =
6328 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006329 "\n"
6330 "out block { layout(location=1) float x; } outs;\n"
6331 "out gl_PerVertex {\n"
6332 " vec4 gl_Position;\n"
6333 "};\n"
6334 "void main(){\n"
6335 " outs.x = 0;\n"
6336 " gl_Position = vec4(1);\n"
6337 "}\n";
6338 char const *fsSource =
6339 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006340 "\n"
6341 "in block { layout(location=0) float x; } ins;\n"
6342 "layout(location=0) out vec4 color;\n"
6343 "void main(){\n"
6344 " color = vec4(ins.x);\n"
6345 "}\n";
6346
6347 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6348 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6349
6350 VkPipelineObj pipe(m_device);
6351 pipe.AddColorAttachment();
6352 pipe.AddShader(&vs);
6353 pipe.AddShader(&fs);
6354
6355 VkDescriptorSetObj descriptorSet(m_device);
6356 descriptorSet.AppendDummy();
6357 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6358
6359 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6360
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006361 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006362}
6363
6364TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
6365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6366 "location 0.1 which is not written by vertex shader");
6367
6368 ASSERT_NO_FATAL_FAILURE(InitState());
6369 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6370
6371 char const *vsSource =
6372 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006373 "\n"
6374 "out block { layout(location=0, component=0) float x; } outs;\n"
6375 "out gl_PerVertex {\n"
6376 " vec4 gl_Position;\n"
6377 "};\n"
6378 "void main(){\n"
6379 " outs.x = 0;\n"
6380 " gl_Position = vec4(1);\n"
6381 "}\n";
6382 char const *fsSource =
6383 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006384 "\n"
6385 "in block { layout(location=0, component=1) float x; } ins;\n"
6386 "layout(location=0) out vec4 color;\n"
6387 "void main(){\n"
6388 " color = vec4(ins.x);\n"
6389 "}\n";
6390
6391 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6392 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6393
6394 VkPipelineObj pipe(m_device);
6395 pipe.AddColorAttachment();
6396 pipe.AddShader(&vs);
6397 pipe.AddShader(&fs);
6398
6399 VkDescriptorSetObj descriptorSet(m_device);
6400 descriptorSet.AppendDummy();
6401 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6402
6403 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6404
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006405 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006406}
6407
Karl Schultz6addd812016-02-02 17:17:23 -07006408TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006410 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006411
Chris Forbesde136e02015-05-25 11:13:28 +12006412 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006413 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12006414
6415 VkVertexInputBindingDescription input_binding;
6416 memset(&input_binding, 0, sizeof(input_binding));
6417
6418 VkVertexInputAttributeDescription input_attrib;
6419 memset(&input_attrib, 0, sizeof(input_attrib));
6420 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6421
6422 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006423 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006424 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006425 "out gl_PerVertex {\n"
6426 " vec4 gl_Position;\n"
6427 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006428 "void main(){\n"
6429 " gl_Position = vec4(1);\n"
6430 "}\n";
6431 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006432 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006433 "\n"
6434 "layout(location=0) out vec4 color;\n"
6435 "void main(){\n"
6436 " color = vec4(1);\n"
6437 "}\n";
6438
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006439 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6440 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12006441
6442 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006443 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12006444 pipe.AddShader(&vs);
6445 pipe.AddShader(&fs);
6446
6447 pipe.AddVertexInputBindings(&input_binding, 1);
6448 pipe.AddVertexInputAttribs(&input_attrib, 1);
6449
Chris Forbesde136e02015-05-25 11:13:28 +12006450 VkDescriptorSetObj descriptorSet(m_device);
6451 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006452 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12006453
Tony Barbour5781e8f2015-08-04 16:23:11 -06006454 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12006455
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006456 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12006457}
6458
Karl Schultz6addd812016-02-02 17:17:23 -07006459TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006461 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13006462
6463 ASSERT_NO_FATAL_FAILURE(InitState());
6464 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6465
6466 VkVertexInputBindingDescription input_binding;
6467 memset(&input_binding, 0, sizeof(input_binding));
6468
6469 VkVertexInputAttributeDescription input_attrib;
6470 memset(&input_attrib, 0, sizeof(input_attrib));
6471 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6472
6473 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006474 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006475 "\n"
6476 "layout(location=1) in float x;\n"
6477 "out gl_PerVertex {\n"
6478 " vec4 gl_Position;\n"
6479 "};\n"
6480 "void main(){\n"
6481 " gl_Position = vec4(x);\n"
6482 "}\n";
6483 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006484 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006485 "\n"
6486 "layout(location=0) out vec4 color;\n"
6487 "void main(){\n"
6488 " color = vec4(1);\n"
6489 "}\n";
6490
6491 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6492 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6493
6494 VkPipelineObj pipe(m_device);
6495 pipe.AddColorAttachment();
6496 pipe.AddShader(&vs);
6497 pipe.AddShader(&fs);
6498
6499 pipe.AddVertexInputBindings(&input_binding, 1);
6500 pipe.AddVertexInputAttribs(&input_attrib, 1);
6501
6502 VkDescriptorSetObj descriptorSet(m_device);
6503 descriptorSet.AppendDummy();
6504 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6505
6506 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6507
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006508 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13006509}
6510
Karl Schultz6addd812016-02-02 17:17:23 -07006511TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
6512 m_errorMonitor->SetDesiredFailureMsg(
6513 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006514 "VS consumes input at location 0 but not provided");
6515
Chris Forbes62e8e502015-05-25 11:13:29 +12006516 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006517 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12006518
6519 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006520 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006521 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006522 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07006523 "out gl_PerVertex {\n"
6524 " vec4 gl_Position;\n"
6525 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006526 "void main(){\n"
6527 " gl_Position = x;\n"
6528 "}\n";
6529 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006530 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006531 "\n"
6532 "layout(location=0) out vec4 color;\n"
6533 "void main(){\n"
6534 " color = vec4(1);\n"
6535 "}\n";
6536
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006537 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6538 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12006539
6540 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006541 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12006542 pipe.AddShader(&vs);
6543 pipe.AddShader(&fs);
6544
Chris Forbes62e8e502015-05-25 11:13:29 +12006545 VkDescriptorSetObj descriptorSet(m_device);
6546 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006547 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12006548
Tony Barbour5781e8f2015-08-04 16:23:11 -06006549 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12006550
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006551 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12006552}
6553
Karl Schultz6addd812016-02-02 17:17:23 -07006554TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
6555 m_errorMonitor->SetDesiredFailureMsg(
6556 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006557 "location 0 does not match VS input type");
6558
Chris Forbesc97d98e2015-05-25 11:13:31 +12006559 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006560 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006561
6562 VkVertexInputBindingDescription input_binding;
6563 memset(&input_binding, 0, sizeof(input_binding));
6564
6565 VkVertexInputAttributeDescription input_attrib;
6566 memset(&input_attrib, 0, sizeof(input_attrib));
6567 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6568
6569 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006570 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006571 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006572 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006573 "out gl_PerVertex {\n"
6574 " vec4 gl_Position;\n"
6575 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006576 "void main(){\n"
6577 " gl_Position = vec4(x);\n"
6578 "}\n";
6579 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006580 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006581 "\n"
6582 "layout(location=0) out vec4 color;\n"
6583 "void main(){\n"
6584 " color = vec4(1);\n"
6585 "}\n";
6586
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006587 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6588 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006589
6590 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006591 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006592 pipe.AddShader(&vs);
6593 pipe.AddShader(&fs);
6594
6595 pipe.AddVertexInputBindings(&input_binding, 1);
6596 pipe.AddVertexInputAttribs(&input_attrib, 1);
6597
Chris Forbesc97d98e2015-05-25 11:13:31 +12006598 VkDescriptorSetObj descriptorSet(m_device);
6599 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006600 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006601
Tony Barbour5781e8f2015-08-04 16:23:11 -06006602 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006603
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006604 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006605}
6606
Chris Forbesc68b43c2016-04-06 11:18:47 +12006607TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
6608 m_errorMonitor->SetDesiredFailureMsg(
6609 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6610 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
6611
6612 ASSERT_NO_FATAL_FAILURE(InitState());
6613 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6614
6615 char const *vsSource =
6616 "#version 450\n"
6617 "\n"
6618 "out gl_PerVertex {\n"
6619 " vec4 gl_Position;\n"
6620 "};\n"
6621 "void main(){\n"
6622 " gl_Position = vec4(1);\n"
6623 "}\n";
6624 char const *fsSource =
6625 "#version 450\n"
6626 "\n"
6627 "layout(location=0) out vec4 color;\n"
6628 "void main(){\n"
6629 " color = vec4(1);\n"
6630 "}\n";
6631
6632 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6633 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6634
6635 VkPipelineObj pipe(m_device);
6636 pipe.AddColorAttachment();
6637 pipe.AddShader(&vs);
6638 pipe.AddShader(&vs);
6639 pipe.AddShader(&fs);
6640
6641 VkDescriptorSetObj descriptorSet(m_device);
6642 descriptorSet.AppendDummy();
6643 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6644
6645 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6646
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006647 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12006648}
6649
Karl Schultz6addd812016-02-02 17:17:23 -07006650TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006651 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006652
6653 ASSERT_NO_FATAL_FAILURE(InitState());
6654 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6655
6656 VkVertexInputBindingDescription input_binding;
6657 memset(&input_binding, 0, sizeof(input_binding));
6658
6659 VkVertexInputAttributeDescription input_attribs[2];
6660 memset(input_attribs, 0, sizeof(input_attribs));
6661
6662 for (int i = 0; i < 2; i++) {
6663 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6664 input_attribs[i].location = i;
6665 }
6666
6667 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006668 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006669 "\n"
6670 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006671 "out gl_PerVertex {\n"
6672 " vec4 gl_Position;\n"
6673 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006674 "void main(){\n"
6675 " gl_Position = x[0] + x[1];\n"
6676 "}\n";
6677 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006678 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006679 "\n"
6680 "layout(location=0) out vec4 color;\n"
6681 "void main(){\n"
6682 " color = vec4(1);\n"
6683 "}\n";
6684
6685 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6686 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6687
6688 VkPipelineObj pipe(m_device);
6689 pipe.AddColorAttachment();
6690 pipe.AddShader(&vs);
6691 pipe.AddShader(&fs);
6692
6693 pipe.AddVertexInputBindings(&input_binding, 1);
6694 pipe.AddVertexInputAttribs(input_attribs, 2);
6695
6696 VkDescriptorSetObj descriptorSet(m_device);
6697 descriptorSet.AppendDummy();
6698 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6699
6700 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6701
6702 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006703 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006704}
6705
Chris Forbes2682b242015-11-24 11:13:14 +13006706TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
6707{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006708 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006709
6710 ASSERT_NO_FATAL_FAILURE(InitState());
6711 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6712
6713 VkVertexInputBindingDescription input_binding;
6714 memset(&input_binding, 0, sizeof(input_binding));
6715
6716 VkVertexInputAttributeDescription input_attribs[2];
6717 memset(input_attribs, 0, sizeof(input_attribs));
6718
6719 for (int i = 0; i < 2; i++) {
6720 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6721 input_attribs[i].location = i;
6722 }
6723
6724 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006725 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006726 "\n"
6727 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07006728 "out gl_PerVertex {\n"
6729 " vec4 gl_Position;\n"
6730 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006731 "void main(){\n"
6732 " gl_Position = x[0] + x[1];\n"
6733 "}\n";
6734 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006735 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006736 "\n"
6737 "layout(location=0) out vec4 color;\n"
6738 "void main(){\n"
6739 " color = vec4(1);\n"
6740 "}\n";
6741
6742 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6743 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6744
6745 VkPipelineObj pipe(m_device);
6746 pipe.AddColorAttachment();
6747 pipe.AddShader(&vs);
6748 pipe.AddShader(&fs);
6749
6750 pipe.AddVertexInputBindings(&input_binding, 1);
6751 pipe.AddVertexInputAttribs(input_attribs, 2);
6752
6753 VkDescriptorSetObj descriptorSet(m_device);
6754 descriptorSet.AppendDummy();
6755 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6756
6757 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6758
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006759 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006760}
Chris Forbes2682b242015-11-24 11:13:14 +13006761
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006762TEST_F(VkLayerTest, CreatePipelineSimplePositive)
6763{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006764 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006765
6766 ASSERT_NO_FATAL_FAILURE(InitState());
6767 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6768
6769 char const *vsSource =
6770 "#version 450\n"
6771 "out gl_PerVertex {\n"
6772 " vec4 gl_Position;\n"
6773 "};\n"
6774 "void main(){\n"
6775 " gl_Position = vec4(0);\n"
6776 "}\n";
6777 char const *fsSource =
6778 "#version 450\n"
6779 "\n"
6780 "layout(location=0) out vec4 color;\n"
6781 "void main(){\n"
6782 " color = vec4(1);\n"
6783 "}\n";
6784
6785 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6786 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6787
6788 VkPipelineObj pipe(m_device);
6789 pipe.AddColorAttachment();
6790 pipe.AddShader(&vs);
6791 pipe.AddShader(&fs);
6792
6793 VkDescriptorSetObj descriptorSet(m_device);
6794 descriptorSet.AppendDummy();
6795 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6796
6797 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6798
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006799 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006800}
6801
Chris Forbes912c9192016-04-05 17:50:35 +12006802TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
6803{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006804 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12006805
6806 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
6807
6808 ASSERT_NO_FATAL_FAILURE(InitState());
6809 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6810
6811 char const *vsSource =
6812 "#version 450\n"
6813 "out gl_PerVertex {\n"
6814 " vec4 gl_Position;\n"
6815 "};\n"
6816 "layout(location=0) out vec3 x;\n"
6817 "layout(location=1) out ivec3 y;\n"
6818 "layout(location=2) out vec3 z;\n"
6819 "void main(){\n"
6820 " gl_Position = vec4(0);\n"
6821 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
6822 "}\n";
6823 char const *fsSource =
6824 "#version 450\n"
6825 "\n"
6826 "layout(location=0) out vec4 color;\n"
6827 "layout(location=0) in float x;\n"
6828 "layout(location=1) flat in int y;\n"
6829 "layout(location=2) in vec2 z;\n"
6830 "void main(){\n"
6831 " color = vec4(1 + x + y + z.x);\n"
6832 "}\n";
6833
6834 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6835 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6836
6837 VkPipelineObj pipe(m_device);
6838 pipe.AddColorAttachment();
6839 pipe.AddShader(&vs);
6840 pipe.AddShader(&fs);
6841
6842 VkDescriptorSetObj descriptorSet(m_device);
6843 descriptorSet.AppendDummy();
6844 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6845
6846 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6847
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006848 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12006849}
6850
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006851TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
6852{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006853 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006854
6855 ASSERT_NO_FATAL_FAILURE(InitState());
6856 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6857
Chris Forbesc1e852d2016-04-04 19:26:42 +12006858 if (!m_device->phy().features().tessellationShader) {
6859 printf("Device does not support tessellation shaders; skipped.\n");
6860 return;
6861 }
6862
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006863 char const *vsSource =
6864 "#version 450\n"
6865 "void main(){}\n";
6866 char const *tcsSource =
6867 "#version 450\n"
6868 "layout(location=0) out int x[];\n"
6869 "layout(vertices=3) out;\n"
6870 "void main(){\n"
6871 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
6872 " gl_TessLevelInner[0] = 1;\n"
6873 " x[gl_InvocationID] = gl_InvocationID;\n"
6874 "}\n";
6875 char const *tesSource =
6876 "#version 450\n"
6877 "layout(triangles, equal_spacing, cw) in;\n"
6878 "layout(location=0) in int x[];\n"
6879 "out gl_PerVertex { vec4 gl_Position; };\n"
6880 "void main(){\n"
6881 " gl_Position.xyz = gl_TessCoord;\n"
6882 " gl_Position.w = x[0] + x[1] + x[2];\n"
6883 "}\n";
6884 char const *fsSource =
6885 "#version 450\n"
6886 "layout(location=0) out vec4 color;\n"
6887 "void main(){\n"
6888 " color = vec4(1);\n"
6889 "}\n";
6890
6891 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6892 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
6893 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
6894 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6895
6896 VkPipelineInputAssemblyStateCreateInfo iasci{
6897 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
6898 nullptr,
6899 0,
6900 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
6901 VK_FALSE};
6902
Chris Forbesb4cacb62016-04-04 19:15:00 +12006903 VkPipelineTessellationStateCreateInfo tsci{
6904 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
6905 nullptr,
6906 0,
6907 3};
6908
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006909 VkPipelineObj pipe(m_device);
6910 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12006911 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006912 pipe.AddColorAttachment();
6913 pipe.AddShader(&vs);
6914 pipe.AddShader(&tcs);
6915 pipe.AddShader(&tes);
6916 pipe.AddShader(&fs);
6917
6918 VkDescriptorSetObj descriptorSet(m_device);
6919 descriptorSet.AppendDummy();
6920 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6921
6922 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6923
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006924 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006925}
6926
Chris Forbesa0ab8152016-04-20 13:34:27 +12006927TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
6928{
6929 m_errorMonitor->ExpectSuccess();
6930
6931 ASSERT_NO_FATAL_FAILURE(InitState());
6932 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6933
6934 if (!m_device->phy().features().geometryShader) {
6935 printf("Device does not support geometry shaders; skipped.\n");
6936 return;
6937 }
6938
6939 char const *vsSource =
6940 "#version 450\n"
6941 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
6942 "void main(){\n"
6943 " vs_out.x = vec4(1);\n"
6944 "}\n";
6945 char const *gsSource =
6946 "#version 450\n"
6947 "layout(triangles) in;\n"
6948 "layout(triangle_strip, max_vertices=3) out;\n"
6949 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
6950 "out gl_PerVertex { vec4 gl_Position; };\n"
6951 "void main() {\n"
6952 " gl_Position = gs_in[0].x;\n"
6953 " EmitVertex();\n"
6954 "}\n";
6955 char const *fsSource =
6956 "#version 450\n"
6957 "layout(location=0) out vec4 color;\n"
6958 "void main(){\n"
6959 " color = vec4(1);\n"
6960 "}\n";
6961
6962 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6963 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
6964 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6965
6966 VkPipelineObj pipe(m_device);
6967 pipe.AddColorAttachment();
6968 pipe.AddShader(&vs);
6969 pipe.AddShader(&gs);
6970 pipe.AddShader(&fs);
6971
6972 VkDescriptorSetObj descriptorSet(m_device);
6973 descriptorSet.AppendDummy();
6974 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6975
6976 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6977
6978 m_errorMonitor->VerifyNotFound();
6979}
6980
Chris Forbesa0193bc2016-04-04 19:19:47 +12006981TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
6982{
6983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6984 "is per-vertex in tessellation control shader stage "
6985 "but per-patch in tessellation evaluation shader stage");
6986
6987 ASSERT_NO_FATAL_FAILURE(InitState());
6988 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6989
Chris Forbesc1e852d2016-04-04 19:26:42 +12006990 if (!m_device->phy().features().tessellationShader) {
6991 printf("Device does not support tessellation shaders; skipped.\n");
6992 return;
6993 }
6994
Chris Forbesa0193bc2016-04-04 19:19:47 +12006995 char const *vsSource =
6996 "#version 450\n"
6997 "void main(){}\n";
6998 char const *tcsSource =
6999 "#version 450\n"
7000 "layout(location=0) out int x[];\n"
7001 "layout(vertices=3) out;\n"
7002 "void main(){\n"
7003 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7004 " gl_TessLevelInner[0] = 1;\n"
7005 " x[gl_InvocationID] = gl_InvocationID;\n"
7006 "}\n";
7007 char const *tesSource =
7008 "#version 450\n"
7009 "layout(triangles, equal_spacing, cw) in;\n"
7010 "layout(location=0) patch in int x;\n"
7011 "out gl_PerVertex { vec4 gl_Position; };\n"
7012 "void main(){\n"
7013 " gl_Position.xyz = gl_TessCoord;\n"
7014 " gl_Position.w = x;\n"
7015 "}\n";
7016 char const *fsSource =
7017 "#version 450\n"
7018 "layout(location=0) out vec4 color;\n"
7019 "void main(){\n"
7020 " color = vec4(1);\n"
7021 "}\n";
7022
7023 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7024 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7025 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7026 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7027
7028 VkPipelineInputAssemblyStateCreateInfo iasci{
7029 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7030 nullptr,
7031 0,
7032 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7033 VK_FALSE};
7034
7035 VkPipelineTessellationStateCreateInfo tsci{
7036 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7037 nullptr,
7038 0,
7039 3};
7040
7041 VkPipelineObj pipe(m_device);
7042 pipe.SetInputAssembly(&iasci);
7043 pipe.SetTessellation(&tsci);
7044 pipe.AddColorAttachment();
7045 pipe.AddShader(&vs);
7046 pipe.AddShader(&tcs);
7047 pipe.AddShader(&tes);
7048 pipe.AddShader(&fs);
7049
7050 VkDescriptorSetObj descriptorSet(m_device);
7051 descriptorSet.AppendDummy();
7052 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7053
7054 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7055
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007056 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12007057}
7058
Karl Schultz6addd812016-02-02 17:17:23 -07007059TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
7060 m_errorMonitor->SetDesiredFailureMsg(
7061 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007062 "Duplicate vertex input binding descriptions for binding 0");
7063
Chris Forbes280ba2c2015-06-12 11:16:41 +12007064 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007065 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007066
7067 /* Two binding descriptions for binding 0 */
7068 VkVertexInputBindingDescription input_bindings[2];
7069 memset(input_bindings, 0, sizeof(input_bindings));
7070
7071 VkVertexInputAttributeDescription input_attrib;
7072 memset(&input_attrib, 0, sizeof(input_attrib));
7073 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7074
7075 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007076 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007077 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007078 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007079 "out gl_PerVertex {\n"
7080 " vec4 gl_Position;\n"
7081 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007082 "void main(){\n"
7083 " gl_Position = vec4(x);\n"
7084 "}\n";
7085 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007086 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007087 "\n"
7088 "layout(location=0) out vec4 color;\n"
7089 "void main(){\n"
7090 " color = vec4(1);\n"
7091 "}\n";
7092
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007093 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7094 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007095
7096 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007097 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007098 pipe.AddShader(&vs);
7099 pipe.AddShader(&fs);
7100
7101 pipe.AddVertexInputBindings(input_bindings, 2);
7102 pipe.AddVertexInputAttribs(&input_attrib, 1);
7103
Chris Forbes280ba2c2015-06-12 11:16:41 +12007104 VkDescriptorSetObj descriptorSet(m_device);
7105 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007106 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007107
Tony Barbour5781e8f2015-08-04 16:23:11 -06007108 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007109
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007110 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007111}
Chris Forbes8f68b562015-05-25 11:13:32 +12007112
Chris Forbes35efec72016-04-21 14:32:08 +12007113TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
7114 m_errorMonitor->ExpectSuccess();
7115
7116 ASSERT_NO_FATAL_FAILURE(InitState());
7117 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7118
7119 if (!m_device->phy().features().tessellationShader) {
7120 printf("Device does not support 64bit vertex attributes; skipped.\n");
7121 return;
7122 }
7123
7124 VkVertexInputBindingDescription input_bindings[1];
7125 memset(input_bindings, 0, sizeof(input_bindings));
7126
7127 VkVertexInputAttributeDescription input_attribs[4];
7128 memset(input_attribs, 0, sizeof(input_attribs));
7129 input_attribs[0].location = 0;
7130 input_attribs[0].offset = 0;
7131 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7132 input_attribs[1].location = 2;
7133 input_attribs[1].offset = 32;
7134 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7135 input_attribs[2].location = 4;
7136 input_attribs[2].offset = 64;
7137 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7138 input_attribs[3].location = 6;
7139 input_attribs[3].offset = 96;
7140 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7141
7142 char const *vsSource =
7143 "#version 450\n"
7144 "\n"
7145 "layout(location=0) in dmat4 x;\n"
7146 "out gl_PerVertex {\n"
7147 " vec4 gl_Position;\n"
7148 "};\n"
7149 "void main(){\n"
7150 " gl_Position = vec4(x[0][0]);\n"
7151 "}\n";
7152 char const *fsSource =
7153 "#version 450\n"
7154 "\n"
7155 "layout(location=0) out vec4 color;\n"
7156 "void main(){\n"
7157 " color = vec4(1);\n"
7158 "}\n";
7159
7160 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7161 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7162
7163 VkPipelineObj pipe(m_device);
7164 pipe.AddColorAttachment();
7165 pipe.AddShader(&vs);
7166 pipe.AddShader(&fs);
7167
7168 pipe.AddVertexInputBindings(input_bindings, 1);
7169 pipe.AddVertexInputAttribs(input_attribs, 4);
7170
7171 VkDescriptorSetObj descriptorSet(m_device);
7172 descriptorSet.AppendDummy();
7173 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7174
7175 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7176
7177 m_errorMonitor->VerifyNotFound();
7178}
7179
Karl Schultz6addd812016-02-02 17:17:23 -07007180TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007182 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007183
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007184 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007185
7186 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007187 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007188 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007189 "out gl_PerVertex {\n"
7190 " vec4 gl_Position;\n"
7191 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007192 "void main(){\n"
7193 " gl_Position = vec4(1);\n"
7194 "}\n";
7195 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007196 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007197 "\n"
7198 "void main(){\n"
7199 "}\n";
7200
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007201 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7202 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007203
7204 VkPipelineObj pipe(m_device);
7205 pipe.AddShader(&vs);
7206 pipe.AddShader(&fs);
7207
Chia-I Wu08accc62015-07-07 11:50:03 +08007208 /* set up CB 0, not written */
7209 pipe.AddColorAttachment();
7210 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007211
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007212 VkDescriptorSetObj descriptorSet(m_device);
7213 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007214 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007215
Tony Barbour5781e8f2015-08-04 16:23:11 -06007216 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007217
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007218 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007219}
7220
Karl Schultz6addd812016-02-02 17:17:23 -07007221TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07007222 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007223 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007224 "FS writes to output location 1 with no matching attachment");
7225
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007226 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007227
7228 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007229 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007230 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007231 "out gl_PerVertex {\n"
7232 " vec4 gl_Position;\n"
7233 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007234 "void main(){\n"
7235 " gl_Position = vec4(1);\n"
7236 "}\n";
7237 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007238 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007239 "\n"
7240 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007241 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007242 "void main(){\n"
7243 " x = vec4(1);\n"
7244 " y = vec4(1);\n"
7245 "}\n";
7246
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007247 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7248 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007249
7250 VkPipelineObj pipe(m_device);
7251 pipe.AddShader(&vs);
7252 pipe.AddShader(&fs);
7253
Chia-I Wu08accc62015-07-07 11:50:03 +08007254 /* set up CB 0, not written */
7255 pipe.AddColorAttachment();
7256 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007257 /* FS writes CB 1, but we don't configure it */
7258
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007259 VkDescriptorSetObj descriptorSet(m_device);
7260 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007261 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007262
Tony Barbour5781e8f2015-08-04 16:23:11 -06007263 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007264
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007265 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007266}
7267
Karl Schultz6addd812016-02-02 17:17:23 -07007268TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007269 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007270 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007271
Chris Forbesa36d69e2015-05-25 11:13:44 +12007272 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007273
7274 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007275 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007276 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007277 "out gl_PerVertex {\n"
7278 " vec4 gl_Position;\n"
7279 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007280 "void main(){\n"
7281 " gl_Position = vec4(1);\n"
7282 "}\n";
7283 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007284 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007285 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007286 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12007287 "void main(){\n"
7288 " x = ivec4(1);\n"
7289 "}\n";
7290
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007291 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7292 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007293
7294 VkPipelineObj pipe(m_device);
7295 pipe.AddShader(&vs);
7296 pipe.AddShader(&fs);
7297
Chia-I Wu08accc62015-07-07 11:50:03 +08007298 /* set up CB 0; type is UNORM by default */
7299 pipe.AddColorAttachment();
7300 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007301
Chris Forbesa36d69e2015-05-25 11:13:44 +12007302 VkDescriptorSetObj descriptorSet(m_device);
7303 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007304 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007305
Tony Barbour5781e8f2015-08-04 16:23:11 -06007306 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007307
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007308 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12007309}
Chris Forbes7b1b8932015-06-05 14:43:36 +12007310
Karl Schultz6addd812016-02-02 17:17:23 -07007311TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007312 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007313 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007314
Chris Forbes556c76c2015-08-14 12:04:59 +12007315 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12007316
7317 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007318 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007319 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007320 "out gl_PerVertex {\n"
7321 " vec4 gl_Position;\n"
7322 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007323 "void main(){\n"
7324 " gl_Position = vec4(1);\n"
7325 "}\n";
7326 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007327 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007328 "\n"
7329 "layout(location=0) out vec4 x;\n"
7330 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7331 "void main(){\n"
7332 " x = vec4(bar.y);\n"
7333 "}\n";
7334
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007335 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7336 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12007337
Chris Forbes556c76c2015-08-14 12:04:59 +12007338 VkPipelineObj pipe(m_device);
7339 pipe.AddShader(&vs);
7340 pipe.AddShader(&fs);
7341
7342 /* set up CB 0; type is UNORM by default */
7343 pipe.AddColorAttachment();
7344 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7345
7346 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007347 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12007348
7349 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7350
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007351 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12007352}
7353
Chris Forbes5c59e902016-02-26 16:56:09 +13007354TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
7355 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7356 "not declared in layout");
7357
7358 ASSERT_NO_FATAL_FAILURE(InitState());
7359
7360 char const *vsSource =
7361 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007362 "\n"
7363 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
7364 "out gl_PerVertex {\n"
7365 " vec4 gl_Position;\n"
7366 "};\n"
7367 "void main(){\n"
7368 " gl_Position = vec4(consts.x);\n"
7369 "}\n";
7370 char const *fsSource =
7371 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007372 "\n"
7373 "layout(location=0) out vec4 x;\n"
7374 "void main(){\n"
7375 " x = vec4(1);\n"
7376 "}\n";
7377
7378 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7379 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7380
7381 VkPipelineObj pipe(m_device);
7382 pipe.AddShader(&vs);
7383 pipe.AddShader(&fs);
7384
7385 /* set up CB 0; type is UNORM by default */
7386 pipe.AddColorAttachment();
7387 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7388
7389 VkDescriptorSetObj descriptorSet(m_device);
7390 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7391
7392 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7393
7394 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007395 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13007396}
7397
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007398#endif // SHADER_CHECKER_TESTS
7399
7400#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06007401TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07007402 m_errorMonitor->SetDesiredFailureMsg(
7403 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007404 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007405
7406 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007407
7408 // Create an image
7409 VkImage image;
7410
Karl Schultz6addd812016-02-02 17:17:23 -07007411 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7412 const int32_t tex_width = 32;
7413 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007414
7415 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007416 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7417 image_create_info.pNext = NULL;
7418 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7419 image_create_info.format = tex_format;
7420 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007421 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07007422 image_create_info.extent.depth = 1;
7423 image_create_info.mipLevels = 1;
7424 image_create_info.arrayLayers = 1;
7425 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7426 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7427 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7428 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007429
7430 // Introduce error by sending down a bogus width extent
7431 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007432 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007433
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007434 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007435}
7436
Mark Youngc48c4c12016-04-11 14:26:49 -06007437TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
7438 m_errorMonitor->SetDesiredFailureMsg(
7439 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7440 "CreateImage extents is 0 for at least one required dimension");
7441
7442 ASSERT_NO_FATAL_FAILURE(InitState());
7443
7444 // Create an image
7445 VkImage image;
7446
7447 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7448 const int32_t tex_width = 32;
7449 const int32_t tex_height = 32;
7450
7451 VkImageCreateInfo image_create_info = {};
7452 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7453 image_create_info.pNext = NULL;
7454 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7455 image_create_info.format = tex_format;
7456 image_create_info.extent.width = tex_width;
7457 image_create_info.extent.height = tex_height;
7458 image_create_info.extent.depth = 1;
7459 image_create_info.mipLevels = 1;
7460 image_create_info.arrayLayers = 1;
7461 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7462 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7463 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7464 image_create_info.flags = 0;
7465
7466 // Introduce error by sending down a bogus width extent
7467 image_create_info.extent.width = 0;
7468 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7469
7470 m_errorMonitor->VerifyFound();
7471}
7472
Karl Schultz6addd812016-02-02 17:17:23 -07007473TEST_F(VkLayerTest, UpdateBufferAlignment) {
7474 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06007475
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007476 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007477 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007478
Mike Stroyana3082432015-09-25 13:39:21 -06007479 ASSERT_NO_FATAL_FAILURE(InitState());
7480
7481 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7482 vk_testing::Buffer buffer;
7483 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7484
7485 BeginCommandBuffer();
7486 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007487 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007488 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007489
Mike Stroyana3082432015-09-25 13:39:21 -06007490 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007492 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007493
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007494 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007495 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007496 EndCommandBuffer();
7497}
7498
Karl Schultz6addd812016-02-02 17:17:23 -07007499TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007501 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06007502
7503 ASSERT_NO_FATAL_FAILURE(InitState());
7504
7505 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7506 vk_testing::Buffer buffer;
7507 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7508
7509 BeginCommandBuffer();
7510 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007511 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007512 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007513
Mike Stroyana3082432015-09-25 13:39:21 -06007514 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007516 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007517
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007518 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007519
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007520 m_errorMonitor->VerifyFound();
7521
Mike Stroyana3082432015-09-25 13:39:21 -06007522 EndCommandBuffer();
7523}
7524
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007525#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12007526
Tobin Ehliscde08892015-09-22 10:11:37 -06007527#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007528TEST_F(VkLayerTest, InvalidImageView) {
7529 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06007530
Karl Schultz6addd812016-02-02 17:17:23 -07007531 m_errorMonitor->SetDesiredFailureMsg(
7532 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007533 "vkCreateImageView called with baseMipLevel 10 ");
7534
Tobin Ehliscde08892015-09-22 10:11:37 -06007535 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06007536
Mike Stroyana3082432015-09-25 13:39:21 -06007537 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07007538 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06007539
Karl Schultz6addd812016-02-02 17:17:23 -07007540 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7541 const int32_t tex_width = 32;
7542 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06007543
7544 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007545 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7546 image_create_info.pNext = NULL;
7547 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7548 image_create_info.format = tex_format;
7549 image_create_info.extent.width = tex_width;
7550 image_create_info.extent.height = tex_height;
7551 image_create_info.extent.depth = 1;
7552 image_create_info.mipLevels = 1;
7553 image_create_info.arrayLayers = 1;
7554 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7555 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7556 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7557 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06007558
Chia-I Wuf7458c52015-10-26 21:10:41 +08007559 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06007560 ASSERT_VK_SUCCESS(err);
7561
7562 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007563 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7564 image_view_create_info.image = image;
7565 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7566 image_view_create_info.format = tex_format;
7567 image_view_create_info.subresourceRange.layerCount = 1;
7568 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
7569 image_view_create_info.subresourceRange.levelCount = 1;
7570 image_view_create_info.subresourceRange.aspectMask =
7571 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06007572
7573 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007574 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7575 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06007576
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007577 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06007578}
Mike Stroyana3082432015-09-25 13:39:21 -06007579
Karl Schultz6addd812016-02-02 17:17:23 -07007580TEST_F(VkLayerTest, InvalidImageViewAspect) {
7581 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007582
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007583 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007584 "vkCreateImageView: Color image "
7585 "formats must have ONLY the "
7586 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007587
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007588 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007589
7590 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07007591 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007592
Karl Schultz6addd812016-02-02 17:17:23 -07007593 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7594 const int32_t tex_width = 32;
7595 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007596
7597 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007598 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7599 image_create_info.pNext = NULL;
7600 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7601 image_create_info.format = tex_format;
7602 image_create_info.extent.width = tex_width;
7603 image_create_info.extent.height = tex_height;
7604 image_create_info.extent.depth = 1;
7605 image_create_info.mipLevels = 1;
7606 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7607 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7608 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7609 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007610
Chia-I Wuf7458c52015-10-26 21:10:41 +08007611 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007612 ASSERT_VK_SUCCESS(err);
7613
7614 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007615 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7616 image_view_create_info.image = image;
7617 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7618 image_view_create_info.format = tex_format;
7619 image_view_create_info.subresourceRange.baseMipLevel = 0;
7620 image_view_create_info.subresourceRange.levelCount = 1;
7621 // Cause an error by setting an invalid image aspect
7622 image_view_create_info.subresourceRange.aspectMask =
7623 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007624
7625 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007626 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7627 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007628
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007629 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007630}
7631
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007632TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07007633 VkResult err;
7634 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007635
Karl Schultz6addd812016-02-02 17:17:23 -07007636 m_errorMonitor->SetDesiredFailureMsg(
7637 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007638 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007639
Mike Stroyana3082432015-09-25 13:39:21 -06007640 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007641
7642 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007643 VkImage srcImage;
7644 VkImage dstImage;
7645 VkDeviceMemory srcMem;
7646 VkDeviceMemory destMem;
7647 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007648
7649 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007650 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7651 image_create_info.pNext = NULL;
7652 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7653 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7654 image_create_info.extent.width = 32;
7655 image_create_info.extent.height = 32;
7656 image_create_info.extent.depth = 1;
7657 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007658 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07007659 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7660 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7661 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7662 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007663
Karl Schultz6addd812016-02-02 17:17:23 -07007664 err =
7665 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007666 ASSERT_VK_SUCCESS(err);
7667
Karl Schultz6addd812016-02-02 17:17:23 -07007668 err =
7669 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007670 ASSERT_VK_SUCCESS(err);
7671
7672 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007673 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007674 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7675 memAlloc.pNext = NULL;
7676 memAlloc.allocationSize = 0;
7677 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007678
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007679 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007680 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007681 pass =
7682 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007683 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007684 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007685 ASSERT_VK_SUCCESS(err);
7686
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007687 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007688 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007689 pass =
7690 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007691 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007692 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007693 ASSERT_VK_SUCCESS(err);
7694
7695 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7696 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007697 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007698 ASSERT_VK_SUCCESS(err);
7699
7700 BeginCommandBuffer();
7701 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007702 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007703 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007704 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007705 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06007706 copyRegion.srcOffset.x = 0;
7707 copyRegion.srcOffset.y = 0;
7708 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007709 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007710 copyRegion.dstSubresource.mipLevel = 0;
7711 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007712 // Introduce failure by forcing the dst layerCount to differ from src
7713 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007714 copyRegion.dstOffset.x = 0;
7715 copyRegion.dstOffset.y = 0;
7716 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007717 copyRegion.extent.width = 1;
7718 copyRegion.extent.height = 1;
7719 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007720 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7721 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007722 EndCommandBuffer();
7723
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007724 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007725
Chia-I Wuf7458c52015-10-26 21:10:41 +08007726 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007727 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007728 vkFreeMemory(m_device->device(), srcMem, NULL);
7729 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007730}
7731
Karl Schultz6addd812016-02-02 17:17:23 -07007732TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06007733 VkResult err;
7734 bool pass;
7735
7736 // Create color images with different format sizes and try to copy between them
7737 m_errorMonitor->SetDesiredFailureMsg(
7738 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7739 "vkCmdCopyImage called with unmatched source and dest image format sizes");
7740
7741 ASSERT_NO_FATAL_FAILURE(InitState());
7742
7743 // Create two images of different types and try to copy between them
7744 VkImage srcImage;
7745 VkImage dstImage;
7746 VkDeviceMemory srcMem;
7747 VkDeviceMemory destMem;
7748 VkMemoryRequirements memReqs;
7749
7750 VkImageCreateInfo image_create_info = {};
7751 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7752 image_create_info.pNext = NULL;
7753 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7754 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7755 image_create_info.extent.width = 32;
7756 image_create_info.extent.height = 32;
7757 image_create_info.extent.depth = 1;
7758 image_create_info.mipLevels = 1;
7759 image_create_info.arrayLayers = 1;
7760 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7761 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7762 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7763 image_create_info.flags = 0;
7764
7765 err =
7766 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
7767 ASSERT_VK_SUCCESS(err);
7768
7769 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7770 // Introduce failure by creating second image with a different-sized format.
7771 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
7772
7773 err =
7774 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
7775 ASSERT_VK_SUCCESS(err);
7776
7777 // Allocate memory
7778 VkMemoryAllocateInfo memAlloc = {};
7779 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7780 memAlloc.pNext = NULL;
7781 memAlloc.allocationSize = 0;
7782 memAlloc.memoryTypeIndex = 0;
7783
7784 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
7785 memAlloc.allocationSize = memReqs.size;
7786 pass =
7787 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7788 ASSERT_TRUE(pass);
7789 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
7790 ASSERT_VK_SUCCESS(err);
7791
7792 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
7793 memAlloc.allocationSize = memReqs.size;
7794 pass =
7795 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7796 ASSERT_TRUE(pass);
7797 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
7798 ASSERT_VK_SUCCESS(err);
7799
7800 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7801 ASSERT_VK_SUCCESS(err);
7802 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
7803 ASSERT_VK_SUCCESS(err);
7804
7805 BeginCommandBuffer();
7806 VkImageCopy copyRegion;
7807 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7808 copyRegion.srcSubresource.mipLevel = 0;
7809 copyRegion.srcSubresource.baseArrayLayer = 0;
7810 copyRegion.srcSubresource.layerCount = 0;
7811 copyRegion.srcOffset.x = 0;
7812 copyRegion.srcOffset.y = 0;
7813 copyRegion.srcOffset.z = 0;
7814 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7815 copyRegion.dstSubresource.mipLevel = 0;
7816 copyRegion.dstSubresource.baseArrayLayer = 0;
7817 copyRegion.dstSubresource.layerCount = 0;
7818 copyRegion.dstOffset.x = 0;
7819 copyRegion.dstOffset.y = 0;
7820 copyRegion.dstOffset.z = 0;
7821 copyRegion.extent.width = 1;
7822 copyRegion.extent.height = 1;
7823 copyRegion.extent.depth = 1;
7824 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7825 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7826 EndCommandBuffer();
7827
7828 m_errorMonitor->VerifyFound();
7829
7830 vkDestroyImage(m_device->device(), srcImage, NULL);
7831 vkDestroyImage(m_device->device(), dstImage, NULL);
7832 vkFreeMemory(m_device->device(), srcMem, NULL);
7833 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007834}
7835
Karl Schultz6addd812016-02-02 17:17:23 -07007836TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
7837 VkResult err;
7838 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007839
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007840 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007841 m_errorMonitor->SetDesiredFailureMsg(
7842 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007843 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007844
Mike Stroyana3082432015-09-25 13:39:21 -06007845 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007846
7847 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007848 VkImage srcImage;
7849 VkImage dstImage;
7850 VkDeviceMemory srcMem;
7851 VkDeviceMemory destMem;
7852 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007853
7854 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007855 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7856 image_create_info.pNext = NULL;
7857 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7858 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7859 image_create_info.extent.width = 32;
7860 image_create_info.extent.height = 32;
7861 image_create_info.extent.depth = 1;
7862 image_create_info.mipLevels = 1;
7863 image_create_info.arrayLayers = 1;
7864 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7865 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7866 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7867 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007868
Karl Schultz6addd812016-02-02 17:17:23 -07007869 err =
7870 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007871 ASSERT_VK_SUCCESS(err);
7872
Karl Schultzbdb75952016-04-19 11:36:49 -06007873 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7874
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007875 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07007876 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007877 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
7878 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007879
Karl Schultz6addd812016-02-02 17:17:23 -07007880 err =
7881 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007882 ASSERT_VK_SUCCESS(err);
7883
7884 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007885 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007886 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7887 memAlloc.pNext = NULL;
7888 memAlloc.allocationSize = 0;
7889 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007890
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007891 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007892 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007893 pass =
7894 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007895 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007896 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007897 ASSERT_VK_SUCCESS(err);
7898
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007899 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007900 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007901 pass =
7902 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007903 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007904 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007905 ASSERT_VK_SUCCESS(err);
7906
7907 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7908 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007909 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007910 ASSERT_VK_SUCCESS(err);
7911
7912 BeginCommandBuffer();
7913 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007914 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007915 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007916 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007917 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007918 copyRegion.srcOffset.x = 0;
7919 copyRegion.srcOffset.y = 0;
7920 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007921 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007922 copyRegion.dstSubresource.mipLevel = 0;
7923 copyRegion.dstSubresource.baseArrayLayer = 0;
7924 copyRegion.dstSubresource.layerCount = 0;
7925 copyRegion.dstOffset.x = 0;
7926 copyRegion.dstOffset.y = 0;
7927 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007928 copyRegion.extent.width = 1;
7929 copyRegion.extent.height = 1;
7930 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007931 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7932 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007933 EndCommandBuffer();
7934
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007935 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007936
Chia-I Wuf7458c52015-10-26 21:10:41 +08007937 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007938 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007939 vkFreeMemory(m_device->device(), srcMem, NULL);
7940 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007941}
7942
Karl Schultz6addd812016-02-02 17:17:23 -07007943TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
7944 VkResult err;
7945 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007946
Karl Schultz6addd812016-02-02 17:17:23 -07007947 m_errorMonitor->SetDesiredFailureMsg(
7948 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007949 "vkCmdResolveImage called with source sample count less than 2.");
7950
Mike Stroyana3082432015-09-25 13:39:21 -06007951 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007952
7953 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07007954 VkImage srcImage;
7955 VkImage dstImage;
7956 VkDeviceMemory srcMem;
7957 VkDeviceMemory destMem;
7958 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007959
7960 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007961 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7962 image_create_info.pNext = NULL;
7963 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7964 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7965 image_create_info.extent.width = 32;
7966 image_create_info.extent.height = 1;
7967 image_create_info.extent.depth = 1;
7968 image_create_info.mipLevels = 1;
7969 image_create_info.arrayLayers = 1;
7970 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7971 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7972 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7973 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007974
Karl Schultz6addd812016-02-02 17:17:23 -07007975 err =
7976 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007977 ASSERT_VK_SUCCESS(err);
7978
Karl Schultz6addd812016-02-02 17:17:23 -07007979 image_create_info.imageType = VK_IMAGE_TYPE_1D;
7980 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007981
Karl Schultz6addd812016-02-02 17:17:23 -07007982 err =
7983 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007984 ASSERT_VK_SUCCESS(err);
7985
7986 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007987 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007988 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7989 memAlloc.pNext = NULL;
7990 memAlloc.allocationSize = 0;
7991 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007992
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007993 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007994 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007995 pass =
7996 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007997 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007998 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007999 ASSERT_VK_SUCCESS(err);
8000
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008001 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008002 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008003 pass =
8004 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008005 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008006 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008007 ASSERT_VK_SUCCESS(err);
8008
8009 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8010 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008011 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008012 ASSERT_VK_SUCCESS(err);
8013
8014 BeginCommandBuffer();
8015 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008016 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8017 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008018 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008019 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008020 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008021 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008022 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008023 resolveRegion.srcOffset.x = 0;
8024 resolveRegion.srcOffset.y = 0;
8025 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008026 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008027 resolveRegion.dstSubresource.mipLevel = 0;
8028 resolveRegion.dstSubresource.baseArrayLayer = 0;
8029 resolveRegion.dstSubresource.layerCount = 0;
8030 resolveRegion.dstOffset.x = 0;
8031 resolveRegion.dstOffset.y = 0;
8032 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008033 resolveRegion.extent.width = 1;
8034 resolveRegion.extent.height = 1;
8035 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008036 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8037 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008038 EndCommandBuffer();
8039
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008040 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008041
Chia-I Wuf7458c52015-10-26 21:10:41 +08008042 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008043 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008044 vkFreeMemory(m_device->device(), srcMem, NULL);
8045 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008046}
8047
Karl Schultz6addd812016-02-02 17:17:23 -07008048TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
8049 VkResult err;
8050 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008051
Karl Schultz6addd812016-02-02 17:17:23 -07008052 m_errorMonitor->SetDesiredFailureMsg(
8053 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008054 "vkCmdResolveImage called with dest sample count greater than 1.");
8055
Mike Stroyana3082432015-09-25 13:39:21 -06008056 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008057
8058 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008059 VkImage srcImage;
8060 VkImage dstImage;
8061 VkDeviceMemory srcMem;
8062 VkDeviceMemory destMem;
8063 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008064
8065 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008066 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8067 image_create_info.pNext = NULL;
8068 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8069 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8070 image_create_info.extent.width = 32;
8071 image_create_info.extent.height = 1;
8072 image_create_info.extent.depth = 1;
8073 image_create_info.mipLevels = 1;
8074 image_create_info.arrayLayers = 1;
8075 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8076 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8077 // Note: Some implementations expect color attachment usage for any
8078 // multisample surface
8079 image_create_info.usage =
8080 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8081 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008082
Karl Schultz6addd812016-02-02 17:17:23 -07008083 err =
8084 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008085 ASSERT_VK_SUCCESS(err);
8086
Karl Schultz6addd812016-02-02 17:17:23 -07008087 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8088 // Note: Some implementations expect color attachment usage for any
8089 // multisample surface
8090 image_create_info.usage =
8091 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008092
Karl Schultz6addd812016-02-02 17:17:23 -07008093 err =
8094 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008095 ASSERT_VK_SUCCESS(err);
8096
8097 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008098 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008099 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8100 memAlloc.pNext = NULL;
8101 memAlloc.allocationSize = 0;
8102 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008103
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008104 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008105 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008106 pass =
8107 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008108 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008109 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008110 ASSERT_VK_SUCCESS(err);
8111
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008112 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008113 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008114 pass =
8115 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008116 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008117 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008118 ASSERT_VK_SUCCESS(err);
8119
8120 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8121 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008122 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008123 ASSERT_VK_SUCCESS(err);
8124
8125 BeginCommandBuffer();
8126 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008127 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8128 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008129 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008130 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008131 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008132 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008133 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008134 resolveRegion.srcOffset.x = 0;
8135 resolveRegion.srcOffset.y = 0;
8136 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008137 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008138 resolveRegion.dstSubresource.mipLevel = 0;
8139 resolveRegion.dstSubresource.baseArrayLayer = 0;
8140 resolveRegion.dstSubresource.layerCount = 0;
8141 resolveRegion.dstOffset.x = 0;
8142 resolveRegion.dstOffset.y = 0;
8143 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008144 resolveRegion.extent.width = 1;
8145 resolveRegion.extent.height = 1;
8146 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008147 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8148 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008149 EndCommandBuffer();
8150
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008151 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008152
Chia-I Wuf7458c52015-10-26 21:10:41 +08008153 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008154 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008155 vkFreeMemory(m_device->device(), srcMem, NULL);
8156 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008157}
8158
Karl Schultz6addd812016-02-02 17:17:23 -07008159TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
8160 VkResult err;
8161 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008162
Karl Schultz6addd812016-02-02 17:17:23 -07008163 m_errorMonitor->SetDesiredFailureMsg(
8164 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008165 "vkCmdResolveImage called with unmatched source and dest formats.");
8166
Mike Stroyana3082432015-09-25 13:39:21 -06008167 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008168
8169 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008170 VkImage srcImage;
8171 VkImage dstImage;
8172 VkDeviceMemory srcMem;
8173 VkDeviceMemory destMem;
8174 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008175
8176 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008177 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8178 image_create_info.pNext = NULL;
8179 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8180 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8181 image_create_info.extent.width = 32;
8182 image_create_info.extent.height = 1;
8183 image_create_info.extent.depth = 1;
8184 image_create_info.mipLevels = 1;
8185 image_create_info.arrayLayers = 1;
8186 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8187 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8188 // Note: Some implementations expect color attachment usage for any
8189 // multisample surface
8190 image_create_info.usage =
8191 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8192 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008193
Karl Schultz6addd812016-02-02 17:17:23 -07008194 err =
8195 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008196 ASSERT_VK_SUCCESS(err);
8197
Karl Schultz6addd812016-02-02 17:17:23 -07008198 // Set format to something other than source image
8199 image_create_info.format = VK_FORMAT_R32_SFLOAT;
8200 // Note: Some implementations expect color attachment usage for any
8201 // multisample surface
8202 image_create_info.usage =
8203 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8204 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008205
Karl Schultz6addd812016-02-02 17:17:23 -07008206 err =
8207 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008208 ASSERT_VK_SUCCESS(err);
8209
8210 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008211 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008212 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8213 memAlloc.pNext = NULL;
8214 memAlloc.allocationSize = 0;
8215 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008216
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008217 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008218 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008219 pass =
8220 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008221 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008222 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008223 ASSERT_VK_SUCCESS(err);
8224
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008225 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008226 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008227 pass =
8228 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008229 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008230 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008231 ASSERT_VK_SUCCESS(err);
8232
8233 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8234 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008235 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008236 ASSERT_VK_SUCCESS(err);
8237
8238 BeginCommandBuffer();
8239 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008240 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8241 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008242 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008243 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008244 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008245 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008246 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008247 resolveRegion.srcOffset.x = 0;
8248 resolveRegion.srcOffset.y = 0;
8249 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008250 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008251 resolveRegion.dstSubresource.mipLevel = 0;
8252 resolveRegion.dstSubresource.baseArrayLayer = 0;
8253 resolveRegion.dstSubresource.layerCount = 0;
8254 resolveRegion.dstOffset.x = 0;
8255 resolveRegion.dstOffset.y = 0;
8256 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008257 resolveRegion.extent.width = 1;
8258 resolveRegion.extent.height = 1;
8259 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008260 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8261 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008262 EndCommandBuffer();
8263
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008264 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008265
Chia-I Wuf7458c52015-10-26 21:10:41 +08008266 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008267 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008268 vkFreeMemory(m_device->device(), srcMem, NULL);
8269 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008270}
8271
Karl Schultz6addd812016-02-02 17:17:23 -07008272TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
8273 VkResult err;
8274 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008275
Karl Schultz6addd812016-02-02 17:17:23 -07008276 m_errorMonitor->SetDesiredFailureMsg(
8277 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008278 "vkCmdResolveImage called with unmatched source and dest image types.");
8279
Mike Stroyana3082432015-09-25 13:39:21 -06008280 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008281
8282 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008283 VkImage srcImage;
8284 VkImage dstImage;
8285 VkDeviceMemory srcMem;
8286 VkDeviceMemory destMem;
8287 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008288
8289 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008290 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8291 image_create_info.pNext = NULL;
8292 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8293 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8294 image_create_info.extent.width = 32;
8295 image_create_info.extent.height = 1;
8296 image_create_info.extent.depth = 1;
8297 image_create_info.mipLevels = 1;
8298 image_create_info.arrayLayers = 1;
8299 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8300 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8301 // Note: Some implementations expect color attachment usage for any
8302 // multisample surface
8303 image_create_info.usage =
8304 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8305 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008306
Karl Schultz6addd812016-02-02 17:17:23 -07008307 err =
8308 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008309 ASSERT_VK_SUCCESS(err);
8310
Karl Schultz6addd812016-02-02 17:17:23 -07008311 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8312 // Note: Some implementations expect color attachment usage for any
8313 // multisample surface
8314 image_create_info.usage =
8315 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8316 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008317
Karl Schultz6addd812016-02-02 17:17:23 -07008318 err =
8319 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008320 ASSERT_VK_SUCCESS(err);
8321
8322 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008323 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008324 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8325 memAlloc.pNext = NULL;
8326 memAlloc.allocationSize = 0;
8327 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008328
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008329 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008330 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008331 pass =
8332 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008333 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008334 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008335 ASSERT_VK_SUCCESS(err);
8336
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008337 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008338 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008339 pass =
8340 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008341 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008342 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008343 ASSERT_VK_SUCCESS(err);
8344
8345 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8346 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008347 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008348 ASSERT_VK_SUCCESS(err);
8349
8350 BeginCommandBuffer();
8351 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008352 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8353 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008354 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008355 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008356 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008357 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008358 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008359 resolveRegion.srcOffset.x = 0;
8360 resolveRegion.srcOffset.y = 0;
8361 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008362 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008363 resolveRegion.dstSubresource.mipLevel = 0;
8364 resolveRegion.dstSubresource.baseArrayLayer = 0;
8365 resolveRegion.dstSubresource.layerCount = 0;
8366 resolveRegion.dstOffset.x = 0;
8367 resolveRegion.dstOffset.y = 0;
8368 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008369 resolveRegion.extent.width = 1;
8370 resolveRegion.extent.height = 1;
8371 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008372 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8373 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008374 EndCommandBuffer();
8375
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008376 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008377
Chia-I Wuf7458c52015-10-26 21:10:41 +08008378 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008379 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008380 vkFreeMemory(m_device->device(), srcMem, NULL);
8381 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008382}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008383
Karl Schultz6addd812016-02-02 17:17:23 -07008384TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008385 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07008386 // to using a DS format, then cause it to hit error due to COLOR_BIT not
8387 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008388 // The image format check comes 2nd in validation so we trigger it first,
8389 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07008390 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008391
Karl Schultz6addd812016-02-02 17:17:23 -07008392 m_errorMonitor->SetDesiredFailureMsg(
8393 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008394 "Combination depth/stencil image formats can have only the ");
8395
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008396 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008397
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008398 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008399 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8400 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008401
8402 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008403 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8404 ds_pool_ci.pNext = NULL;
8405 ds_pool_ci.maxSets = 1;
8406 ds_pool_ci.poolSizeCount = 1;
8407 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008408
8409 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008410 err =
8411 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008412 ASSERT_VK_SUCCESS(err);
8413
8414 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008415 dsl_binding.binding = 0;
8416 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8417 dsl_binding.descriptorCount = 1;
8418 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8419 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008420
8421 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008422 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8423 ds_layout_ci.pNext = NULL;
8424 ds_layout_ci.bindingCount = 1;
8425 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008426 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008427 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8428 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008429 ASSERT_VK_SUCCESS(err);
8430
8431 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008432 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008433 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008434 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008435 alloc_info.descriptorPool = ds_pool;
8436 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008437 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8438 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008439 ASSERT_VK_SUCCESS(err);
8440
Karl Schultz6addd812016-02-02 17:17:23 -07008441 VkImage image_bad;
8442 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008443 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07008444 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008445 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07008446 const int32_t tex_width = 32;
8447 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008448
8449 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008450 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8451 image_create_info.pNext = NULL;
8452 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8453 image_create_info.format = tex_format_bad;
8454 image_create_info.extent.width = tex_width;
8455 image_create_info.extent.height = tex_height;
8456 image_create_info.extent.depth = 1;
8457 image_create_info.mipLevels = 1;
8458 image_create_info.arrayLayers = 1;
8459 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8460 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8461 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
8462 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
8463 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008464
Karl Schultz6addd812016-02-02 17:17:23 -07008465 err =
8466 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008467 ASSERT_VK_SUCCESS(err);
8468 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07008469 image_create_info.usage =
8470 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8471 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
8472 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008473 ASSERT_VK_SUCCESS(err);
8474
8475 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008476 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8477 image_view_create_info.image = image_bad;
8478 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8479 image_view_create_info.format = tex_format_bad;
8480 image_view_create_info.subresourceRange.baseArrayLayer = 0;
8481 image_view_create_info.subresourceRange.baseMipLevel = 0;
8482 image_view_create_info.subresourceRange.layerCount = 1;
8483 image_view_create_info.subresourceRange.levelCount = 1;
8484 image_view_create_info.subresourceRange.aspectMask =
8485 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008486
8487 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008488 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8489 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008490
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008491 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008492
Chia-I Wuf7458c52015-10-26 21:10:41 +08008493 vkDestroyImage(m_device->device(), image_bad, NULL);
8494 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008495 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8496 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008497}
Tobin Ehliscde08892015-09-22 10:11:37 -06008498#endif // IMAGE_TESTS
8499
Tony Barbour300a6082015-04-07 13:44:53 -06008500int main(int argc, char **argv) {
8501 int result;
8502
Cody Northrop8e54a402016-03-08 22:25:52 -07008503#ifdef ANDROID
8504 int vulkanSupport = InitVulkan();
8505 if (vulkanSupport == 0)
8506 return 1;
8507#endif
8508
Tony Barbour300a6082015-04-07 13:44:53 -06008509 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06008510 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06008511
8512 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
8513
8514 result = RUN_ALL_TESTS();
8515
Tony Barbour6918cd52015-04-09 12:58:51 -06008516 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06008517 return result;
8518}