blob: b8bd5b512c18340cf0e054c4228cba4d29c612fa [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
20 */
Tony Barbour65c48b32015-11-17 10:02:56 -070021
Cody Northrop8e54a402016-03-08 22:25:52 -070022#ifdef ANDROID
23#include "vulkan_wrapper.h"
24#else
David Pinedo9316d3b2015-11-06 12:54:48 -070025#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070026#endif
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060027#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060029#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070030#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060031
Mark Lobodzinski3780e142015-05-14 15:08:13 -050032#define GLM_FORCE_RADIANS
33#include "glm/glm.hpp"
34#include <glm/gtc/matrix_transform.hpp>
35
Tobin Ehlis0788f522015-05-26 16:11:58 -060036#define MEM_TRACKER_TESTS 1
37#define OBJ_TRACKER_TESTS 1
38#define DRAW_STATE_TESTS 1
39#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120040#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060041#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060042#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060043
Mark Lobodzinski3780e142015-05-14 15:08:13 -050044//--------------------------------------------------------------------------------------
45// Mesh and VertexFormat Data
46//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070047struct Vertex {
48 float posX, posY, posZ, posW; // Position data
49 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050050};
51
Karl Schultz6addd812016-02-02 17:17:23 -070052#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050053
54typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070055 BsoFailNone = 0x00000000,
56 BsoFailLineWidth = 0x00000001,
57 BsoFailDepthBias = 0x00000002,
58 BsoFailViewport = 0x00000004,
59 BsoFailScissor = 0x00000008,
60 BsoFailBlend = 0x00000010,
61 BsoFailDepthBounds = 0x00000020,
62 BsoFailStencilReadMask = 0x00000040,
63 BsoFailStencilWriteMask = 0x00000080,
64 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050065} BsoFailSelect;
66
67struct vktriangle_vs_uniform {
68 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070069 float mvp[4][4];
70 float position[3][4];
71 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050072};
73
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050074static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120075 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070076 "vec2 vertices[3];\n"
77 "out gl_PerVertex {\n"
78 " vec4 gl_Position;\n"
79 "};\n"
80 "void main() {\n"
81 " vertices[0] = vec2(-1.0, -1.0);\n"
82 " vertices[1] = vec2( 1.0, -1.0);\n"
83 " vertices[2] = vec2( 0.0, 1.0);\n"
84 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
85 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050086
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050087static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120088 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070089 "\n"
90 "layout(location = 0) out vec4 uFragColor;\n"
91 "void main(){\n"
92 " uFragColor = vec4(0,1,0,1);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Karl Schultz6addd812016-02-02 17:17:23 -070095static VKAPI_ATTR VkBool32 VKAPI_CALL
96myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
97 uint64_t srcObject, size_t location, int32_t msgCode,
98 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -060099
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600100// ********************************************************
101// ErrorMonitor Usage:
102//
103// Call SetDesiredFailureMsg with a string to be compared against all
104// encountered log messages. Passing NULL will match all log messages.
105// logMsg will return true for skipCall only if msg is matched or NULL.
106//
107// Call DesiredMsgFound to determine if the desired failure message
108// was encountered.
109
Tony Barbour300a6082015-04-07 13:44:53 -0600110class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700111 public:
112 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600113 test_platform_thread_create_mutex(&m_mutex);
114 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700115 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700116 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600117 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600118 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600119
Dustin Graves48458142016-04-29 16:11:55 -0600120 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
121
Karl Schultz6addd812016-02-02 17:17:23 -0700122 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200123 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600124 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600125 m_failureMsg.clear();
126 m_otherMsgs.clear();
127 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700128 m_msgFound = VK_FALSE;
129 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600130 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600131 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600132
Karl Schultz6addd812016-02-02 17:17:23 -0700133 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600134 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600135 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600136 if (m_bailout != NULL) {
137 *m_bailout = true;
138 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600139 string errorString(msgString);
140 if (msgFlags & m_msgFlags) {
141 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200142 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
143 m_otherMsgs.push_back(m_failureMsg);
144 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600145 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700146 m_msgFound = VK_TRUE;
147 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600148 } else {
149 m_otherMsgs.push_back(errorString);
150 }
151 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600152 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600153 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600154 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600155
Karl Schultz6addd812016-02-02 17:17:23 -0700156 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600157
Karl Schultz6addd812016-02-02 17:17:23 -0700158 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600159
Karl Schultz6addd812016-02-02 17:17:23 -0700160 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161
Karl Schultz6addd812016-02-02 17:17:23 -0700162 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600163
Karl Schultz6addd812016-02-02 17:17:23 -0700164 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165 vector<string> otherMsgs = GetOtherFailureMsgs();
166 cout << "Other error messages logged for this test were:" << endl;
167 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
168 cout << " " << *iter << endl;
169 }
170 }
171
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200172 /* helpers */
173
174 void ExpectSuccess() {
175 // match anything
176 SetDesiredFailureMsg(~0u, "");
177 }
178
179 void VerifyFound() {
180 // Not seeing the desired message is a failure. /Before/ throwing, dump
181 // any other messages.
182 if (!DesiredMsgFound()) {
183 DumpFailureMsgs();
184 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
185 }
186 }
187
188 void VerifyNotFound() {
189 // ExpectSuccess() configured us to match anything. Any error is a
190 // failure.
191 if (DesiredMsgFound()) {
192 DumpFailureMsgs();
193 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
194 }
195 }
196
Karl Schultz6addd812016-02-02 17:17:23 -0700197 private:
198 VkFlags m_msgFlags;
199 string m_desiredMsg;
200 string m_failureMsg;
201 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600202 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700203 bool *m_bailout;
204 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600205};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500206
Karl Schultz6addd812016-02-02 17:17:23 -0700207static VKAPI_ATTR VkBool32 VKAPI_CALL
208myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
209 uint64_t srcObject, size_t location, int32_t msgCode,
210 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
211 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700212 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700213 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600214 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600215 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600216 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600217 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600218}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500219
Karl Schultz6addd812016-02-02 17:17:23 -0700220class VkLayerTest : public VkRenderFramework {
221 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800222 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
223 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700224 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
225 BsoFailSelect failMask);
226 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
227 VkPipelineObj &pipelineobj,
228 VkDescriptorSetObj &descriptorSet,
229 BsoFailSelect failMask);
230 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
231 VkDescriptorSetObj &descriptorSet,
232 BsoFailSelect failMask) {
233 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
234 failMask);
235 }
Tony Barbour300a6082015-04-07 13:44:53 -0600236
Tony Barbourfe3351b2015-07-28 10:17:20 -0600237 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700238 VkResult BeginCommandBuffer() {
239 return BeginCommandBuffer(*m_commandBuffer);
240 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800241 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700242 void Draw(uint32_t vertexCount, uint32_t instanceCount,
243 uint32_t firstVertex, uint32_t firstInstance) {
244 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
245 firstInstance);
246 }
247 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
248 uint32_t firstIndex, int32_t vertexOffset,
249 uint32_t firstInstance) {
250 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
251 vertexOffset, firstInstance);
252 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800253 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700254 void QueueCommandBuffer(const VkFence &fence) {
255 m_commandBuffer->QueueCommandBuffer(fence);
256 }
257 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
258 VkDeviceSize offset, uint32_t binding) {
259 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
260 }
261 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
262 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
263 }
264
265 protected:
266 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600267
268 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600269 std::vector<const char *> instance_layer_names;
270 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600271 std::vector<const char *> instance_extension_names;
272 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600273
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700274 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600275 /*
276 * Since CreateDbgMsgCallback is an instance level extension call
277 * any extension / layer that utilizes that feature also needs
278 * to be enabled at create instance time.
279 */
Karl Schultz6addd812016-02-02 17:17:23 -0700280 // Use Threading layer first to protect others from
281 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700282 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600283 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800284 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700285 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800286 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
287 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600288 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700289 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600290
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700291 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600292 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800293 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700294 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800295 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
296 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600297 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700298 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600299
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600300 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600301 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800302 this->app_info.pApplicationName = "layer_tests";
303 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600304 this->app_info.pEngineName = "unittest";
305 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600306 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600307
Tony Barbour15524c32015-04-29 17:34:29 -0600308 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600309 InitFramework(instance_layer_names, device_layer_names,
310 instance_extension_names, device_extension_names,
311 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600312 }
313
314 virtual void TearDown() {
315 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600316 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600317 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600318 }
319};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500320
Karl Schultz6addd812016-02-02 17:17:23 -0700321VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600322 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600323
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800324 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600325
326 /*
327 * For render test all drawing happens in a single render pass
328 * on a single command buffer.
329 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200330 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800331 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600332 }
333
334 return result;
335}
336
Karl Schultz6addd812016-02-02 17:17:23 -0700337VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600338 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600339
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200340 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800341 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200342 }
Tony Barbour300a6082015-04-07 13:44:53 -0600343
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800344 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600345
346 return result;
347}
348
Karl Schultz6addd812016-02-02 17:17:23 -0700349void VkLayerTest::VKTriangleTest(const char *vertShaderText,
350 const char *fragShaderText,
351 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500352 // Create identity matrix
353 int i;
354 struct vktriangle_vs_uniform data;
355
356 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700357 glm::mat4 View = glm::mat4(1.0f);
358 glm::mat4 Model = glm::mat4(1.0f);
359 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500360 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700361 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500362
363 memcpy(&data.mvp, &MVP[0][0], matrixSize);
364
Karl Schultz6addd812016-02-02 17:17:23 -0700365 static const Vertex tri_data[] = {
366 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
367 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
368 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500369 };
370
Karl Schultz6addd812016-02-02 17:17:23 -0700371 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500372 data.position[i][0] = tri_data[i].posX;
373 data.position[i][1] = tri_data[i].posY;
374 data.position[i][2] = tri_data[i].posZ;
375 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700376 data.color[i][0] = tri_data[i].r;
377 data.color[i][1] = tri_data[i].g;
378 data.color[i][2] = tri_data[i].b;
379 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500380 }
381
382 ASSERT_NO_FATAL_FAILURE(InitState());
383 ASSERT_NO_FATAL_FAILURE(InitViewport());
384
Karl Schultz6addd812016-02-02 17:17:23 -0700385 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
386 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500387
Karl Schultz6addd812016-02-02 17:17:23 -0700388 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
389 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
390 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500391
392 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800393 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500394 pipelineobj.AddShader(&vs);
395 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600396 if (failMask & BsoFailLineWidth) {
397 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600398 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
399 ia_state.sType =
400 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
401 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
402 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600403 }
404 if (failMask & BsoFailDepthBias) {
405 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600406 VkPipelineRasterizationStateCreateInfo rs_state = {};
407 rs_state.sType =
408 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
409 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600410 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600411 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600412 }
Karl Schultz6addd812016-02-02 17:17:23 -0700413 // Viewport and scissors must stay in synch or other errors will occur than
414 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600415 if (failMask & BsoFailViewport) {
416 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600417 m_viewports.clear();
418 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600419 }
420 if (failMask & BsoFailScissor) {
421 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600422 m_scissors.clear();
423 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600424 }
425 if (failMask & BsoFailBlend) {
426 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600427 VkPipelineColorBlendAttachmentState att_state = {};
428 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
429 att_state.blendEnable = VK_TRUE;
430 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600431 }
432 if (failMask & BsoFailDepthBounds) {
433 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
434 }
435 if (failMask & BsoFailStencilReadMask) {
436 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
437 }
438 if (failMask & BsoFailStencilWriteMask) {
439 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
440 }
441 if (failMask & BsoFailStencilReference) {
442 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
443 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500444
445 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700446 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
447 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500448
449 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600450 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500451
Tony Barbourfe3351b2015-07-28 10:17:20 -0600452 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500453
454 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600455 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456
457 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600458 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500459
Tony Barbourfe3351b2015-07-28 10:17:20 -0600460 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500461}
462
Karl Schultz6addd812016-02-02 17:17:23 -0700463void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
464 VkPipelineObj &pipelineobj,
465 VkDescriptorSetObj &descriptorSet,
466 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500467 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700468 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
469 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500470 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700471 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
472 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500473 }
474
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800475 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700476 // Make sure depthWriteEnable is set so that Depth fail test will work
477 // correctly
478 // Make sure stencilTestEnable is set so that Stencil fail test will work
479 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600480 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800481 stencil.failOp = VK_STENCIL_OP_KEEP;
482 stencil.passOp = VK_STENCIL_OP_KEEP;
483 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
484 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600485
486 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
487 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600488 ds_ci.pNext = NULL;
489 ds_ci.depthTestEnable = VK_FALSE;
490 ds_ci.depthWriteEnable = VK_TRUE;
491 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
492 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 if (failMask & BsoFailDepthBounds) {
494 ds_ci.depthBoundsTestEnable = VK_TRUE;
495 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600496 ds_ci.stencilTestEnable = VK_TRUE;
497 ds_ci.front = stencil;
498 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600499
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600500 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600501 pipelineobj.SetViewport(m_viewports);
502 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800503 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700504 VkResult err = pipelineobj.CreateVKPipeline(
505 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600506 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800507 commandBuffer->BindPipeline(pipelineobj);
508 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500509}
510
511// ********************************************************************************************************************
512// ********************************************************************************************************************
513// ********************************************************************************************************************
514// ********************************************************************************************************************
Tobin Ehlis0788f522015-05-26 16:11:58 -0600515#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700516#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800517TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500518{
519 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500520 VkFenceCreateInfo fenceInfo = {};
521 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
522 fenceInfo.pNext = NULL;
523 fenceInfo.flags = 0;
524
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600526
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500527 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600528
529 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
530 vk_testing::Buffer buffer;
531 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500532
Tony Barbourfe3351b2015-07-28 10:17:20 -0600533 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800534 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600535 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500536
537 testFence.init(*m_device, fenceInfo);
538
539 // Bypass framework since it does the waits automatically
540 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600541 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800542 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
543 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800544 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600545 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700546 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800547 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800548 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800549 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600550 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600551
552 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500553 ASSERT_VK_SUCCESS( err );
554
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500555 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800556 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500557
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200558 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500559}
560
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800561TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500562{
563 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500564 VkFenceCreateInfo fenceInfo = {};
565 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
566 fenceInfo.pNext = NULL;
567 fenceInfo.flags = 0;
568
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600570
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500571 ASSERT_NO_FATAL_FAILURE(InitState());
572 ASSERT_NO_FATAL_FAILURE(InitViewport());
573 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
574
Tony Barbourfe3351b2015-07-28 10:17:20 -0600575 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800576 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600577 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500578
579 testFence.init(*m_device, fenceInfo);
580
581 // Bypass framework since it does the waits automatically
582 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600583 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800584 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
585 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800586 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600587 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700588 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800589 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800590 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800591 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600592 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600593
594 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500595 ASSERT_VK_SUCCESS( err );
596
Jon Ashburnf19916e2016-01-11 13:12:43 -0700597 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800598 VkCommandBufferBeginInfo info = {};
599 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
600 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600601 info.renderPass = VK_NULL_HANDLE;
602 info.subpass = 0;
603 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800604 info.occlusionQueryEnable = VK_FALSE;
605 info.queryFlags = 0;
606 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600607
608 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800609 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500610
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200611 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500612}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700613#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200614
Mark Lobodzinski152fe252016-05-03 16:49:15 -0600615// This is a positive test. No failures are expected.
616TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
617 VkResult err;
618 bool pass;
619
620 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
621 "the buffer, create an image, and bind the same memory to "
622 "it");
623
624 m_errorMonitor->ExpectSuccess();
625
626 ASSERT_NO_FATAL_FAILURE(InitState());
627
628 VkBuffer buffer;
629 VkImage image;
630 VkDeviceMemory mem;
631 VkMemoryRequirements mem_reqs;
632
633 VkBufferCreateInfo buf_info = {};
634 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
635 buf_info.pNext = NULL;
636 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
637 buf_info.size = 256;
638 buf_info.queueFamilyIndexCount = 0;
639 buf_info.pQueueFamilyIndices = NULL;
640 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
641 buf_info.flags = 0;
642 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
643 ASSERT_VK_SUCCESS(err);
644
645 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
646
647 VkMemoryAllocateInfo alloc_info = {};
648 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
649 alloc_info.pNext = NULL;
650 alloc_info.memoryTypeIndex = 0;
651
652 // Ensure memory is big enough for both bindings
653 alloc_info.allocationSize = 0x10000;
654
655 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
656 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
657 if (!pass) {
658 vkDestroyBuffer(m_device->device(), buffer, NULL);
659 return;
660 }
661
662 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
663 ASSERT_VK_SUCCESS(err);
664
665 uint8_t *pData;
666 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
667 (void **)&pData);
668 ASSERT_VK_SUCCESS(err);
669
670 memset(pData, 0xCADECADE, mem_reqs.size);
671
672 vkUnmapMemory(m_device->device(), mem);
673
674 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
675 ASSERT_VK_SUCCESS(err);
676
677 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
678 // memory. In fact, it was never used by the GPU.
679 // Just be be sure, wait for idle.
680 vkDestroyBuffer(m_device->device(), buffer, NULL);
681 vkDeviceWaitIdle(m_device->device());
682
683 VkImageCreateInfo image_create_info = {};
684 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
685 image_create_info.pNext = NULL;
686 image_create_info.imageType = VK_IMAGE_TYPE_2D;
687 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
688 image_create_info.extent.width = 64;
689 image_create_info.extent.height = 64;
690 image_create_info.extent.depth = 1;
691 image_create_info.mipLevels = 1;
692 image_create_info.arrayLayers = 1;
693 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
694 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
695 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
696 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
697 image_create_info.queueFamilyIndexCount = 0;
698 image_create_info.pQueueFamilyIndices = NULL;
699 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
700 image_create_info.flags = 0;
701
702 VkMemoryAllocateInfo mem_alloc = {};
703 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
704 mem_alloc.pNext = NULL;
705 mem_alloc.allocationSize = 0;
706 mem_alloc.memoryTypeIndex = 0;
707
708 /* Create a mappable image. It will be the texture if linear images are ok
709 * to be textures or it will be the staging image if they are not.
710 */
711 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
712 ASSERT_VK_SUCCESS(err);
713
714 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
715
716 mem_alloc.allocationSize = mem_reqs.size;
717
718 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
719 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
720 if (!pass) {
721 vkDestroyImage(m_device->device(), image, NULL);
722 return;
723 }
724
725 // VALDIATION FAILURE:
726 err = vkBindImageMemory(m_device->device(), image, mem, 0);
727 ASSERT_VK_SUCCESS(err);
728
729 m_errorMonitor->VerifyNotFound();
730
731 vkDestroyBuffer(m_device->device(), buffer, NULL);
732 vkDestroyImage(m_device->device(), image, NULL);
733}
734
Ian Elliott1c32c772016-04-28 14:47:13 -0600735TEST_F(VkLayerTest, EnableWsiBeforeUse) {
736 VkResult err;
737 bool pass;
738
Ian Elliott489eec02016-05-05 14:12:44 -0600739// FIXME: After we turn on this code for non-Linux platforms, uncomment the
740// following declaration (which is temporarily being moved below):
741// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -0600742 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
743 VkSwapchainCreateInfoKHR swapchain_create_info = {};
744 uint32_t swapchain_image_count = 0;
745// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
746 uint32_t image_index = 0;
747// VkPresentInfoKHR present_info = {};
748
749 ASSERT_NO_FATAL_FAILURE(InitState());
750
Ian Elliott3f06ce52016-04-29 14:46:21 -0600751#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
752#if defined(VK_USE_PLATFORM_ANDROID_KHR)
753 // Use the functions from the VK_KHR_android_surface extension without
754 // enabling that extension:
755
756 // Create a surface:
757 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
758#if 0
759#endif
760 m_errorMonitor->SetDesiredFailureMsg(
761 VK_DEBUG_REPORT_ERROR_BIT_EXT,
762 "extension was not enabled for this");
763 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
764 &surface);
765 pass = (err != VK_SUCCESS);
766 ASSERT_TRUE(pass);
767 m_errorMonitor->VerifyFound();
768#endif // VK_USE_PLATFORM_ANDROID_KHR
769
770
771#if defined(VK_USE_PLATFORM_MIR_KHR)
772 // Use the functions from the VK_KHR_mir_surface extension without enabling
773 // that extension:
774
775 // Create a surface:
776 VkMirSurfaceCreateInfoKHR mir_create_info = {};
777#if 0
778#endif
779 m_errorMonitor->SetDesiredFailureMsg(
780 VK_DEBUG_REPORT_ERROR_BIT_EXT,
781 "extension was not enabled for this");
782 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
783 pass = (err != VK_SUCCESS);
784 ASSERT_TRUE(pass);
785 m_errorMonitor->VerifyFound();
786
787 // Tell whether an mir_connection supports presentation:
788 MirConnection *mir_connection = NULL;
789 m_errorMonitor->SetDesiredFailureMsg(
790 VK_DEBUG_REPORT_ERROR_BIT_EXT,
791 "extension was not enabled for this");
792 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
793 visual_id);
794 m_errorMonitor->VerifyFound();
795#endif // VK_USE_PLATFORM_MIR_KHR
796
797
798#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
799 // Use the functions from the VK_KHR_wayland_surface extension without
800 // enabling that extension:
801
802 // Create a surface:
803 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
804#if 0
805#endif
806 m_errorMonitor->SetDesiredFailureMsg(
807 VK_DEBUG_REPORT_ERROR_BIT_EXT,
808 "extension was not enabled for this");
809 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
810 &surface);
811 pass = (err != VK_SUCCESS);
812 ASSERT_TRUE(pass);
813 m_errorMonitor->VerifyFound();
814
815 // Tell whether an wayland_display supports presentation:
816 struct wl_display wayland_display = {};
817 m_errorMonitor->SetDesiredFailureMsg(
818 VK_DEBUG_REPORT_ERROR_BIT_EXT,
819 "extension was not enabled for this");
820 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
821 &wayland_display);
822 m_errorMonitor->VerifyFound();
823#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -0600824#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -0600825
826
827#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -0600828// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
829// TO NON-LINUX PLATFORMS:
830VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -0600831 // Use the functions from the VK_KHR_win32_surface extension without
832 // enabling that extension:
833
834 // Create a surface:
835 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
836#if 0
837#endif
838 m_errorMonitor->SetDesiredFailureMsg(
839 VK_DEBUG_REPORT_ERROR_BIT_EXT,
840 "extension was not enabled for this");
841 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
842 &surface);
843 pass = (err != VK_SUCCESS);
844 ASSERT_TRUE(pass);
845 m_errorMonitor->VerifyFound();
846
847 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -0600848 m_errorMonitor->SetDesiredFailureMsg(
849 VK_DEBUG_REPORT_ERROR_BIT_EXT,
850 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -0600851 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -0600852 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -0600853// Set this (for now, until all platforms are supported and tested):
854#define NEED_TO_TEST_THIS_ON_PLATFORM
855#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -0600856
857
Ian Elliott1c32c772016-04-28 14:47:13 -0600858#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -0600859// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
860// TO NON-LINUX PLATFORMS:
861VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -0600862 // Use the functions from the VK_KHR_xcb_surface extension without enabling
863 // that extension:
864
865 // Create a surface:
866 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
867#if 0
868#endif
869 m_errorMonitor->SetDesiredFailureMsg(
870 VK_DEBUG_REPORT_ERROR_BIT_EXT,
871 "extension was not enabled for this");
872 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
873 pass = (err != VK_SUCCESS);
874 ASSERT_TRUE(pass);
875 m_errorMonitor->VerifyFound();
876
877 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -0600878 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -0600879 xcb_visualid_t visual_id = 0;
880 m_errorMonitor->SetDesiredFailureMsg(
881 VK_DEBUG_REPORT_ERROR_BIT_EXT,
882 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -0600883 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -0600884 visual_id);
885 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -0600886// Set this (for now, until all platforms are supported and tested):
887#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -0600888#endif // VK_USE_PLATFORM_XCB_KHR
889
890
Ian Elliott12630812016-04-29 14:35:43 -0600891#if defined(VK_USE_PLATFORM_XLIB_KHR)
892 // Use the functions from the VK_KHR_xlib_surface extension without enabling
893 // that extension:
894
895 // Create a surface:
896 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
897#if 0
898#endif
899 m_errorMonitor->SetDesiredFailureMsg(
900 VK_DEBUG_REPORT_ERROR_BIT_EXT,
901 "extension was not enabled for this");
902 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
903 pass = (err != VK_SUCCESS);
904 ASSERT_TRUE(pass);
905 m_errorMonitor->VerifyFound();
906
907 // Tell whether an Xlib VisualID supports presentation:
908 Display *dpy = NULL;
909 VisualID visual = 0;
910 m_errorMonitor->SetDesiredFailureMsg(
911 VK_DEBUG_REPORT_ERROR_BIT_EXT,
912 "extension was not enabled for this");
913 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
914 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -0600915// Set this (for now, until all platforms are supported and tested):
916#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -0600917#endif // VK_USE_PLATFORM_XLIB_KHR
918
919
Ian Elliott1c32c772016-04-28 14:47:13 -0600920 // Use the functions from the VK_KHR_surface extension without enabling
921 // that extension:
922
Ian Elliott489eec02016-05-05 14:12:44 -0600923#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -0600924 // Destroy a surface:
925 m_errorMonitor->SetDesiredFailureMsg(
926 VK_DEBUG_REPORT_ERROR_BIT_EXT,
927 "extension was not enabled for this");
928 vkDestroySurfaceKHR(instance(), surface, NULL);
929 m_errorMonitor->VerifyFound();
930
931 // Check if surface supports presentation:
932 VkBool32 supported = false;
933 m_errorMonitor->SetDesiredFailureMsg(
934 VK_DEBUG_REPORT_ERROR_BIT_EXT,
935 "extension was not enabled for this");
936 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
937 pass = (err != VK_SUCCESS);
938 ASSERT_TRUE(pass);
939 m_errorMonitor->VerifyFound();
940
941 // Check surface capabilities:
942 VkSurfaceCapabilitiesKHR capabilities = {};
943 m_errorMonitor->SetDesiredFailureMsg(
944 VK_DEBUG_REPORT_ERROR_BIT_EXT,
945 "extension was not enabled for this");
946 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
947 &capabilities);
948 pass = (err != VK_SUCCESS);
949 ASSERT_TRUE(pass);
950 m_errorMonitor->VerifyFound();
951
952 // Check surface formats:
953 uint32_t format_count = 0;
954 VkSurfaceFormatKHR *formats = NULL;
955 m_errorMonitor->SetDesiredFailureMsg(
956 VK_DEBUG_REPORT_ERROR_BIT_EXT,
957 "extension was not enabled for this");
958 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
959 &format_count, formats);
960 pass = (err != VK_SUCCESS);
961 ASSERT_TRUE(pass);
962 m_errorMonitor->VerifyFound();
963
964 // Check surface present modes:
965 uint32_t present_mode_count = 0;
966 VkSurfaceFormatKHR *present_modes = NULL;
967 m_errorMonitor->SetDesiredFailureMsg(
968 VK_DEBUG_REPORT_ERROR_BIT_EXT,
969 "extension was not enabled for this");
970 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
971 &present_mode_count, present_modes);
972 pass = (err != VK_SUCCESS);
973 ASSERT_TRUE(pass);
974 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -0600975#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -0600976
977
978 // Use the functions from the VK_KHR_swapchain extension without enabling
979 // that extension:
980
981 // Create a swapchain:
982 m_errorMonitor->SetDesiredFailureMsg(
983 VK_DEBUG_REPORT_ERROR_BIT_EXT,
984 "extension was not enabled for this");
985 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
986 swapchain_create_info.pNext = NULL;
987#if 0
988 swapchain_create_info.flags = 0;
989 swapchain_create_info.surface = 0;
990 swapchain_create_info.minImageCount = 0;
991 swapchain_create_info.imageFormat = 0;
992 swapchain_create_info.imageColorSpace = 0;
993 swapchain_create_info.imageExtent.width = 0;
994 swapchain_create_info.imageExtent.height = 0;
995 swapchain_create_info.imageArrayLayers = 0;
996 swapchain_create_info.imageUsage = 0;
997 swapchain_create_info.imageSharingMode = 0;
998 swapchain_create_info.queueFamilyIndexCount = 0;
999 swapchain_create_info.preTransform = 0;
1000 swapchain_create_info.compositeAlpha = 0;
1001 swapchain_create_info.presentMode = 0;
1002 swapchain_create_info.clipped = 0;
1003 swapchain_create_info.oldSwapchain = NULL;
1004#endif
1005 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
1006 NULL, &swapchain);
1007 pass = (err != VK_SUCCESS);
1008 ASSERT_TRUE(pass);
1009 m_errorMonitor->VerifyFound();
1010
1011 // Get the images from the swapchain:
1012 m_errorMonitor->SetDesiredFailureMsg(
1013 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1014 "extension was not enabled for this");
1015 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
1016 &swapchain_image_count, NULL);
1017 pass = (err != VK_SUCCESS);
1018 ASSERT_TRUE(pass);
1019 m_errorMonitor->VerifyFound();
1020
1021 // Try to acquire an image:
1022 m_errorMonitor->SetDesiredFailureMsg(
1023 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1024 "extension was not enabled for this");
1025 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
1026 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
1027 pass = (err != VK_SUCCESS);
1028 ASSERT_TRUE(pass);
1029 m_errorMonitor->VerifyFound();
1030
1031 // Try to present an image:
1032#if 0 // NOTE: Currently can't test this because a real swapchain is needed
1033 // (as opposed to the fake one we created) in order for the layer to
1034 // lookup the VkDevice used to enable the extension:
1035 m_errorMonitor->SetDesiredFailureMsg(
1036 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1037 "extension was not enabled for this");
1038 present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
1039 present_info.pNext = NULL;
1040#if 0
1041#endif
1042 err = vkQueuePresentKHR(m_device->m_queue, &present_info);
1043 pass = (err != VK_SUCCESS);
1044 ASSERT_TRUE(pass);
1045 m_errorMonitor->VerifyFound();
1046#endif
1047
1048 // Destroy the swapchain:
1049 m_errorMonitor->SetDesiredFailureMsg(
1050 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1051 "extension was not enabled for this");
1052 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1053 m_errorMonitor->VerifyFound();
1054}
1055
Karl Schultz6addd812016-02-02 17:17:23 -07001056TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1057 VkResult err;
1058 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001059
Karl Schultz6addd812016-02-02 17:17:23 -07001060 m_errorMonitor->SetDesiredFailureMsg(
1061 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001062 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
1063
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001064 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001065
1066 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001067 VkImage image;
1068 VkDeviceMemory mem;
1069 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001070
Karl Schultz6addd812016-02-02 17:17:23 -07001071 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1072 const int32_t tex_width = 32;
1073 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001074
Tony Barboureb254902015-07-15 12:50:33 -06001075 VkImageCreateInfo image_create_info = {};
1076 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001077 image_create_info.pNext = NULL;
1078 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1079 image_create_info.format = tex_format;
1080 image_create_info.extent.width = tex_width;
1081 image_create_info.extent.height = tex_height;
1082 image_create_info.extent.depth = 1;
1083 image_create_info.mipLevels = 1;
1084 image_create_info.arrayLayers = 1;
1085 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1086 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1087 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1088 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001089
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001090 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001091 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001092 mem_alloc.pNext = NULL;
1093 mem_alloc.allocationSize = 0;
1094 // Introduce failure, do NOT set memProps to
1095 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
1096 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001097
Chia-I Wuf7458c52015-10-26 21:10:41 +08001098 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001099 ASSERT_VK_SUCCESS(err);
1100
Karl Schultz6addd812016-02-02 17:17:23 -07001101 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001102
Mark Lobodzinski23065352015-05-29 09:32:35 -05001103 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001104
Karl Schultz6addd812016-02-02 17:17:23 -07001105 pass =
1106 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
1107 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1108 if (!pass) { // If we can't find any unmappable memory this test doesn't
1109 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08001110 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06001111 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06001112 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06001113
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001114 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001115 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001116 ASSERT_VK_SUCCESS(err);
1117
1118 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06001119 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001120 ASSERT_VK_SUCCESS(err);
1121
1122 // Map memory as if to initialize the image
1123 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07001124 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
1125 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001126
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001127 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001128
Chia-I Wuf7458c52015-10-26 21:10:41 +08001129 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001130}
1131
Karl Schultz6addd812016-02-02 17:17:23 -07001132TEST_F(VkLayerTest, RebindMemory) {
1133 VkResult err;
1134 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001135
Karl Schultz6addd812016-02-02 17:17:23 -07001136 m_errorMonitor->SetDesiredFailureMsg(
1137 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001138 "which has already been bound to mem object");
1139
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001140 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001141
1142 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001143 VkImage image;
1144 VkDeviceMemory mem1;
1145 VkDeviceMemory mem2;
1146 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001147
Karl Schultz6addd812016-02-02 17:17:23 -07001148 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1149 const int32_t tex_width = 32;
1150 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001151
Tony Barboureb254902015-07-15 12:50:33 -06001152 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001153 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1154 image_create_info.pNext = NULL;
1155 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1156 image_create_info.format = tex_format;
1157 image_create_info.extent.width = tex_width;
1158 image_create_info.extent.height = tex_height;
1159 image_create_info.extent.depth = 1;
1160 image_create_info.mipLevels = 1;
1161 image_create_info.arrayLayers = 1;
1162 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1163 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1164 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1165 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001166
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001167 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001168 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1169 mem_alloc.pNext = NULL;
1170 mem_alloc.allocationSize = 0;
1171 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001172
Karl Schultz6addd812016-02-02 17:17:23 -07001173 // Introduce failure, do NOT set memProps to
1174 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001175 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001176 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001177 ASSERT_VK_SUCCESS(err);
1178
Karl Schultz6addd812016-02-02 17:17:23 -07001179 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001180
1181 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001182 pass =
1183 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001184 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001185
1186 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001187 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001188 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001189 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001190 ASSERT_VK_SUCCESS(err);
1191
1192 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001193 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001194 ASSERT_VK_SUCCESS(err);
1195
Karl Schultz6addd812016-02-02 17:17:23 -07001196 // Introduce validation failure, try to bind a different memory object to
1197 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001198 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001199
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001200 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001201
Chia-I Wuf7458c52015-10-26 21:10:41 +08001202 vkDestroyImage(m_device->device(), image, NULL);
1203 vkFreeMemory(m_device->device(), mem1, NULL);
1204 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001205}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001206
Karl Schultz6addd812016-02-02 17:17:23 -07001207TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001208 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001209
Karl Schultz6addd812016-02-02 17:17:23 -07001210 m_errorMonitor->SetDesiredFailureMsg(
1211 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1212 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001213
1214 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001215 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1216 fenceInfo.pNext = NULL;
1217 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001218
Tony Barbour300a6082015-04-07 13:44:53 -06001219 ASSERT_NO_FATAL_FAILURE(InitState());
1220 ASSERT_NO_FATAL_FAILURE(InitViewport());
1221 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1222
Tony Barbourfe3351b2015-07-28 10:17:20 -06001223 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001224 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1225 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001226 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001227
1228 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001229
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001230 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001231 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1232 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001233 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001234 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001235 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001236 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001237 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001238 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001239 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001240
1241 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001242 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001243
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001244 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001245}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001246// This is a positive test. We used to expect error in this case but spec now
1247// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07001248TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001249 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001250 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001251 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001252 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1253 fenceInfo.pNext = NULL;
1254
Tony Barbour0b4d9562015-04-09 10:48:04 -06001255 ASSERT_NO_FATAL_FAILURE(InitState());
1256 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08001257 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001258 VkResult result = vkResetFences(m_device->device(), 1, fences);
1259 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06001260
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06001261 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06001262}
Tobin Ehlis41376e12015-07-03 08:45:14 -06001263
1264TEST_F(VkLayerTest, InvalidUsageBits)
1265{
Tony Barbourf92621a2016-05-02 14:28:12 -06001266 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001267 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06001268 "Initialize buffer with wrong usage then perform copy expecting errors "
1269 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001271 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001272
1273 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06001274 VkImageObj image(m_device);
1275 // Initialize image with USAGE_INPUT_ATTACHMENT
1276 image.init(128, 128, VK_FORMAT_D32_SFLOAT_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001277 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1278 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06001279
Tony Barbourf92621a2016-05-02 14:28:12 -06001280 VkImageView dsv;
1281 VkImageViewCreateInfo dsvci = {};
1282 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1283 dsvci.image = image.handle();
1284 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
1285 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
1286 dsvci.subresourceRange.layerCount = 1;
1287 dsvci.subresourceRange.baseMipLevel = 0;
1288 dsvci.subresourceRange.levelCount = 1;
1289 dsvci.subresourceRange.aspectMask =
1290 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06001291
Tony Barbourf92621a2016-05-02 14:28:12 -06001292 // Create a view with depth / stencil aspect for image with different usage
1293 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001294
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001295 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06001296
1297 // Initialize buffer with TRANSFER_DST usage
1298 vk_testing::Buffer buffer;
1299 VkMemoryPropertyFlags reqs = 0;
1300 buffer.init_as_dst(*m_device, 128 * 128, reqs);
1301 VkBufferImageCopy region = {};
1302 region.bufferRowLength = 128;
1303 region.bufferImageHeight = 128;
1304 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1305 region.imageSubresource.layerCount = 1;
1306 region.imageExtent.height = 16;
1307 region.imageExtent.width = 16;
1308 region.imageExtent.depth = 1;
1309
1310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1311 "Invalid usage flag for buffer ");
1312 // Buffer usage not set to TRANSFER_SRC and image usage not set to
1313 // TRANSFER_DST
1314 BeginCommandBuffer();
1315 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1316 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1317 1, &region);
1318 m_errorMonitor->VerifyFound();
1319
1320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1321 "Invalid usage flag for image ");
1322 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
1323 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1324 1, &region);
1325 m_errorMonitor->VerifyFound();
1326
1327 vkDestroyImageView(m_device->device(), dsv, NULL);
Tobin Ehlis41376e12015-07-03 08:45:14 -06001328}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001329#endif // MEM_TRACKER_TESTS
1330
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06001331#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07001332TEST_F(VkLayerTest, PipelineNotBound) {
1333 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001334
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001336 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001337
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001338 ASSERT_NO_FATAL_FAILURE(InitState());
1339 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001340
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001341 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001342 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1343 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001344
1345 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001346 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1347 ds_pool_ci.pNext = NULL;
1348 ds_pool_ci.maxSets = 1;
1349 ds_pool_ci.poolSizeCount = 1;
1350 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001351
1352 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001353 err =
1354 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001355 ASSERT_VK_SUCCESS(err);
1356
1357 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001358 dsl_binding.binding = 0;
1359 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1360 dsl_binding.descriptorCount = 1;
1361 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1362 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001363
1364 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001365 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1366 ds_layout_ci.pNext = NULL;
1367 ds_layout_ci.bindingCount = 1;
1368 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001369
1370 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001371 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1372 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001373 ASSERT_VK_SUCCESS(err);
1374
1375 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001376 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001377 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001378 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001379 alloc_info.descriptorPool = ds_pool;
1380 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001381 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1382 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001383 ASSERT_VK_SUCCESS(err);
1384
1385 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001386 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1387 pipeline_layout_ci.pNext = NULL;
1388 pipeline_layout_ci.setLayoutCount = 1;
1389 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001390
1391 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001392 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1393 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001394 ASSERT_VK_SUCCESS(err);
1395
Mark Youngad779052016-01-06 14:26:04 -07001396 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001397
1398 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001399 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1400 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001401
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001402 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001403
Chia-I Wuf7458c52015-10-26 21:10:41 +08001404 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1405 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1406 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001407}
1408
Karl Schultz6addd812016-02-02 17:17:23 -07001409TEST_F(VkLayerTest, BindInvalidMemory) {
1410 VkResult err;
1411 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001412
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001413 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001414 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001415
Tobin Ehlisec598302015-09-15 15:02:17 -06001416 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001417
1418 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001419 VkImage image;
1420 VkDeviceMemory mem;
1421 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001422
Karl Schultz6addd812016-02-02 17:17:23 -07001423 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1424 const int32_t tex_width = 32;
1425 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001426
1427 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001428 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1429 image_create_info.pNext = NULL;
1430 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1431 image_create_info.format = tex_format;
1432 image_create_info.extent.width = tex_width;
1433 image_create_info.extent.height = tex_height;
1434 image_create_info.extent.depth = 1;
1435 image_create_info.mipLevels = 1;
1436 image_create_info.arrayLayers = 1;
1437 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1438 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1439 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1440 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001441
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001442 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001443 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1444 mem_alloc.pNext = NULL;
1445 mem_alloc.allocationSize = 0;
1446 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001447
Chia-I Wuf7458c52015-10-26 21:10:41 +08001448 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001449 ASSERT_VK_SUCCESS(err);
1450
Karl Schultz6addd812016-02-02 17:17:23 -07001451 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001452
1453 mem_alloc.allocationSize = mem_reqs.size;
1454
Karl Schultz6addd812016-02-02 17:17:23 -07001455 pass =
1456 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001457 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001458
1459 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001460 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001461 ASSERT_VK_SUCCESS(err);
1462
1463 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001464 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001465
1466 // Try to bind free memory that has been freed
1467 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1468 // This may very well return an error.
1469 (void)err;
1470
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001471 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001472
Chia-I Wuf7458c52015-10-26 21:10:41 +08001473 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001474}
1475
Karl Schultz6addd812016-02-02 17:17:23 -07001476TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1477 VkResult err;
1478 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001479
Karl Schultz6addd812016-02-02 17:17:23 -07001480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1481 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001482
Tobin Ehlisec598302015-09-15 15:02:17 -06001483 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001484
Karl Schultz6addd812016-02-02 17:17:23 -07001485 // Create an image object, allocate memory, destroy the object and then try
1486 // to bind it
1487 VkImage image;
1488 VkDeviceMemory mem;
1489 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001490
Karl Schultz6addd812016-02-02 17:17:23 -07001491 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1492 const int32_t tex_width = 32;
1493 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001494
1495 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001496 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1497 image_create_info.pNext = NULL;
1498 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1499 image_create_info.format = tex_format;
1500 image_create_info.extent.width = tex_width;
1501 image_create_info.extent.height = tex_height;
1502 image_create_info.extent.depth = 1;
1503 image_create_info.mipLevels = 1;
1504 image_create_info.arrayLayers = 1;
1505 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1506 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1507 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1508 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001509
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001510 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001511 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1512 mem_alloc.pNext = NULL;
1513 mem_alloc.allocationSize = 0;
1514 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001515
Chia-I Wuf7458c52015-10-26 21:10:41 +08001516 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001517 ASSERT_VK_SUCCESS(err);
1518
Karl Schultz6addd812016-02-02 17:17:23 -07001519 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001520
1521 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001522 pass =
1523 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001524 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001525
1526 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001527 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001528 ASSERT_VK_SUCCESS(err);
1529
1530 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001531 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001532 ASSERT_VK_SUCCESS(err);
1533
1534 // Now Try to bind memory to this destroyed object
1535 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1536 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001537 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001538
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001539 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001540
Chia-I Wuf7458c52015-10-26 21:10:41 +08001541 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001542}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001543
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001544#endif // OBJ_TRACKER_TESTS
1545
Tobin Ehlis0788f522015-05-26 16:11:58 -06001546#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001547
1548// This is a positive test. No errors should be generated.
1549TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
1550
1551 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1552 "submitted on separate queues followed by a QueueWaitIdle.");
1553
Dustin Graves48458142016-04-29 16:11:55 -06001554 if ((m_device->queue_props.empty()) ||
1555 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001556 return;
1557
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001558 m_errorMonitor->ExpectSuccess();
1559
1560 VkSemaphore semaphore;
1561 VkSemaphoreCreateInfo semaphore_create_info{};
1562 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1563 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1564 &semaphore);
1565
1566 VkCommandPool command_pool;
1567 VkCommandPoolCreateInfo pool_create_info{};
1568 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1569 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1570 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1571 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1572 &command_pool);
1573
1574 VkCommandBuffer command_buffer[2];
1575 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1576 command_buffer_allocate_info.sType =
1577 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1578 command_buffer_allocate_info.commandPool = command_pool;
1579 command_buffer_allocate_info.commandBufferCount = 2;
1580 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1581 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1582 command_buffer);
1583
1584 VkQueue queue = VK_NULL_HANDLE;
1585 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1586 1, &queue);
1587
1588 {
1589 VkCommandBufferBeginInfo begin_info{};
1590 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1591 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1592
1593 vkCmdPipelineBarrier(command_buffer[0],
1594 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1595 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1596 0, nullptr, 0, nullptr);
1597
1598 VkViewport viewport{};
1599 viewport.maxDepth = 1.0f;
1600 viewport.minDepth = 0.0f;
1601 viewport.width = 512;
1602 viewport.height = 512;
1603 viewport.x = 0;
1604 viewport.y = 0;
1605 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1606 vkEndCommandBuffer(command_buffer[0]);
1607 }
1608 {
1609 VkCommandBufferBeginInfo begin_info{};
1610 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1611 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1612
1613 VkViewport viewport{};
1614 viewport.maxDepth = 1.0f;
1615 viewport.minDepth = 0.0f;
1616 viewport.width = 512;
1617 viewport.height = 512;
1618 viewport.x = 0;
1619 viewport.y = 0;
1620 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1621 vkEndCommandBuffer(command_buffer[1]);
1622 }
1623 {
1624 VkSubmitInfo submit_info{};
1625 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1626 submit_info.commandBufferCount = 1;
1627 submit_info.pCommandBuffers = &command_buffer[0];
1628 submit_info.signalSemaphoreCount = 1;
1629 submit_info.pSignalSemaphores = &semaphore;
1630 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1631 }
1632 {
1633 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1634 VkSubmitInfo submit_info{};
1635 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1636 submit_info.commandBufferCount = 1;
1637 submit_info.pCommandBuffers = &command_buffer[1];
1638 submit_info.waitSemaphoreCount = 1;
1639 submit_info.pWaitSemaphores = &semaphore;
1640 submit_info.pWaitDstStageMask = flags;
1641 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1642 }
1643
1644 vkQueueWaitIdle(m_device->m_queue);
1645
1646 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1647 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1648 &command_buffer[0]);
1649 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1650
1651 m_errorMonitor->VerifyNotFound();
1652}
1653
1654// This is a positive test. No errors should be generated.
1655TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
1656
1657 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1658 "submitted on separate queues, the second having a fence"
1659 "followed by a QueueWaitIdle.");
1660
Dustin Graves48458142016-04-29 16:11:55 -06001661 if ((m_device->queue_props.empty()) ||
1662 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001663 return;
1664
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001665 m_errorMonitor->ExpectSuccess();
1666
1667 VkFence fence;
1668 VkFenceCreateInfo fence_create_info{};
1669 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1670 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1671
1672 VkSemaphore semaphore;
1673 VkSemaphoreCreateInfo semaphore_create_info{};
1674 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1675 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1676 &semaphore);
1677
1678 VkCommandPool command_pool;
1679 VkCommandPoolCreateInfo pool_create_info{};
1680 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1681 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1682 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1683 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1684 &command_pool);
1685
1686 VkCommandBuffer command_buffer[2];
1687 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1688 command_buffer_allocate_info.sType =
1689 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1690 command_buffer_allocate_info.commandPool = command_pool;
1691 command_buffer_allocate_info.commandBufferCount = 2;
1692 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1693 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1694 command_buffer);
1695
1696 VkQueue queue = VK_NULL_HANDLE;
1697 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1698 1, &queue);
1699
1700 {
1701 VkCommandBufferBeginInfo begin_info{};
1702 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1703 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1704
1705 vkCmdPipelineBarrier(command_buffer[0],
1706 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1707 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1708 0, nullptr, 0, nullptr);
1709
1710 VkViewport viewport{};
1711 viewport.maxDepth = 1.0f;
1712 viewport.minDepth = 0.0f;
1713 viewport.width = 512;
1714 viewport.height = 512;
1715 viewport.x = 0;
1716 viewport.y = 0;
1717 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1718 vkEndCommandBuffer(command_buffer[0]);
1719 }
1720 {
1721 VkCommandBufferBeginInfo begin_info{};
1722 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1723 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1724
1725 VkViewport viewport{};
1726 viewport.maxDepth = 1.0f;
1727 viewport.minDepth = 0.0f;
1728 viewport.width = 512;
1729 viewport.height = 512;
1730 viewport.x = 0;
1731 viewport.y = 0;
1732 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1733 vkEndCommandBuffer(command_buffer[1]);
1734 }
1735 {
1736 VkSubmitInfo submit_info{};
1737 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1738 submit_info.commandBufferCount = 1;
1739 submit_info.pCommandBuffers = &command_buffer[0];
1740 submit_info.signalSemaphoreCount = 1;
1741 submit_info.pSignalSemaphores = &semaphore;
1742 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1743 }
1744 {
1745 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1746 VkSubmitInfo submit_info{};
1747 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1748 submit_info.commandBufferCount = 1;
1749 submit_info.pCommandBuffers = &command_buffer[1];
1750 submit_info.waitSemaphoreCount = 1;
1751 submit_info.pWaitSemaphores = &semaphore;
1752 submit_info.pWaitDstStageMask = flags;
1753 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1754 }
1755
1756 vkQueueWaitIdle(m_device->m_queue);
1757
1758 vkDestroyFence(m_device->device(), fence, nullptr);
1759 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1760 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1761 &command_buffer[0]);
1762 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1763
1764 m_errorMonitor->VerifyNotFound();
1765}
1766
1767// This is a positive test. No errors should be generated.
1768TEST_F(VkLayerTest,
1769 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
1770
1771 TEST_DESCRIPTION(
1772 "Two command buffers, each in a separate QueueSubmit call "
1773 "submitted on separate queues, the second having a fence"
1774 "followed by two consecutive WaitForFences calls on the same fence.");
1775
Dustin Graves48458142016-04-29 16:11:55 -06001776 if ((m_device->queue_props.empty()) ||
1777 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001778 return;
1779
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001780 m_errorMonitor->ExpectSuccess();
1781
1782 VkFence fence;
1783 VkFenceCreateInfo fence_create_info{};
1784 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1785 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1786
1787 VkSemaphore semaphore;
1788 VkSemaphoreCreateInfo semaphore_create_info{};
1789 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1790 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1791 &semaphore);
1792
1793 VkCommandPool command_pool;
1794 VkCommandPoolCreateInfo pool_create_info{};
1795 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1796 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1797 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1798 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1799 &command_pool);
1800
1801 VkCommandBuffer command_buffer[2];
1802 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1803 command_buffer_allocate_info.sType =
1804 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1805 command_buffer_allocate_info.commandPool = command_pool;
1806 command_buffer_allocate_info.commandBufferCount = 2;
1807 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1808 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1809 command_buffer);
1810
1811 VkQueue queue = VK_NULL_HANDLE;
1812 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1813 1, &queue);
1814
1815 {
1816 VkCommandBufferBeginInfo begin_info{};
1817 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1818 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1819
1820 vkCmdPipelineBarrier(command_buffer[0],
1821 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1822 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1823 0, nullptr, 0, nullptr);
1824
1825 VkViewport viewport{};
1826 viewport.maxDepth = 1.0f;
1827 viewport.minDepth = 0.0f;
1828 viewport.width = 512;
1829 viewport.height = 512;
1830 viewport.x = 0;
1831 viewport.y = 0;
1832 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1833 vkEndCommandBuffer(command_buffer[0]);
1834 }
1835 {
1836 VkCommandBufferBeginInfo begin_info{};
1837 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1838 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1839
1840 VkViewport viewport{};
1841 viewport.maxDepth = 1.0f;
1842 viewport.minDepth = 0.0f;
1843 viewport.width = 512;
1844 viewport.height = 512;
1845 viewport.x = 0;
1846 viewport.y = 0;
1847 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1848 vkEndCommandBuffer(command_buffer[1]);
1849 }
1850 {
1851 VkSubmitInfo submit_info{};
1852 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1853 submit_info.commandBufferCount = 1;
1854 submit_info.pCommandBuffers = &command_buffer[0];
1855 submit_info.signalSemaphoreCount = 1;
1856 submit_info.pSignalSemaphores = &semaphore;
1857 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1858 }
1859 {
1860 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1861 VkSubmitInfo submit_info{};
1862 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1863 submit_info.commandBufferCount = 1;
1864 submit_info.pCommandBuffers = &command_buffer[1];
1865 submit_info.waitSemaphoreCount = 1;
1866 submit_info.pWaitSemaphores = &semaphore;
1867 submit_info.pWaitDstStageMask = flags;
1868 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1869 }
1870
1871 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1872 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1873
1874 vkDestroyFence(m_device->device(), fence, nullptr);
1875 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1876 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1877 &command_buffer[0]);
1878 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1879
1880 m_errorMonitor->VerifyNotFound();
1881}
1882
1883// This is a positive test. No errors should be generated.
1884TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
1885
1886 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1887 "submitted on separate queues, the second having a fence, "
1888 "followed by a WaitForFences call.");
1889
Dustin Graves48458142016-04-29 16:11:55 -06001890 if ((m_device->queue_props.empty()) ||
1891 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001892 return;
1893
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001894 m_errorMonitor->ExpectSuccess();
1895
1896 VkFence fence;
1897 VkFenceCreateInfo fence_create_info{};
1898 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1899 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1900
1901 VkSemaphore semaphore;
1902 VkSemaphoreCreateInfo semaphore_create_info{};
1903 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1904 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1905 &semaphore);
1906
1907 VkCommandPool command_pool;
1908 VkCommandPoolCreateInfo pool_create_info{};
1909 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1910 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1911 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1912 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1913 &command_pool);
1914
1915 VkCommandBuffer command_buffer[2];
1916 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1917 command_buffer_allocate_info.sType =
1918 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1919 command_buffer_allocate_info.commandPool = command_pool;
1920 command_buffer_allocate_info.commandBufferCount = 2;
1921 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1922 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1923 command_buffer);
1924
1925 VkQueue queue = VK_NULL_HANDLE;
1926 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1927 1, &queue);
1928
1929
1930 {
1931 VkCommandBufferBeginInfo begin_info{};
1932 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1933 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1934
1935 vkCmdPipelineBarrier(command_buffer[0],
1936 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1937 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1938 0, nullptr, 0, nullptr);
1939
1940 VkViewport viewport{};
1941 viewport.maxDepth = 1.0f;
1942 viewport.minDepth = 0.0f;
1943 viewport.width = 512;
1944 viewport.height = 512;
1945 viewport.x = 0;
1946 viewport.y = 0;
1947 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1948 vkEndCommandBuffer(command_buffer[0]);
1949 }
1950 {
1951 VkCommandBufferBeginInfo begin_info{};
1952 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1953 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1954
1955 VkViewport viewport{};
1956 viewport.maxDepth = 1.0f;
1957 viewport.minDepth = 0.0f;
1958 viewport.width = 512;
1959 viewport.height = 512;
1960 viewport.x = 0;
1961 viewport.y = 0;
1962 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1963 vkEndCommandBuffer(command_buffer[1]);
1964 }
1965 {
1966 VkSubmitInfo submit_info{};
1967 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1968 submit_info.commandBufferCount = 1;
1969 submit_info.pCommandBuffers = &command_buffer[0];
1970 submit_info.signalSemaphoreCount = 1;
1971 submit_info.pSignalSemaphores = &semaphore;
1972 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1973 }
1974 {
1975 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1976 VkSubmitInfo submit_info{};
1977 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1978 submit_info.commandBufferCount = 1;
1979 submit_info.pCommandBuffers = &command_buffer[1];
1980 submit_info.waitSemaphoreCount = 1;
1981 submit_info.pWaitSemaphores = &semaphore;
1982 submit_info.pWaitDstStageMask = flags;
1983 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1984 }
1985
1986 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1987
1988 vkDestroyFence(m_device->device(), fence, nullptr);
1989 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1990 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1991 &command_buffer[0]);
1992 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1993
1994 m_errorMonitor->VerifyNotFound();
1995}
1996
1997// This is a positive test. No errors should be generated.
1998TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
1999
2000 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2001 "on the same queue, sharing a signal/wait semaphore, the "
2002 "second having a fence, "
2003 "followed by a WaitForFences call.");
2004
2005 m_errorMonitor->ExpectSuccess();
2006
2007 VkFence fence;
2008 VkFenceCreateInfo fence_create_info{};
2009 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2010 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2011
2012 VkSemaphore semaphore;
2013 VkSemaphoreCreateInfo semaphore_create_info{};
2014 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2015 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2016 &semaphore);
2017
2018 VkCommandPool command_pool;
2019 VkCommandPoolCreateInfo pool_create_info{};
2020 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2021 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2022 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2023 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2024 &command_pool);
2025
2026 VkCommandBuffer command_buffer[2];
2027 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2028 command_buffer_allocate_info.sType =
2029 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2030 command_buffer_allocate_info.commandPool = command_pool;
2031 command_buffer_allocate_info.commandBufferCount = 2;
2032 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2033 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2034 command_buffer);
2035
2036 {
2037 VkCommandBufferBeginInfo begin_info{};
2038 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2039 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2040
2041 vkCmdPipelineBarrier(command_buffer[0],
2042 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2043 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2044 0, nullptr, 0, nullptr);
2045
2046 VkViewport viewport{};
2047 viewport.maxDepth = 1.0f;
2048 viewport.minDepth = 0.0f;
2049 viewport.width = 512;
2050 viewport.height = 512;
2051 viewport.x = 0;
2052 viewport.y = 0;
2053 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2054 vkEndCommandBuffer(command_buffer[0]);
2055 }
2056 {
2057 VkCommandBufferBeginInfo begin_info{};
2058 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2059 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2060
2061 VkViewport viewport{};
2062 viewport.maxDepth = 1.0f;
2063 viewport.minDepth = 0.0f;
2064 viewport.width = 512;
2065 viewport.height = 512;
2066 viewport.x = 0;
2067 viewport.y = 0;
2068 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2069 vkEndCommandBuffer(command_buffer[1]);
2070 }
2071 {
2072 VkSubmitInfo submit_info{};
2073 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2074 submit_info.commandBufferCount = 1;
2075 submit_info.pCommandBuffers = &command_buffer[0];
2076 submit_info.signalSemaphoreCount = 1;
2077 submit_info.pSignalSemaphores = &semaphore;
2078 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2079 }
2080 {
2081 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2082 VkSubmitInfo submit_info{};
2083 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2084 submit_info.commandBufferCount = 1;
2085 submit_info.pCommandBuffers = &command_buffer[1];
2086 submit_info.waitSemaphoreCount = 1;
2087 submit_info.pWaitSemaphores = &semaphore;
2088 submit_info.pWaitDstStageMask = flags;
2089 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2090 }
2091
2092 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2093
2094 vkDestroyFence(m_device->device(), fence, nullptr);
2095 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2096 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2097 &command_buffer[0]);
2098 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2099
2100 m_errorMonitor->VerifyNotFound();
2101}
2102
2103// This is a positive test. No errors should be generated.
2104TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
2105
2106 TEST_DESCRIPTION(
2107 "Two command buffers, each in a separate QueueSubmit call "
2108 "on the same queue, no fences, followed by a third QueueSubmit with NO "
2109 "SubmitInfos but with a fence, followed by a WaitForFences call.");
2110
2111 m_errorMonitor->ExpectSuccess();
2112
2113 VkFence fence;
2114 VkFenceCreateInfo fence_create_info{};
2115 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2116 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2117
2118 VkCommandPool command_pool;
2119 VkCommandPoolCreateInfo pool_create_info{};
2120 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2121 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2122 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2123 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2124 &command_pool);
2125
2126 VkCommandBuffer command_buffer[2];
2127 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2128 command_buffer_allocate_info.sType =
2129 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2130 command_buffer_allocate_info.commandPool = command_pool;
2131 command_buffer_allocate_info.commandBufferCount = 2;
2132 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2133 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2134 command_buffer);
2135
2136 {
2137 VkCommandBufferBeginInfo begin_info{};
2138 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2139 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2140
2141 vkCmdPipelineBarrier(command_buffer[0],
2142 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2143 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2144 0, nullptr, 0, nullptr);
2145
2146 VkViewport viewport{};
2147 viewport.maxDepth = 1.0f;
2148 viewport.minDepth = 0.0f;
2149 viewport.width = 512;
2150 viewport.height = 512;
2151 viewport.x = 0;
2152 viewport.y = 0;
2153 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2154 vkEndCommandBuffer(command_buffer[0]);
2155 }
2156 {
2157 VkCommandBufferBeginInfo begin_info{};
2158 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2159 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2160
2161 VkViewport viewport{};
2162 viewport.maxDepth = 1.0f;
2163 viewport.minDepth = 0.0f;
2164 viewport.width = 512;
2165 viewport.height = 512;
2166 viewport.x = 0;
2167 viewport.y = 0;
2168 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2169 vkEndCommandBuffer(command_buffer[1]);
2170 }
2171 {
2172 VkSubmitInfo submit_info{};
2173 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2174 submit_info.commandBufferCount = 1;
2175 submit_info.pCommandBuffers = &command_buffer[0];
2176 submit_info.signalSemaphoreCount = 0;
2177 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2178 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2179 }
2180 {
2181 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2182 VkSubmitInfo submit_info{};
2183 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2184 submit_info.commandBufferCount = 1;
2185 submit_info.pCommandBuffers = &command_buffer[1];
2186 submit_info.waitSemaphoreCount = 0;
2187 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2188 submit_info.pWaitDstStageMask = flags;
2189 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2190 }
2191
2192 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
2193
2194 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2195
2196 vkDestroyFence(m_device->device(), fence, nullptr);
2197 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2198 &command_buffer[0]);
2199 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2200
2201 m_errorMonitor->VerifyNotFound();
2202}
2203
2204// This is a positive test. No errors should be generated.
2205TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
2206
2207 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2208 "on the same queue, the second having a fence, followed "
2209 "by a WaitForFences call.");
2210
2211 m_errorMonitor->ExpectSuccess();
2212
2213 VkFence fence;
2214 VkFenceCreateInfo fence_create_info{};
2215 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2216 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2217
2218 VkCommandPool command_pool;
2219 VkCommandPoolCreateInfo pool_create_info{};
2220 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2221 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2222 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2223 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2224 &command_pool);
2225
2226 VkCommandBuffer command_buffer[2];
2227 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2228 command_buffer_allocate_info.sType =
2229 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2230 command_buffer_allocate_info.commandPool = command_pool;
2231 command_buffer_allocate_info.commandBufferCount = 2;
2232 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2233 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2234 command_buffer);
2235
2236 {
2237 VkCommandBufferBeginInfo begin_info{};
2238 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2239 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2240
2241 vkCmdPipelineBarrier(command_buffer[0],
2242 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2243 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2244 0, nullptr, 0, nullptr);
2245
2246 VkViewport viewport{};
2247 viewport.maxDepth = 1.0f;
2248 viewport.minDepth = 0.0f;
2249 viewport.width = 512;
2250 viewport.height = 512;
2251 viewport.x = 0;
2252 viewport.y = 0;
2253 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2254 vkEndCommandBuffer(command_buffer[0]);
2255 }
2256 {
2257 VkCommandBufferBeginInfo begin_info{};
2258 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2259 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2260
2261 VkViewport viewport{};
2262 viewport.maxDepth = 1.0f;
2263 viewport.minDepth = 0.0f;
2264 viewport.width = 512;
2265 viewport.height = 512;
2266 viewport.x = 0;
2267 viewport.y = 0;
2268 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2269 vkEndCommandBuffer(command_buffer[1]);
2270 }
2271 {
2272 VkSubmitInfo submit_info{};
2273 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2274 submit_info.commandBufferCount = 1;
2275 submit_info.pCommandBuffers = &command_buffer[0];
2276 submit_info.signalSemaphoreCount = 0;
2277 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2278 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2279 }
2280 {
2281 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2282 VkSubmitInfo submit_info{};
2283 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2284 submit_info.commandBufferCount = 1;
2285 submit_info.pCommandBuffers = &command_buffer[1];
2286 submit_info.waitSemaphoreCount = 0;
2287 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2288 submit_info.pWaitDstStageMask = flags;
2289 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2290 }
2291
2292 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2293
2294 vkDestroyFence(m_device->device(), fence, nullptr);
2295 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2296 &command_buffer[0]);
2297 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2298
2299 m_errorMonitor->VerifyNotFound();
2300}
2301
2302// This is a positive test. No errors should be generated.
2303TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
2304
2305 TEST_DESCRIPTION(
2306 "Two command buffers each in a separate SubmitInfo sent in a single "
2307 "QueueSubmit call followed by a WaitForFences call.");
2308
2309 m_errorMonitor->ExpectSuccess();
2310
2311 VkFence fence;
2312 VkFenceCreateInfo fence_create_info{};
2313 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2314 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2315
2316 VkSemaphore semaphore;
2317 VkSemaphoreCreateInfo semaphore_create_info{};
2318 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2319 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2320 &semaphore);
2321
2322 VkCommandPool command_pool;
2323 VkCommandPoolCreateInfo pool_create_info{};
2324 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2325 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2326 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2327 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2328 &command_pool);
2329
2330 VkCommandBuffer command_buffer[2];
2331 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2332 command_buffer_allocate_info.sType =
2333 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2334 command_buffer_allocate_info.commandPool = command_pool;
2335 command_buffer_allocate_info.commandBufferCount = 2;
2336 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2337 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2338 command_buffer);
2339
2340 {
2341 VkCommandBufferBeginInfo begin_info{};
2342 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2343 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2344
2345 vkCmdPipelineBarrier(command_buffer[0],
2346 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2347 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2348 0, nullptr, 0, nullptr);
2349
2350 VkViewport viewport{};
2351 viewport.maxDepth = 1.0f;
2352 viewport.minDepth = 0.0f;
2353 viewport.width = 512;
2354 viewport.height = 512;
2355 viewport.x = 0;
2356 viewport.y = 0;
2357 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2358 vkEndCommandBuffer(command_buffer[0]);
2359 }
2360 {
2361 VkCommandBufferBeginInfo begin_info{};
2362 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2363 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2364
2365 VkViewport viewport{};
2366 viewport.maxDepth = 1.0f;
2367 viewport.minDepth = 0.0f;
2368 viewport.width = 512;
2369 viewport.height = 512;
2370 viewport.x = 0;
2371 viewport.y = 0;
2372 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2373 vkEndCommandBuffer(command_buffer[1]);
2374 }
2375 {
2376 VkSubmitInfo submit_info[2];
2377 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2378
2379 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2380 submit_info[0].pNext = NULL;
2381 submit_info[0].commandBufferCount = 1;
2382 submit_info[0].pCommandBuffers = &command_buffer[0];
2383 submit_info[0].signalSemaphoreCount = 1;
2384 submit_info[0].pSignalSemaphores = &semaphore;
2385 submit_info[0].waitSemaphoreCount = 0;
2386 submit_info[0].pWaitSemaphores = NULL;
2387 submit_info[0].pWaitDstStageMask = 0;
2388
2389 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2390 submit_info[1].pNext = NULL;
2391 submit_info[1].commandBufferCount = 1;
2392 submit_info[1].pCommandBuffers = &command_buffer[1];
2393 submit_info[1].waitSemaphoreCount = 1;
2394 submit_info[1].pWaitSemaphores = &semaphore;
2395 submit_info[1].pWaitDstStageMask = flags;
2396 submit_info[1].signalSemaphoreCount = 0;
2397 submit_info[1].pSignalSemaphores = NULL;
2398 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
2399 }
2400
2401 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2402
2403 vkDestroyFence(m_device->device(), fence, nullptr);
2404 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2405 &command_buffer[0]);
2406 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2407
2408 m_errorMonitor->VerifyNotFound();
2409}
2410
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002411TEST_F(VkLayerTest, DynamicStatesNotBound) {
2412 TEST_DESCRIPTION(
2413 "Run a series of simple draw calls to validate all the different "
2414 "failure cases that can occur when dynamic state is required but not "
2415 "correctly bound."
2416 "Here are the different dynamic state cases verified by this test:\n"
2417 "-Line Width\n-Depth Bias\n-Viewport State\n-Scissor State\n-Blend "
2418 "State\n-Depth Bounds\n-Stencil Read Mask\n-Stencil Write "
2419 "Mask\n-Stencil Reference");
2420
2421 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07002422 m_errorMonitor->SetDesiredFailureMsg(
2423 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002424 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002425 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2426 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002427 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002428 // Dynamic depth bias
Karl Schultz6addd812016-02-02 17:17:23 -07002429 m_errorMonitor->SetDesiredFailureMsg(
2430 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002431 "Dynamic depth bias state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002432 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2433 BsoFailDepthBias);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002434 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002435 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07002436 m_errorMonitor->SetDesiredFailureMsg(
2437 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002438 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002439 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2440 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002441 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002442 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07002443 m_errorMonitor->SetDesiredFailureMsg(
2444 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002445 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002446 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2447 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002448 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002449 // Dynamic blend state
Karl Schultz6addd812016-02-02 17:17:23 -07002450 m_errorMonitor->SetDesiredFailureMsg(
2451 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002452 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002453 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2454 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002455 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002456 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07002457 m_errorMonitor->SetDesiredFailureMsg(
2458 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002459 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002460 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2461 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002462 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002463 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07002464 m_errorMonitor->SetDesiredFailureMsg(
2465 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002466 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002467 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2468 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002469 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002470 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07002471 m_errorMonitor->SetDesiredFailureMsg(
2472 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002473 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002474 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2475 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002476 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002477}
2478
Karl Schultz6addd812016-02-02 17:17:23 -07002479TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002480 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002481
Karl Schultz6addd812016-02-02 17:17:23 -07002482 m_errorMonitor->SetDesiredFailureMsg(
2483 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2484 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2485 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002486
2487 VkFenceCreateInfo fenceInfo = {};
2488 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2489 fenceInfo.pNext = NULL;
2490 fenceInfo.flags = 0;
2491
2492 ASSERT_NO_FATAL_FAILURE(InitState());
2493 ASSERT_NO_FATAL_FAILURE(InitViewport());
2494 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2495
Karl Schultz6addd812016-02-02 17:17:23 -07002496 // We luck out b/c by default the framework creates CB w/ the
2497 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002498 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002499 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2500 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002501 EndCommandBuffer();
2502
2503 testFence.init(*m_device, fenceInfo);
2504
2505 // Bypass framework since it does the waits automatically
2506 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002507 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002508 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2509 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002510 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002511 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002512 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002513 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002514 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002515 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002516 submit_info.pSignalSemaphores = NULL;
2517
Karl Schultz6addd812016-02-02 17:17:23 -07002518 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2519 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002520
Karl Schultz6addd812016-02-02 17:17:23 -07002521 // Cause validation error by re-submitting cmd buffer that should only be
2522 // submitted once
2523 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002524
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002525 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002526}
2527
Karl Schultz6addd812016-02-02 17:17:23 -07002528TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002529 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002530 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002531
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002532 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002533 "Unable to allocate 1 descriptors of "
2534 "type "
2535 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002536
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002537 ASSERT_NO_FATAL_FAILURE(InitState());
2538 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002539
Karl Schultz6addd812016-02-02 17:17:23 -07002540 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
2541 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002542 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002543 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2544 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002545
2546 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002547 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2548 ds_pool_ci.pNext = NULL;
2549 ds_pool_ci.flags = 0;
2550 ds_pool_ci.maxSets = 1;
2551 ds_pool_ci.poolSizeCount = 1;
2552 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002553
2554 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002555 err =
2556 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002557 ASSERT_VK_SUCCESS(err);
2558
2559 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002560 dsl_binding.binding = 0;
2561 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2562 dsl_binding.descriptorCount = 1;
2563 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2564 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002565
2566 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002567 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2568 ds_layout_ci.pNext = NULL;
2569 ds_layout_ci.bindingCount = 1;
2570 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002571
2572 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002573 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2574 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002575 ASSERT_VK_SUCCESS(err);
2576
2577 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002578 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002579 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002580 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002581 alloc_info.descriptorPool = ds_pool;
2582 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002583 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2584 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002585
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002586 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002587
Chia-I Wuf7458c52015-10-26 21:10:41 +08002588 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2589 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002590}
2591
Karl Schultz6addd812016-02-02 17:17:23 -07002592TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
2593 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06002594
Karl Schultz6addd812016-02-02 17:17:23 -07002595 m_errorMonitor->SetDesiredFailureMsg(
2596 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2597 "It is invalid to call vkFreeDescriptorSets() with a pool created "
2598 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002599
Tobin Ehlise735c692015-10-08 13:13:50 -06002600 ASSERT_NO_FATAL_FAILURE(InitState());
2601 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06002602
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002603 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002604 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2605 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06002606
2607 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002608 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2609 ds_pool_ci.pNext = NULL;
2610 ds_pool_ci.maxSets = 1;
2611 ds_pool_ci.poolSizeCount = 1;
2612 ds_pool_ci.flags = 0;
2613 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
2614 // app can only call vkResetDescriptorPool on this pool.;
2615 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06002616
2617 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002618 err =
2619 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06002620 ASSERT_VK_SUCCESS(err);
2621
2622 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002623 dsl_binding.binding = 0;
2624 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2625 dsl_binding.descriptorCount = 1;
2626 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2627 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06002628
2629 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002630 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2631 ds_layout_ci.pNext = NULL;
2632 ds_layout_ci.bindingCount = 1;
2633 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06002634
2635 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002636 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2637 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06002638 ASSERT_VK_SUCCESS(err);
2639
2640 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002641 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002642 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002643 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002644 alloc_info.descriptorPool = ds_pool;
2645 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002646 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2647 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06002648 ASSERT_VK_SUCCESS(err);
2649
2650 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002651 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06002652
Chia-I Wuf7458c52015-10-26 21:10:41 +08002653 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2654 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06002655}
2656
Karl Schultz6addd812016-02-02 17:17:23 -07002657TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002658 // Attempt to clear Descriptor Pool with bad object.
2659 // ObjectTracker should catch this.
2660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2661 "Invalid VkDescriptorPool Object 0xbaad6001");
2662 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
2663 vkResetDescriptorPool(device(), badPool, 0);
2664 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002665}
2666
Karl Schultz6addd812016-02-02 17:17:23 -07002667TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002668 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
2669 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002670 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06002671 // call vkCmdBindDescriptorSets w/ false Descriptor Set
2672 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
2673 VkResult err;
2674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2675 "Invalid VkDescriptorSet Object 0xbaad6001");
2676
2677 ASSERT_NO_FATAL_FAILURE(InitState());
2678
2679 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
2680 layout_bindings[0].binding = 0;
2681 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2682 layout_bindings[0].descriptorCount = 1;
2683 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2684 layout_bindings[0].pImmutableSamplers = NULL;
2685
2686 VkDescriptorSetLayout descriptor_set_layout;
2687 VkDescriptorSetLayoutCreateInfo dslci = {};
2688 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2689 dslci.pNext = NULL;
2690 dslci.bindingCount = 1;
2691 dslci.pBindings = layout_bindings;
2692 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002693 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002694
2695 VkPipelineLayout pipeline_layout;
2696 VkPipelineLayoutCreateInfo plci = {};
2697 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2698 plci.pNext = NULL;
2699 plci.setLayoutCount = 1;
2700 plci.pSetLayouts = &descriptor_set_layout;
2701 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002702 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002703
2704 BeginCommandBuffer();
2705 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2706 pipeline_layout, 0, 1, &badSet, 0, NULL);
2707 m_errorMonitor->VerifyFound();
2708 EndCommandBuffer();
2709 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
2710 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002711}
2712
Karl Schultz6addd812016-02-02 17:17:23 -07002713TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002714 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
2715 // ObjectTracker should catch this.
2716 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
2717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2718 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
2719
2720 VkPipelineLayout pipeline_layout;
2721 VkPipelineLayoutCreateInfo plci = {};
2722 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2723 plci.pNext = NULL;
2724 plci.setLayoutCount = 1;
2725 plci.pSetLayouts = &bad_layout;
2726 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
2727
2728 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002729}
2730
Karl Schultz6addd812016-02-02 17:17:23 -07002731TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002732 // Attempt to bind an invalid Pipeline to a valid Command Buffer
2733 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002734 // Create a valid cmd buffer
2735 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06002736 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
2737 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2738 "Invalid VkPipeline Object 0xbaad6001");
2739 ASSERT_NO_FATAL_FAILURE(InitState());
2740 BeginCommandBuffer();
2741 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2742 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
2743 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06002744
2745 // Now issue a draw call with no pipeline bound
2746 m_errorMonitor->SetDesiredFailureMsg(
2747 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2748 "At Draw/Dispatch time no valid VkPipeline is bound!");
2749 ASSERT_NO_FATAL_FAILURE(InitState());
2750 BeginCommandBuffer();
2751 Draw(1, 0, 0, 0);
2752 m_errorMonitor->VerifyFound();
2753 // Finally same check once more but with Dispatch/Compute
2754 m_errorMonitor->SetDesiredFailureMsg(
2755 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2756 "At Draw/Dispatch time no valid VkPipeline is bound!");
2757 ASSERT_NO_FATAL_FAILURE(InitState());
2758 BeginCommandBuffer();
2759 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
2760 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002761}
2762
Karl Schultz6addd812016-02-02 17:17:23 -07002763TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
2764 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
2765 // CommandBuffer
2766 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002767
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002768 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002769 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002770
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002771 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06002772 ASSERT_NO_FATAL_FAILURE(InitViewport());
2773 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002774 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002775 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2776 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002777
2778 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002779 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2780 ds_pool_ci.pNext = NULL;
2781 ds_pool_ci.maxSets = 1;
2782 ds_pool_ci.poolSizeCount = 1;
2783 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06002784
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002785 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002786 err =
2787 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002788 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002789
Tony Barboureb254902015-07-15 12:50:33 -06002790 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002791 dsl_binding.binding = 0;
2792 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2793 dsl_binding.descriptorCount = 1;
2794 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2795 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002796
Tony Barboureb254902015-07-15 12:50:33 -06002797 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002798 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2799 ds_layout_ci.pNext = NULL;
2800 ds_layout_ci.bindingCount = 1;
2801 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002802 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002803 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2804 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002805 ASSERT_VK_SUCCESS(err);
2806
2807 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002808 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002809 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002810 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002811 alloc_info.descriptorPool = ds_pool;
2812 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002813 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2814 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002815 ASSERT_VK_SUCCESS(err);
2816
Tony Barboureb254902015-07-15 12:50:33 -06002817 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002818 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2819 pipeline_layout_ci.pNext = NULL;
2820 pipeline_layout_ci.setLayoutCount = 1;
2821 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002822
2823 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002824 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2825 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002826 ASSERT_VK_SUCCESS(err);
2827
Karl Schultz6addd812016-02-02 17:17:23 -07002828 VkShaderObj vs(m_device, bindStateVertShaderText,
2829 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06002830 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07002831 // on more devices
2832 VkShaderObj fs(m_device, bindStateFragShaderText,
2833 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002834
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002835 VkPipelineObj pipe(m_device);
2836 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06002837 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06002838 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002839 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06002840
2841 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002842 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2843 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2844 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2845 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2846 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002847
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002848 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002849
Chia-I Wuf7458c52015-10-26 21:10:41 +08002850 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2851 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2852 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002853}
2854
Karl Schultz6addd812016-02-02 17:17:23 -07002855TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002856 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07002857 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002858
Karl Schultz6addd812016-02-02 17:17:23 -07002859 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06002860 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
2861 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002862
2863 ASSERT_NO_FATAL_FAILURE(InitState());
2864 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002865 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2866 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002867
2868 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002869 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2870 ds_pool_ci.pNext = NULL;
2871 ds_pool_ci.maxSets = 1;
2872 ds_pool_ci.poolSizeCount = 1;
2873 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002874
2875 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002876 err =
2877 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002878 ASSERT_VK_SUCCESS(err);
2879
2880 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002881 dsl_binding.binding = 0;
2882 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2883 dsl_binding.descriptorCount = 1;
2884 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2885 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002886
2887 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002888 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2889 ds_layout_ci.pNext = NULL;
2890 ds_layout_ci.bindingCount = 1;
2891 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002892 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002893 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2894 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002895 ASSERT_VK_SUCCESS(err);
2896
2897 VkDescriptorSet descriptorSet;
2898 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002899 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002900 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002901 alloc_info.descriptorPool = ds_pool;
2902 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002903 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2904 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002905 ASSERT_VK_SUCCESS(err);
2906
Karl Schultz6addd812016-02-02 17:17:23 -07002907 VkBufferView view =
2908 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002909 VkWriteDescriptorSet descriptor_write;
2910 memset(&descriptor_write, 0, sizeof(descriptor_write));
2911 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2912 descriptor_write.dstSet = descriptorSet;
2913 descriptor_write.dstBinding = 0;
2914 descriptor_write.descriptorCount = 1;
2915 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2916 descriptor_write.pTexelBufferView = &view;
2917
2918 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2919
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002920 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002921
2922 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2923 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2924}
2925
Karl Schultz6addd812016-02-02 17:17:23 -07002926TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
2927 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
2928 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07002929 // 1. No dynamicOffset supplied
2930 // 2. Too many dynamicOffsets supplied
2931 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07002932 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002934 " requires 1 dynamicOffsets, but only "
2935 "0 dynamicOffsets are left in "
2936 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002937
2938 ASSERT_NO_FATAL_FAILURE(InitState());
2939 ASSERT_NO_FATAL_FAILURE(InitViewport());
2940 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2941
2942 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002943 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2944 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002945
2946 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002947 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2948 ds_pool_ci.pNext = NULL;
2949 ds_pool_ci.maxSets = 1;
2950 ds_pool_ci.poolSizeCount = 1;
2951 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002952
2953 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002954 err =
2955 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002956 ASSERT_VK_SUCCESS(err);
2957
2958 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002959 dsl_binding.binding = 0;
2960 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2961 dsl_binding.descriptorCount = 1;
2962 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2963 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002964
2965 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002966 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2967 ds_layout_ci.pNext = NULL;
2968 ds_layout_ci.bindingCount = 1;
2969 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002970 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002971 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2972 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002973 ASSERT_VK_SUCCESS(err);
2974
2975 VkDescriptorSet descriptorSet;
2976 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002977 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002978 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002979 alloc_info.descriptorPool = ds_pool;
2980 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002981 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2982 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002983 ASSERT_VK_SUCCESS(err);
2984
2985 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002986 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2987 pipeline_layout_ci.pNext = NULL;
2988 pipeline_layout_ci.setLayoutCount = 1;
2989 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002990
2991 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002992 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2993 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002994 ASSERT_VK_SUCCESS(err);
2995
2996 // Create a buffer to update the descriptor with
2997 uint32_t qfi = 0;
2998 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002999 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3000 buffCI.size = 1024;
3001 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3002 buffCI.queueFamilyIndexCount = 1;
3003 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003004
3005 VkBuffer dyub;
3006 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3007 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003008 // Allocate memory and bind to buffer so we can make it to the appropriate
3009 // error
3010 VkMemoryAllocateInfo mem_alloc = {};
3011 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3012 mem_alloc.pNext = NULL;
3013 mem_alloc.allocationSize = 1024;
3014 mem_alloc.memoryTypeIndex = 1;
3015 VkDeviceMemory mem;
3016 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3017 ASSERT_VK_SUCCESS(err);
3018 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
3019 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003020 // Correctly update descriptor to avoid "NOT_UPDATED" error
3021 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003022 buffInfo.buffer = dyub;
3023 buffInfo.offset = 0;
3024 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003025
3026 VkWriteDescriptorSet descriptor_write;
3027 memset(&descriptor_write, 0, sizeof(descriptor_write));
3028 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3029 descriptor_write.dstSet = descriptorSet;
3030 descriptor_write.dstBinding = 0;
3031 descriptor_write.descriptorCount = 1;
3032 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3033 descriptor_write.pBufferInfo = &buffInfo;
3034
3035 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3036
3037 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003038 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3039 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3040 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003041 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003042 uint32_t pDynOff[2] = {512, 756};
3043 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07003044 m_errorMonitor->SetDesiredFailureMsg(
3045 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07003046 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07003047 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3048 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3049 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12003050 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003051 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3053 " dynamic offset 512 combined with "
3054 "offset 0 and range 1024 that "
3055 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07003056 // Create PSO to be used for draw-time errors below
3057 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003058 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003059 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003060 "out gl_PerVertex { \n"
3061 " vec4 gl_Position;\n"
3062 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003063 "void main(){\n"
3064 " gl_Position = vec4(1);\n"
3065 "}\n";
3066 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003067 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003068 "\n"
3069 "layout(location=0) out vec4 x;\n"
3070 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3071 "void main(){\n"
3072 " x = vec4(bar.y);\n"
3073 "}\n";
3074 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3075 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3076 VkPipelineObj pipe(m_device);
3077 pipe.AddShader(&vs);
3078 pipe.AddShader(&fs);
3079 pipe.AddColorAttachment();
3080 pipe.CreateVKPipeline(pipeline_layout, renderPass());
3081
Karl Schultz6addd812016-02-02 17:17:23 -07003082 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3083 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3084 // This update should succeed, but offset size of 512 will overstep buffer
3085 // /w range 1024 & size 1024
3086 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3087 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3088 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07003089 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003090 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003091
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003092 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06003093 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003094
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003095 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3096 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3097}
3098
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003099TEST_F(VkLayerTest, InvalidPushConstants) {
3100 // Hit push constant error cases:
3101 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
3102 // 2. Incorrectly set push constant size to 0
3103 // 3. Incorrectly set push constant size to non-multiple of 4
3104 // 4. Attempt push constant update that exceeds maxPushConstantSize
3105 VkResult err;
3106 m_errorMonitor->SetDesiredFailureMsg(
3107 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3108 "vkCreatePipelineLayout() call has push constants with offset ");
3109
3110 ASSERT_NO_FATAL_FAILURE(InitState());
3111 ASSERT_NO_FATAL_FAILURE(InitViewport());
3112 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3113
3114 VkPushConstantRange pc_range = {};
3115 pc_range.size = 0xFFFFFFFFu;
3116 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3117 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3118 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3119 pipeline_layout_ci.pushConstantRangeCount = 1;
3120 pipeline_layout_ci.pPushConstantRanges = &pc_range;
3121
3122 VkPipelineLayout pipeline_layout;
3123 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3124 &pipeline_layout);
3125
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003126 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003127 // Now cause errors due to size 0 and non-4 byte aligned size
3128 pc_range.size = 0;
3129 m_errorMonitor->SetDesiredFailureMsg(
3130 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3131 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
3132 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3133 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003134 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003135 pc_range.size = 1;
3136 m_errorMonitor->SetDesiredFailureMsg(
3137 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3138 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
3139 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3140 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003141 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003142 // Cause error due to bad size in vkCmdPushConstants() call
3143 m_errorMonitor->SetDesiredFailureMsg(
3144 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3145 "vkCmdPushConstants() call has push constants with offset ");
3146 pipeline_layout_ci.pushConstantRangeCount = 0;
3147 pipeline_layout_ci.pPushConstantRanges = NULL;
3148 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3149 &pipeline_layout);
3150 ASSERT_VK_SUCCESS(err);
3151 BeginCommandBuffer();
3152 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
3153 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003154 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003155 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3156}
3157
Karl Schultz6addd812016-02-02 17:17:23 -07003158TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003159 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07003160 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003161
3162 ASSERT_NO_FATAL_FAILURE(InitState());
3163 ASSERT_NO_FATAL_FAILURE(InitViewport());
3164 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3165
3166 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
3167 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003168 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3169 ds_type_count[0].descriptorCount = 10;
3170 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3171 ds_type_count[1].descriptorCount = 2;
3172 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3173 ds_type_count[2].descriptorCount = 2;
3174 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
3175 ds_type_count[3].descriptorCount = 5;
3176 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
3177 // type
3178 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3179 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
3180 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003181
3182 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003183 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3184 ds_pool_ci.pNext = NULL;
3185 ds_pool_ci.maxSets = 5;
3186 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
3187 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003188
3189 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003190 err =
3191 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003192 ASSERT_VK_SUCCESS(err);
3193
3194 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
3195 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003196 dsl_binding[0].binding = 0;
3197 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3198 dsl_binding[0].descriptorCount = 5;
3199 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3200 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003201
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003202 // Create layout identical to set0 layout but w/ different stageFlags
3203 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003204 dsl_fs_stage_only.binding = 0;
3205 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3206 dsl_fs_stage_only.descriptorCount = 5;
3207 dsl_fs_stage_only.stageFlags =
3208 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
3209 // bind time
3210 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003211 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003212 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3213 ds_layout_ci.pNext = NULL;
3214 ds_layout_ci.bindingCount = 1;
3215 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003216 static const uint32_t NUM_LAYOUTS = 4;
3217 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003218 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003219 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
3220 // layout for error case
3221 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3222 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003223 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003224 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003225 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3226 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003227 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003228 dsl_binding[0].binding = 0;
3229 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003230 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003231 dsl_binding[1].binding = 1;
3232 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3233 dsl_binding[1].descriptorCount = 2;
3234 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
3235 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003236 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003237 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003238 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3239 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003240 ASSERT_VK_SUCCESS(err);
3241 dsl_binding[0].binding = 0;
3242 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003243 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003244 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07003245 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3246 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003247 ASSERT_VK_SUCCESS(err);
3248 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003249 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003250 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3251 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003252 ASSERT_VK_SUCCESS(err);
3253
3254 static const uint32_t NUM_SETS = 4;
3255 VkDescriptorSet descriptorSet[NUM_SETS] = {};
3256 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003257 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003258 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003259 alloc_info.descriptorPool = ds_pool;
3260 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003261 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3262 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003263 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003264 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003265 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003266 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003267 err =
3268 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003269 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003270
3271 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003272 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3273 pipeline_layout_ci.pNext = NULL;
3274 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
3275 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003276
3277 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003278 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3279 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003280 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003281 // Create pipelineLayout with only one setLayout
3282 pipeline_layout_ci.setLayoutCount = 1;
3283 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003284 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3285 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003286 ASSERT_VK_SUCCESS(err);
3287 // Create pipelineLayout with 2 descriptor setLayout at index 0
3288 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
3289 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07003290 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3291 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003292 ASSERT_VK_SUCCESS(err);
3293 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
3294 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
3295 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07003296 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3297 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003298 ASSERT_VK_SUCCESS(err);
3299 // Create pipelineLayout with UB type, but stageFlags for FS only
3300 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
3301 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003302 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3303 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003304 ASSERT_VK_SUCCESS(err);
3305 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
3306 VkDescriptorSetLayout pl_bad_s0[2] = {};
3307 pl_bad_s0[0] = ds_layout_fs_only;
3308 pl_bad_s0[1] = ds_layout[1];
3309 pipeline_layout_ci.setLayoutCount = 2;
3310 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
3311 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07003312 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3313 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003314 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003315
3316 // Create a buffer to update the descriptor with
3317 uint32_t qfi = 0;
3318 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003319 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3320 buffCI.size = 1024;
3321 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3322 buffCI.queueFamilyIndexCount = 1;
3323 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003324
3325 VkBuffer dyub;
3326 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3327 ASSERT_VK_SUCCESS(err);
3328 // Correctly update descriptor to avoid "NOT_UPDATED" error
3329 static const uint32_t NUM_BUFFS = 5;
3330 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003331 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003332 buffInfo[i].buffer = dyub;
3333 buffInfo[i].offset = 0;
3334 buffInfo[i].range = 1024;
3335 }
Karl Schultz6addd812016-02-02 17:17:23 -07003336 VkImage image;
3337 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3338 const int32_t tex_width = 32;
3339 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003340 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003341 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3342 image_create_info.pNext = NULL;
3343 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3344 image_create_info.format = tex_format;
3345 image_create_info.extent.width = tex_width;
3346 image_create_info.extent.height = tex_height;
3347 image_create_info.extent.depth = 1;
3348 image_create_info.mipLevels = 1;
3349 image_create_info.arrayLayers = 1;
3350 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3351 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3352 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3353 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003354 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3355 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003356
Karl Schultz6addd812016-02-02 17:17:23 -07003357 VkMemoryRequirements memReqs;
3358 VkDeviceMemory imageMem;
3359 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003360 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003361 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3362 memAlloc.pNext = NULL;
3363 memAlloc.allocationSize = 0;
3364 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003365 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
3366 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003367 pass =
3368 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003369 ASSERT_TRUE(pass);
3370 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
3371 ASSERT_VK_SUCCESS(err);
3372 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
3373 ASSERT_VK_SUCCESS(err);
3374
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003375 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003376 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3377 image_view_create_info.image = image;
3378 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
3379 image_view_create_info.format = tex_format;
3380 image_view_create_info.subresourceRange.layerCount = 1;
3381 image_view_create_info.subresourceRange.baseMipLevel = 0;
3382 image_view_create_info.subresourceRange.levelCount = 1;
3383 image_view_create_info.subresourceRange.aspectMask =
3384 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003385
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003386 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07003387 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
3388 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003389 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003390 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003391 imageInfo[0].imageView = view;
3392 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3393 imageInfo[1].imageView = view;
3394 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003395 imageInfo[2].imageView = view;
3396 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3397 imageInfo[3].imageView = view;
3398 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003399
3400 static const uint32_t NUM_SET_UPDATES = 3;
3401 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
3402 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3403 descriptor_write[0].dstSet = descriptorSet[0];
3404 descriptor_write[0].dstBinding = 0;
3405 descriptor_write[0].descriptorCount = 5;
3406 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3407 descriptor_write[0].pBufferInfo = buffInfo;
3408 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3409 descriptor_write[1].dstSet = descriptorSet[1];
3410 descriptor_write[1].dstBinding = 0;
3411 descriptor_write[1].descriptorCount = 2;
3412 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3413 descriptor_write[1].pImageInfo = imageInfo;
3414 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3415 descriptor_write[2].dstSet = descriptorSet[1];
3416 descriptor_write[2].dstBinding = 1;
3417 descriptor_write[2].descriptorCount = 2;
3418 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003419 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003420
3421 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003422
Tobin Ehlis88452832015-12-03 09:40:56 -07003423 // Create PSO to be used for draw-time errors below
3424 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003425 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003426 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003427 "out gl_PerVertex {\n"
3428 " vec4 gl_Position;\n"
3429 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003430 "void main(){\n"
3431 " gl_Position = vec4(1);\n"
3432 "}\n";
3433 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003434 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003435 "\n"
3436 "layout(location=0) out vec4 x;\n"
3437 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3438 "void main(){\n"
3439 " x = vec4(bar.y);\n"
3440 "}\n";
3441 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3442 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003443 VkPipelineObj pipe(m_device);
3444 pipe.AddShader(&vs);
3445 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07003446 pipe.AddColorAttachment();
3447 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003448
3449 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003450
Karl Schultz6addd812016-02-02 17:17:23 -07003451 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3452 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3453 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3454 // of PSO
3455 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3456 // cmd_pipeline.c
3457 // due to the fact that cmd_alloc_dset_data() has not been called in
3458 // cmd_bind_graphics_pipeline()
3459 // TODO : Want to cause various binding incompatibility issues here to test
3460 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003461 // First cause various verify_layout_compatibility() fails
3462 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003463 // verify_set_layout_compatibility fail cases:
3464 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3466 " due to: invalid VkPipelineLayout ");
3467 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3468 VK_PIPELINE_BIND_POINT_GRAPHICS,
3469 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3470 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003471 m_errorMonitor->VerifyFound();
3472
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003473 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3475 " attempting to bind set to index 1");
3476 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3477 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3478 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003479 m_errorMonitor->VerifyFound();
3480
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003481 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003482 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3483 // descriptors
3484 m_errorMonitor->SetDesiredFailureMsg(
3485 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003486 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003487 vkCmdBindDescriptorSets(
3488 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3489 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003490 m_errorMonitor->VerifyFound();
3491
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003492 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3493 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003494 m_errorMonitor->SetDesiredFailureMsg(
3495 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003496 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07003497 vkCmdBindDescriptorSets(
3498 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3499 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003500 m_errorMonitor->VerifyFound();
3501
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003502 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3503 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003504 m_errorMonitor->SetDesiredFailureMsg(
3505 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003506 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003507 vkCmdBindDescriptorSets(
3508 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3509 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003510 m_errorMonitor->VerifyFound();
3511
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003512 // Cause INFO messages due to disturbing previously bound Sets
3513 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003514 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3515 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3516 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003517 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07003518 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003519 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003520 " previously bound as set #0 was disturbed ");
3521 vkCmdBindDescriptorSets(
3522 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3523 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003524 m_errorMonitor->VerifyFound();
3525
Karl Schultz6addd812016-02-02 17:17:23 -07003526 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3527 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3528 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003529 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003530 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003531 " newly bound as set #0 so set #1 and "
3532 "any subsequent sets were disturbed ");
3533 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3534 VK_PIPELINE_BIND_POINT_GRAPHICS,
3535 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003536 m_errorMonitor->VerifyFound();
3537
Tobin Ehlis88452832015-12-03 09:40:56 -07003538 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07003539 // 1. Error due to not binding required set (we actually use same code as
3540 // above to disturb set0)
3541 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3542 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3543 2, &descriptorSet[0], 0, NULL);
3544 vkCmdBindDescriptorSets(
3545 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3546 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
3547 m_errorMonitor->SetDesiredFailureMsg(
3548 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3549 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07003550 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003551 m_errorMonitor->VerifyFound();
3552
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003553 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003554 // 2. Error due to bound set not being compatible with PSO's
3555 // VkPipelineLayout (diff stageFlags in this case)
3556 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3557 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3558 2, &descriptorSet[0], 0, NULL);
3559 m_errorMonitor->SetDesiredFailureMsg(
3560 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3561 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07003562 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003563 m_errorMonitor->VerifyFound();
3564
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003565 // Remaining clean-up
3566 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003567 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003568 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
3569 }
3570 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06003571 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
3572 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003573 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003574 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3575 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3576}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003577
Karl Schultz6addd812016-02-02 17:17:23 -07003578TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003579
Karl Schultz6addd812016-02-02 17:17:23 -07003580 m_errorMonitor->SetDesiredFailureMsg(
3581 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003582 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003583
3584 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003585 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003586 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003587 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003588
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003589 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003590}
3591
Karl Schultz6addd812016-02-02 17:17:23 -07003592TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3593 VkResult err;
3594 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003595
Karl Schultz6addd812016-02-02 17:17:23 -07003596 m_errorMonitor->SetDesiredFailureMsg(
3597 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003598 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003599
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003600 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003601
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003602 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003603 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003604 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003605 cmd.commandPool = m_commandPool;
3606 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003607 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003608
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003609 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003610 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003611
3612 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003613 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003614 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003615 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003616 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003617 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3618 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003619 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003620
3621 // The error should be caught by validation of the BeginCommandBuffer call
3622 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3623
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003624 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003625 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003626}
3627
Karl Schultz6addd812016-02-02 17:17:23 -07003628TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003629 // Cause error due to Begin while recording CB
3630 // Then cause 2 errors for attempting to reset CB w/o having
3631 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3632 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003634 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003635
3636 ASSERT_NO_FATAL_FAILURE(InitState());
3637
3638 // Calls AllocateCommandBuffers
3639 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3640
Karl Schultz6addd812016-02-02 17:17:23 -07003641 // Force the failure by setting the Renderpass and Framebuffer fields with
3642 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003643 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003644 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003645 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3646 cmd_buf_info.pNext = NULL;
3647 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003648 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003649
3650 // Begin CB to transition to recording state
3651 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3652 // Can't re-begin. This should trigger error
3653 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003654 m_errorMonitor->VerifyFound();
3655
Karl Schultz6addd812016-02-02 17:17:23 -07003656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3657 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003658 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3659 // Reset attempt will trigger error due to incorrect CommandPool state
3660 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003661 m_errorMonitor->VerifyFound();
3662
Karl Schultz6addd812016-02-02 17:17:23 -07003663 m_errorMonitor->SetDesiredFailureMsg(
3664 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3665 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003666 // Transition CB to RECORDED state
3667 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3668 // Now attempting to Begin will implicitly reset, which triggers error
3669 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003670 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003671}
3672
Karl Schultz6addd812016-02-02 17:17:23 -07003673TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003674 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003675 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003676
Karl Schultz6addd812016-02-02 17:17:23 -07003677 m_errorMonitor->SetDesiredFailureMsg(
3678 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003679 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3680
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003681 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003682 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003683
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003684 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003685 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3686 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003687
3688 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003689 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3690 ds_pool_ci.pNext = NULL;
3691 ds_pool_ci.maxSets = 1;
3692 ds_pool_ci.poolSizeCount = 1;
3693 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003694
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003695 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003696 err =
3697 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003698 ASSERT_VK_SUCCESS(err);
3699
Tony Barboureb254902015-07-15 12:50:33 -06003700 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003701 dsl_binding.binding = 0;
3702 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3703 dsl_binding.descriptorCount = 1;
3704 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3705 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003706
Tony Barboureb254902015-07-15 12:50:33 -06003707 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003708 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3709 ds_layout_ci.pNext = NULL;
3710 ds_layout_ci.bindingCount = 1;
3711 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003712
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003713 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003714 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3715 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003716 ASSERT_VK_SUCCESS(err);
3717
3718 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003719 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003720 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003721 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003722 alloc_info.descriptorPool = ds_pool;
3723 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003724 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3725 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003726 ASSERT_VK_SUCCESS(err);
3727
Tony Barboureb254902015-07-15 12:50:33 -06003728 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003729 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3730 pipeline_layout_ci.setLayoutCount = 1;
3731 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003732
3733 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003734 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3735 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003736 ASSERT_VK_SUCCESS(err);
3737
Tobin Ehlise68360f2015-10-01 11:15:13 -06003738 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07003739 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06003740
3741 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003742 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3743 vp_state_ci.scissorCount = 1;
3744 vp_state_ci.pScissors = &sc;
3745 vp_state_ci.viewportCount = 1;
3746 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003747
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003748 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3749 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3750 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3751 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3752 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3753 rs_state_ci.depthClampEnable = VK_FALSE;
3754 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3755 rs_state_ci.depthBiasEnable = VK_FALSE;
3756
Tony Barboureb254902015-07-15 12:50:33 -06003757 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003758 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3759 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003760 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003761 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3762 gp_ci.layout = pipeline_layout;
3763 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06003764
3765 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003766 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3767 pc_ci.initialDataSize = 0;
3768 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003769
3770 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003771 VkPipelineCache pipelineCache;
3772
Karl Schultz6addd812016-02-02 17:17:23 -07003773 err =
3774 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06003775 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003776 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3777 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003778
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003779 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003780
Chia-I Wuf7458c52015-10-26 21:10:41 +08003781 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3782 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3783 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3784 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003785}
Tobin Ehlis912df022015-09-17 08:46:18 -06003786/*// TODO : This test should be good, but needs Tess support in compiler to run
3787TEST_F(VkLayerTest, InvalidPatchControlPoints)
3788{
3789 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06003790 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003791
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003793 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
3794primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003795
Tobin Ehlis912df022015-09-17 08:46:18 -06003796 ASSERT_NO_FATAL_FAILURE(InitState());
3797 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06003798
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003799 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06003800 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003801 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003802
3803 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3804 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3805 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003806 ds_pool_ci.poolSizeCount = 1;
3807 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06003808
3809 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003810 err = vkCreateDescriptorPool(m_device->device(),
3811VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06003812 ASSERT_VK_SUCCESS(err);
3813
3814 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08003815 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06003816 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08003817 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003818 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3819 dsl_binding.pImmutableSamplers = NULL;
3820
3821 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003822 ds_layout_ci.sType =
3823VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003824 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003825 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003826 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06003827
3828 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003829 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3830&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003831 ASSERT_VK_SUCCESS(err);
3832
3833 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003834 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
3835VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06003836 ASSERT_VK_SUCCESS(err);
3837
3838 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003839 pipeline_layout_ci.sType =
3840VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003841 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003842 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003843 pipeline_layout_ci.pSetLayouts = &ds_layout;
3844
3845 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003846 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3847&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003848 ASSERT_VK_SUCCESS(err);
3849
3850 VkPipelineShaderStageCreateInfo shaderStages[3];
3851 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
3852
Karl Schultz6addd812016-02-02 17:17:23 -07003853 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
3854this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003855 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07003856 VkShaderObj
3857tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
3858this);
3859 VkShaderObj
3860te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
3861this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003862
Karl Schultz6addd812016-02-02 17:17:23 -07003863 shaderStages[0].sType =
3864VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003865 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003866 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003867 shaderStages[1].sType =
3868VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003869 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003870 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003871 shaderStages[2].sType =
3872VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003873 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003874 shaderStages[2].shader = te.handle();
3875
3876 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003877 iaCI.sType =
3878VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08003879 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06003880
3881 VkPipelineTessellationStateCreateInfo tsCI = {};
3882 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
3883 tsCI.patchControlPoints = 0; // This will cause an error
3884
3885 VkGraphicsPipelineCreateInfo gp_ci = {};
3886 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3887 gp_ci.pNext = NULL;
3888 gp_ci.stageCount = 3;
3889 gp_ci.pStages = shaderStages;
3890 gp_ci.pVertexInputState = NULL;
3891 gp_ci.pInputAssemblyState = &iaCI;
3892 gp_ci.pTessellationState = &tsCI;
3893 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003894 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06003895 gp_ci.pMultisampleState = NULL;
3896 gp_ci.pDepthStencilState = NULL;
3897 gp_ci.pColorBlendState = NULL;
3898 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3899 gp_ci.layout = pipeline_layout;
3900 gp_ci.renderPass = renderPass();
3901
3902 VkPipelineCacheCreateInfo pc_ci = {};
3903 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3904 pc_ci.pNext = NULL;
3905 pc_ci.initialSize = 0;
3906 pc_ci.initialData = 0;
3907 pc_ci.maxSize = 0;
3908
3909 VkPipeline pipeline;
3910 VkPipelineCache pipelineCache;
3911
Karl Schultz6addd812016-02-02 17:17:23 -07003912 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
3913&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06003914 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003915 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3916&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06003917
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003918 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003919
Chia-I Wuf7458c52015-10-26 21:10:41 +08003920 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3921 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3922 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3923 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06003924}
3925*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06003926// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07003927TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07003928 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003929
Karl Schultz6addd812016-02-02 17:17:23 -07003930 m_errorMonitor->SetDesiredFailureMsg(
3931 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003932 "Gfx Pipeline viewport count (1) must match scissor count (0).");
3933
Tobin Ehlise68360f2015-10-01 11:15:13 -06003934 ASSERT_NO_FATAL_FAILURE(InitState());
3935 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003936
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003937 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003938 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3939 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003940
3941 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003942 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3943 ds_pool_ci.maxSets = 1;
3944 ds_pool_ci.poolSizeCount = 1;
3945 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003946
3947 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003948 err =
3949 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003950 ASSERT_VK_SUCCESS(err);
3951
3952 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003953 dsl_binding.binding = 0;
3954 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3955 dsl_binding.descriptorCount = 1;
3956 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003957
3958 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003959 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3960 ds_layout_ci.bindingCount = 1;
3961 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003962
3963 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003964 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3965 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003966 ASSERT_VK_SUCCESS(err);
3967
3968 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003969 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003970 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003971 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003972 alloc_info.descriptorPool = ds_pool;
3973 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003974 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3975 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003976 ASSERT_VK_SUCCESS(err);
3977
3978 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003979 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3980 pipeline_layout_ci.setLayoutCount = 1;
3981 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003982
3983 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003984 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3985 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003986 ASSERT_VK_SUCCESS(err);
3987
3988 VkViewport vp = {}; // Just need dummy vp to point to
3989
3990 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003991 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3992 vp_state_ci.scissorCount = 0;
3993 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
3994 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003995
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003996 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3997 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3998 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3999 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4000 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4001 rs_state_ci.depthClampEnable = VK_FALSE;
4002 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4003 rs_state_ci.depthBiasEnable = VK_FALSE;
4004
Cody Northropeb3a6c12015-10-05 14:44:45 -06004005 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004006 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004007
Karl Schultz6addd812016-02-02 17:17:23 -07004008 VkShaderObj vs(m_device, bindStateVertShaderText,
4009 VK_SHADER_STAGE_VERTEX_BIT, this);
4010 VkShaderObj fs(m_device, bindStateFragShaderText,
4011 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004012 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004013 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004014 shaderStages[0] = vs.GetStageCreateInfo();
4015 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004016
4017 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004018 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4019 gp_ci.stageCount = 2;
4020 gp_ci.pStages = shaderStages;
4021 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004022 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004023 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4024 gp_ci.layout = pipeline_layout;
4025 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004026
4027 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004028 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004029
4030 VkPipeline pipeline;
4031 VkPipelineCache pipelineCache;
4032
Karl Schultz6addd812016-02-02 17:17:23 -07004033 err =
4034 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004035 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004036 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4037 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004038
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004039 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004040
Chia-I Wuf7458c52015-10-26 21:10:41 +08004041 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4042 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4043 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4044 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004045}
Karl Schultz6addd812016-02-02 17:17:23 -07004046// Don't set viewport state in PSO. This is an error b/c we always need this
4047// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06004048// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07004049TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06004050 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004051 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004052
Karl Schultz6addd812016-02-02 17:17:23 -07004053 m_errorMonitor->SetDesiredFailureMsg(
4054 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004055 "Gfx Pipeline pViewportState is null. Even if ");
4056
Tobin Ehlise68360f2015-10-01 11:15:13 -06004057 ASSERT_NO_FATAL_FAILURE(InitState());
4058 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004059
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004060 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004061 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4062 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004063
4064 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004065 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4066 ds_pool_ci.maxSets = 1;
4067 ds_pool_ci.poolSizeCount = 1;
4068 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004069
4070 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004071 err =
4072 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004073 ASSERT_VK_SUCCESS(err);
4074
4075 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004076 dsl_binding.binding = 0;
4077 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4078 dsl_binding.descriptorCount = 1;
4079 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004080
4081 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004082 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4083 ds_layout_ci.bindingCount = 1;
4084 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004085
4086 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004087 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4088 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004089 ASSERT_VK_SUCCESS(err);
4090
4091 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004092 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004093 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004094 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004095 alloc_info.descriptorPool = ds_pool;
4096 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004097 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4098 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004099 ASSERT_VK_SUCCESS(err);
4100
4101 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004102 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4103 pipeline_layout_ci.setLayoutCount = 1;
4104 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004105
4106 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004107 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4108 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004109 ASSERT_VK_SUCCESS(err);
4110
4111 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4112 // Set scissor as dynamic to avoid second error
4113 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004114 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4115 dyn_state_ci.dynamicStateCount = 1;
4116 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004117
Cody Northropeb3a6c12015-10-05 14:44:45 -06004118 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004119 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004120
Karl Schultz6addd812016-02-02 17:17:23 -07004121 VkShaderObj vs(m_device, bindStateVertShaderText,
4122 VK_SHADER_STAGE_VERTEX_BIT, this);
4123 VkShaderObj fs(m_device, bindStateFragShaderText,
4124 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004125 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004126 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004127 shaderStages[0] = vs.GetStageCreateInfo();
4128 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004129
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004130
4131 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4132 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4133 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4134 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4135 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4136 rs_state_ci.depthClampEnable = VK_FALSE;
4137 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4138 rs_state_ci.depthBiasEnable = VK_FALSE;
4139
Tobin Ehlise68360f2015-10-01 11:15:13 -06004140 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004141 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4142 gp_ci.stageCount = 2;
4143 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004144 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004145 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
4146 // should cause validation error
4147 gp_ci.pDynamicState = &dyn_state_ci;
4148 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4149 gp_ci.layout = pipeline_layout;
4150 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004151
4152 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004153 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004154
4155 VkPipeline pipeline;
4156 VkPipelineCache pipelineCache;
4157
Karl Schultz6addd812016-02-02 17:17:23 -07004158 err =
4159 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004160 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004161 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4162 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004163
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004164 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004165
Chia-I Wuf7458c52015-10-26 21:10:41 +08004166 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4167 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4168 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4169 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004170}
4171// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07004172// Then run second test where dynamic scissor count doesn't match PSO scissor
4173// count
4174TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
4175 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004176
Karl Schultz6addd812016-02-02 17:17:23 -07004177 m_errorMonitor->SetDesiredFailureMsg(
4178 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004179 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
4180
Tobin Ehlise68360f2015-10-01 11:15:13 -06004181 ASSERT_NO_FATAL_FAILURE(InitState());
4182 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004183
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004184 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004185 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4186 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004187
4188 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004189 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4190 ds_pool_ci.maxSets = 1;
4191 ds_pool_ci.poolSizeCount = 1;
4192 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004193
4194 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004195 err =
4196 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004197 ASSERT_VK_SUCCESS(err);
4198
4199 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004200 dsl_binding.binding = 0;
4201 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4202 dsl_binding.descriptorCount = 1;
4203 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004204
4205 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004206 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4207 ds_layout_ci.bindingCount = 1;
4208 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004209
4210 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004211 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4212 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004213 ASSERT_VK_SUCCESS(err);
4214
4215 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004216 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004217 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004218 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004219 alloc_info.descriptorPool = ds_pool;
4220 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004221 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4222 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004223 ASSERT_VK_SUCCESS(err);
4224
4225 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004226 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4227 pipeline_layout_ci.setLayoutCount = 1;
4228 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004229
4230 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004231 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4232 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004233 ASSERT_VK_SUCCESS(err);
4234
4235 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004236 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4237 vp_state_ci.viewportCount = 1;
4238 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
4239 vp_state_ci.scissorCount = 1;
4240 vp_state_ci.pScissors =
4241 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06004242
4243 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4244 // Set scissor as dynamic to avoid that error
4245 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004246 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4247 dyn_state_ci.dynamicStateCount = 1;
4248 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004249
Cody Northropeb3a6c12015-10-05 14:44:45 -06004250 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004251 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004252
Karl Schultz6addd812016-02-02 17:17:23 -07004253 VkShaderObj vs(m_device, bindStateVertShaderText,
4254 VK_SHADER_STAGE_VERTEX_BIT, this);
4255 VkShaderObj fs(m_device, bindStateFragShaderText,
4256 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004257 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004258 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004259 shaderStages[0] = vs.GetStageCreateInfo();
4260 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004261
Cody Northropf6622dc2015-10-06 10:33:21 -06004262 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4263 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4264 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004265 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004266 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004267 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004268 vi_ci.pVertexAttributeDescriptions = nullptr;
4269
4270 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4271 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4272 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4273
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004274 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004275 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06004276 rs_ci.pNext = nullptr;
4277
Mark Youngc89c6312016-03-31 16:03:20 -06004278 VkPipelineColorBlendAttachmentState att = {};
4279 att.blendEnable = VK_FALSE;
4280 att.colorWriteMask = 0xf;
4281
Cody Northropf6622dc2015-10-06 10:33:21 -06004282 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4283 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4284 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004285 cb_ci.attachmentCount = 1;
4286 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06004287
Tobin Ehlise68360f2015-10-01 11:15:13 -06004288 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004289 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4290 gp_ci.stageCount = 2;
4291 gp_ci.pStages = shaderStages;
4292 gp_ci.pVertexInputState = &vi_ci;
4293 gp_ci.pInputAssemblyState = &ia_ci;
4294 gp_ci.pViewportState = &vp_state_ci;
4295 gp_ci.pRasterizationState = &rs_ci;
4296 gp_ci.pColorBlendState = &cb_ci;
4297 gp_ci.pDynamicState = &dyn_state_ci;
4298 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4299 gp_ci.layout = pipeline_layout;
4300 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004301
4302 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004303 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004304
4305 VkPipeline pipeline;
4306 VkPipelineCache pipelineCache;
4307
Karl Schultz6addd812016-02-02 17:17:23 -07004308 err =
4309 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004310 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004311 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4312 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004313
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004314 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004315
Tobin Ehlisd332f282015-10-02 11:00:56 -06004316 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07004317 // First need to successfully create the PSO from above by setting
4318 // pViewports
4319 m_errorMonitor->SetDesiredFailureMsg(
4320 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4321 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
4322 "scissorCount is 1. These counts must match.");
4323
4324 VkViewport vp = {}; // Just need dummy vp to point to
4325 vp_state_ci.pViewports = &vp;
4326 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4327 &gp_ci, NULL, &pipeline);
4328 ASSERT_VK_SUCCESS(err);
4329 BeginCommandBuffer();
4330 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4331 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4332 VkRect2D scissors[2] = {}; // don't care about data
4333 // Count of 2 doesn't match PSO count of 1
4334 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
4335 Draw(1, 0, 0, 0);
4336
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004337 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004338
4339 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4340 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4341 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4342 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4343}
4344// Create PSO w/o non-zero scissorCount but no scissor data
4345// Then run second test where dynamic viewportCount doesn't match PSO
4346// viewportCount
4347TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
4348 VkResult err;
4349
4350 m_errorMonitor->SetDesiredFailureMsg(
4351 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4352 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
4353
4354 ASSERT_NO_FATAL_FAILURE(InitState());
4355 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4356
4357 VkDescriptorPoolSize ds_type_count = {};
4358 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4359 ds_type_count.descriptorCount = 1;
4360
4361 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4362 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4363 ds_pool_ci.maxSets = 1;
4364 ds_pool_ci.poolSizeCount = 1;
4365 ds_pool_ci.pPoolSizes = &ds_type_count;
4366
4367 VkDescriptorPool ds_pool;
4368 err =
4369 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4370 ASSERT_VK_SUCCESS(err);
4371
4372 VkDescriptorSetLayoutBinding dsl_binding = {};
4373 dsl_binding.binding = 0;
4374 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4375 dsl_binding.descriptorCount = 1;
4376 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4377
4378 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4379 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4380 ds_layout_ci.bindingCount = 1;
4381 ds_layout_ci.pBindings = &dsl_binding;
4382
4383 VkDescriptorSetLayout ds_layout;
4384 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4385 &ds_layout);
4386 ASSERT_VK_SUCCESS(err);
4387
4388 VkDescriptorSet descriptorSet;
4389 VkDescriptorSetAllocateInfo alloc_info = {};
4390 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4391 alloc_info.descriptorSetCount = 1;
4392 alloc_info.descriptorPool = ds_pool;
4393 alloc_info.pSetLayouts = &ds_layout;
4394 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4395 &descriptorSet);
4396 ASSERT_VK_SUCCESS(err);
4397
4398 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4399 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4400 pipeline_layout_ci.setLayoutCount = 1;
4401 pipeline_layout_ci.pSetLayouts = &ds_layout;
4402
4403 VkPipelineLayout pipeline_layout;
4404 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4405 &pipeline_layout);
4406 ASSERT_VK_SUCCESS(err);
4407
4408 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4409 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4410 vp_state_ci.scissorCount = 1;
4411 vp_state_ci.pScissors =
4412 NULL; // Null scissor w/ count of 1 should cause error
4413 vp_state_ci.viewportCount = 1;
4414 vp_state_ci.pViewports =
4415 NULL; // vp is dynamic (below) so this won't cause error
4416
4417 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
4418 // Set scissor as dynamic to avoid that error
4419 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4420 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4421 dyn_state_ci.dynamicStateCount = 1;
4422 dyn_state_ci.pDynamicStates = &vp_state;
4423
4424 VkPipelineShaderStageCreateInfo shaderStages[2];
4425 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4426
4427 VkShaderObj vs(m_device, bindStateVertShaderText,
4428 VK_SHADER_STAGE_VERTEX_BIT, this);
4429 VkShaderObj fs(m_device, bindStateFragShaderText,
4430 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004431 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004432 // but add it to be able to run on more devices
4433 shaderStages[0] = vs.GetStageCreateInfo();
4434 shaderStages[1] = fs.GetStageCreateInfo();
4435
4436 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4437 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4438 vi_ci.pNext = nullptr;
4439 vi_ci.vertexBindingDescriptionCount = 0;
4440 vi_ci.pVertexBindingDescriptions = nullptr;
4441 vi_ci.vertexAttributeDescriptionCount = 0;
4442 vi_ci.pVertexAttributeDescriptions = nullptr;
4443
4444 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4445 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4446 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4447
4448 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4449 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4450 rs_ci.pNext = nullptr;
4451
Mark Youngc89c6312016-03-31 16:03:20 -06004452 VkPipelineColorBlendAttachmentState att = {};
4453 att.blendEnable = VK_FALSE;
4454 att.colorWriteMask = 0xf;
4455
Karl Schultz6addd812016-02-02 17:17:23 -07004456 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4457 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4458 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004459 cb_ci.attachmentCount = 1;
4460 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004461
4462 VkGraphicsPipelineCreateInfo gp_ci = {};
4463 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4464 gp_ci.stageCount = 2;
4465 gp_ci.pStages = shaderStages;
4466 gp_ci.pVertexInputState = &vi_ci;
4467 gp_ci.pInputAssemblyState = &ia_ci;
4468 gp_ci.pViewportState = &vp_state_ci;
4469 gp_ci.pRasterizationState = &rs_ci;
4470 gp_ci.pColorBlendState = &cb_ci;
4471 gp_ci.pDynamicState = &dyn_state_ci;
4472 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4473 gp_ci.layout = pipeline_layout;
4474 gp_ci.renderPass = renderPass();
4475
4476 VkPipelineCacheCreateInfo pc_ci = {};
4477 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4478
4479 VkPipeline pipeline;
4480 VkPipelineCache pipelineCache;
4481
4482 err =
4483 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4484 ASSERT_VK_SUCCESS(err);
4485 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4486 &gp_ci, NULL, &pipeline);
4487
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004488 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004489
4490 // Now hit second fail case where we set scissor w/ different count than PSO
4491 // First need to successfully create the PSO from above by setting
4492 // pViewports
4493 m_errorMonitor->SetDesiredFailureMsg(
4494 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4495 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4496 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004497
Tobin Ehlisd332f282015-10-02 11:00:56 -06004498 VkRect2D sc = {}; // Just need dummy vp to point to
4499 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004500 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4501 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004502 ASSERT_VK_SUCCESS(err);
4503 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004504 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4505 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004506 VkViewport viewports[2] = {}; // don't care about data
4507 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004508 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004509 Draw(1, 0, 0, 0);
4510
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004511 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004512
Chia-I Wuf7458c52015-10-26 21:10:41 +08004513 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4514 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4515 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4516 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004517}
4518
Mark Young7394fdd2016-03-31 14:56:43 -06004519TEST_F(VkLayerTest, PSOLineWidthInvalid) {
4520 VkResult err;
4521
4522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004523 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004524
4525 ASSERT_NO_FATAL_FAILURE(InitState());
4526 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4527
4528 VkDescriptorPoolSize ds_type_count = {};
4529 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4530 ds_type_count.descriptorCount = 1;
4531
4532 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4533 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4534 ds_pool_ci.maxSets = 1;
4535 ds_pool_ci.poolSizeCount = 1;
4536 ds_pool_ci.pPoolSizes = &ds_type_count;
4537
4538 VkDescriptorPool ds_pool;
4539 err =
4540 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4541 ASSERT_VK_SUCCESS(err);
4542
4543 VkDescriptorSetLayoutBinding dsl_binding = {};
4544 dsl_binding.binding = 0;
4545 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4546 dsl_binding.descriptorCount = 1;
4547 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4548
4549 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4550 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4551 ds_layout_ci.bindingCount = 1;
4552 ds_layout_ci.pBindings = &dsl_binding;
4553
4554 VkDescriptorSetLayout ds_layout;
4555 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4556 &ds_layout);
4557 ASSERT_VK_SUCCESS(err);
4558
4559 VkDescriptorSet descriptorSet;
4560 VkDescriptorSetAllocateInfo alloc_info = {};
4561 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4562 alloc_info.descriptorSetCount = 1;
4563 alloc_info.descriptorPool = ds_pool;
4564 alloc_info.pSetLayouts = &ds_layout;
4565 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4566 &descriptorSet);
4567 ASSERT_VK_SUCCESS(err);
4568
4569 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4570 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4571 pipeline_layout_ci.setLayoutCount = 1;
4572 pipeline_layout_ci.pSetLayouts = &ds_layout;
4573
4574 VkPipelineLayout pipeline_layout;
4575 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4576 &pipeline_layout);
4577 ASSERT_VK_SUCCESS(err);
4578
4579 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4580 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4581 vp_state_ci.scissorCount = 1;
4582 vp_state_ci.pScissors = NULL;
4583 vp_state_ci.viewportCount = 1;
4584 vp_state_ci.pViewports = NULL;
4585
4586 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
4587 VK_DYNAMIC_STATE_SCISSOR,
4588 VK_DYNAMIC_STATE_LINE_WIDTH};
4589 // Set scissor as dynamic to avoid that error
4590 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4591 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4592 dyn_state_ci.dynamicStateCount = 2;
4593 dyn_state_ci.pDynamicStates = dynamic_states;
4594
4595 VkPipelineShaderStageCreateInfo shaderStages[2];
4596 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4597
4598 VkShaderObj vs(m_device, bindStateVertShaderText,
4599 VK_SHADER_STAGE_VERTEX_BIT, this);
4600 VkShaderObj fs(m_device, bindStateFragShaderText,
4601 VK_SHADER_STAGE_FRAGMENT_BIT,
4602 this); // TODO - We shouldn't need a fragment shader
4603 // but add it to be able to run on more devices
4604 shaderStages[0] = vs.GetStageCreateInfo();
4605 shaderStages[1] = fs.GetStageCreateInfo();
4606
4607 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4608 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4609 vi_ci.pNext = nullptr;
4610 vi_ci.vertexBindingDescriptionCount = 0;
4611 vi_ci.pVertexBindingDescriptions = nullptr;
4612 vi_ci.vertexAttributeDescriptionCount = 0;
4613 vi_ci.pVertexAttributeDescriptions = nullptr;
4614
4615 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4616 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4617 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4618
4619 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4620 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4621 rs_ci.pNext = nullptr;
4622
Mark Young47107952016-05-02 15:59:55 -06004623 // Check too low (line width of -1.0f).
4624 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06004625
4626 VkPipelineColorBlendAttachmentState att = {};
4627 att.blendEnable = VK_FALSE;
4628 att.colorWriteMask = 0xf;
4629
4630 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4631 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4632 cb_ci.pNext = nullptr;
4633 cb_ci.attachmentCount = 1;
4634 cb_ci.pAttachments = &att;
4635
4636 VkGraphicsPipelineCreateInfo gp_ci = {};
4637 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4638 gp_ci.stageCount = 2;
4639 gp_ci.pStages = shaderStages;
4640 gp_ci.pVertexInputState = &vi_ci;
4641 gp_ci.pInputAssemblyState = &ia_ci;
4642 gp_ci.pViewportState = &vp_state_ci;
4643 gp_ci.pRasterizationState = &rs_ci;
4644 gp_ci.pColorBlendState = &cb_ci;
4645 gp_ci.pDynamicState = &dyn_state_ci;
4646 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4647 gp_ci.layout = pipeline_layout;
4648 gp_ci.renderPass = renderPass();
4649
4650 VkPipelineCacheCreateInfo pc_ci = {};
4651 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4652
4653 VkPipeline pipeline;
4654 VkPipelineCache pipelineCache;
4655
4656 err =
4657 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4658 ASSERT_VK_SUCCESS(err);
4659 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4660 &gp_ci, NULL, &pipeline);
4661
4662 m_errorMonitor->VerifyFound();
4663
4664 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4665 "Attempt to set lineWidth to 65536");
4666
4667 // Check too high (line width of 65536.0f).
4668 rs_ci.lineWidth = 65536.0f;
4669
4670 err =
4671 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4672 ASSERT_VK_SUCCESS(err);
4673 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4674 &gp_ci, NULL, &pipeline);
4675
4676 m_errorMonitor->VerifyFound();
4677
4678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004679 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004680
4681 dyn_state_ci.dynamicStateCount = 3;
4682
4683 rs_ci.lineWidth = 1.0f;
4684
4685 err =
4686 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4687 ASSERT_VK_SUCCESS(err);
4688 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4689 &gp_ci, NULL, &pipeline);
4690 BeginCommandBuffer();
4691 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4692 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4693
4694 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06004695 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06004696 m_errorMonitor->VerifyFound();
4697
4698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4699 "Attempt to set lineWidth to 65536");
4700
4701 // Check too high with dynamic setting.
4702 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
4703 m_errorMonitor->VerifyFound();
4704 EndCommandBuffer();
4705
4706 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4707 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4708 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4709 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4710}
4711
Karl Schultz6addd812016-02-02 17:17:23 -07004712TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004713 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004714 m_errorMonitor->SetDesiredFailureMsg(
4715 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004716 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004717
4718 ASSERT_NO_FATAL_FAILURE(InitState());
4719 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004720
Tony Barbourfe3351b2015-07-28 10:17:20 -06004721 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004722 // Don't care about RenderPass handle b/c error should be flagged before
4723 // that
4724 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
4725 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004726
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004727 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004728}
4729
Karl Schultz6addd812016-02-02 17:17:23 -07004730TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004731 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004732 m_errorMonitor->SetDesiredFailureMsg(
4733 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004734 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004735
4736 ASSERT_NO_FATAL_FAILURE(InitState());
4737 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004738
Tony Barbourfe3351b2015-07-28 10:17:20 -06004739 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004740 // Just create a dummy Renderpass that's non-NULL so we can get to the
4741 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06004742 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004743 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4744 rp_begin.pNext = NULL;
4745 rp_begin.renderPass = renderPass();
4746 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004747
Karl Schultz6addd812016-02-02 17:17:23 -07004748 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
4749 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004750
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004751 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004752}
4753
Karl Schultz6addd812016-02-02 17:17:23 -07004754TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004755 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004756 m_errorMonitor->SetDesiredFailureMsg(
4757 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004758 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004759
4760 ASSERT_NO_FATAL_FAILURE(InitState());
4761 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004762
4763 // Renderpass is started here
4764 BeginCommandBuffer();
4765
4766 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004767 vk_testing::Buffer dstBuffer;
4768 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004769
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004770 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004771
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004772 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004773}
4774
Karl Schultz6addd812016-02-02 17:17:23 -07004775TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004776 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004777 m_errorMonitor->SetDesiredFailureMsg(
4778 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004779 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004780
4781 ASSERT_NO_FATAL_FAILURE(InitState());
4782 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004783
4784 // Renderpass is started here
4785 BeginCommandBuffer();
4786
4787 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004788 vk_testing::Buffer dstBuffer;
4789 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004790
Karl Schultz6addd812016-02-02 17:17:23 -07004791 VkDeviceSize dstOffset = 0;
4792 VkDeviceSize dataSize = 1024;
4793 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004794
Karl Schultz6addd812016-02-02 17:17:23 -07004795 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
4796 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004797
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004798 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004799}
4800
Karl Schultz6addd812016-02-02 17:17:23 -07004801TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004802 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004803 m_errorMonitor->SetDesiredFailureMsg(
4804 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004805 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004806
4807 ASSERT_NO_FATAL_FAILURE(InitState());
4808 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004809
4810 // Renderpass is started here
4811 BeginCommandBuffer();
4812
Michael Lentine0a369f62016-02-03 16:51:46 -06004813 VkClearColorValue clear_color;
4814 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07004815 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
4816 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4817 const int32_t tex_width = 32;
4818 const int32_t tex_height = 32;
4819 VkImageCreateInfo image_create_info = {};
4820 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4821 image_create_info.pNext = NULL;
4822 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4823 image_create_info.format = tex_format;
4824 image_create_info.extent.width = tex_width;
4825 image_create_info.extent.height = tex_height;
4826 image_create_info.extent.depth = 1;
4827 image_create_info.mipLevels = 1;
4828 image_create_info.arrayLayers = 1;
4829 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4830 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4831 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004832
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004833 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004834 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4835 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004836
Karl Schultz6addd812016-02-02 17:17:23 -07004837 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4838 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004839
Karl Schultz6addd812016-02-02 17:17:23 -07004840 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4841 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004842
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004843 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004844}
4845
Karl Schultz6addd812016-02-02 17:17:23 -07004846TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004847 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004848 m_errorMonitor->SetDesiredFailureMsg(
4849 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004850 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004851
4852 ASSERT_NO_FATAL_FAILURE(InitState());
4853 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004854
4855 // Renderpass is started here
4856 BeginCommandBuffer();
4857
4858 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07004859 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004860 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
4861 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4862 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
4863 image_create_info.extent.width = 64;
4864 image_create_info.extent.height = 64;
4865 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4866 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004867
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004868 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004869 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4870 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004871
Karl Schultz6addd812016-02-02 17:17:23 -07004872 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4873 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004874
Karl Schultz6addd812016-02-02 17:17:23 -07004875 vkCmdClearDepthStencilImage(
4876 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4877 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
4878 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004879
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004880 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004881}
4882
Karl Schultz6addd812016-02-02 17:17:23 -07004883TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004884 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004885 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004886
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004888 "vkCmdClearAttachments: This call "
4889 "must be issued inside an active "
4890 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004891
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004892 ASSERT_NO_FATAL_FAILURE(InitState());
4893 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004894
4895 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004896 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004897 ASSERT_VK_SUCCESS(err);
4898
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004899 VkClearAttachment color_attachment;
4900 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4901 color_attachment.clearValue.color.float32[0] = 0;
4902 color_attachment.clearValue.color.float32[1] = 0;
4903 color_attachment.clearValue.color.float32[2] = 0;
4904 color_attachment.clearValue.color.float32[3] = 0;
4905 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004906 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
4907 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4908 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004909
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004910 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004911}
4912
Karl Schultz9e66a292016-04-21 15:57:51 -06004913TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
4914 // Try to add a buffer memory barrier with no buffer.
4915 m_errorMonitor->SetDesiredFailureMsg(
4916 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4917 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
4918
4919 ASSERT_NO_FATAL_FAILURE(InitState());
4920 BeginCommandBuffer();
4921
4922 VkBufferMemoryBarrier buf_barrier = {};
4923 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
4924 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4925 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4926 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4927 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4928 buf_barrier.buffer = VK_NULL_HANDLE;
4929 buf_barrier.offset = 0;
4930 buf_barrier.size = VK_WHOLE_SIZE;
4931 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4932 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
4933 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
4934
4935 m_errorMonitor->VerifyFound();
4936}
4937
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06004938TEST_F(VkLayerTest, InvalidBarriers) {
4939 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
4940
4941 m_errorMonitor->SetDesiredFailureMsg(
4942 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
4943
4944 ASSERT_NO_FATAL_FAILURE(InitState());
4945 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4946
4947 VkMemoryBarrier mem_barrier = {};
4948 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
4949 mem_barrier.pNext = NULL;
4950 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4951 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4952 BeginCommandBuffer();
4953 // BeginCommandBuffer() starts a render pass
4954 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4955 VK_PIPELINE_STAGE_HOST_BIT,
4956 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
4957 &mem_barrier, 0, nullptr, 0, nullptr);
4958 m_errorMonitor->VerifyFound();
4959
4960 m_errorMonitor->SetDesiredFailureMsg(
4961 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4962 "Image Layout cannot be transitioned to UNDEFINED");
4963 VkImageObj image(m_device);
4964 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
4965 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4966 ASSERT_TRUE(image.initialized());
4967 VkImageMemoryBarrier img_barrier = {};
4968 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4969 img_barrier.pNext = NULL;
4970 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4971 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4972 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
4973 // New layout can't be UNDEFINED
4974 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4975 img_barrier.image = image.handle();
4976 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4977 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4978 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4979 img_barrier.subresourceRange.baseArrayLayer = 0;
4980 img_barrier.subresourceRange.baseMipLevel = 0;
4981 img_barrier.subresourceRange.layerCount = 1;
4982 img_barrier.subresourceRange.levelCount = 1;
4983 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4984 VK_PIPELINE_STAGE_HOST_BIT,
4985 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
4986 nullptr, 1, &img_barrier);
4987 m_errorMonitor->VerifyFound();
4988 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
4989
4990 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4991 "Subresource must have the sum of the "
4992 "baseArrayLayer");
4993 // baseArrayLayer + layerCount must be <= image's arrayLayers
4994 img_barrier.subresourceRange.baseArrayLayer = 1;
4995 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4996 VK_PIPELINE_STAGE_HOST_BIT,
4997 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
4998 nullptr, 1, &img_barrier);
4999 m_errorMonitor->VerifyFound();
5000 img_barrier.subresourceRange.baseArrayLayer = 0;
5001
5002 m_errorMonitor->SetDesiredFailureMsg(
5003 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5004 "Subresource must have the sum of the baseMipLevel");
5005 // baseMipLevel + levelCount must be <= image's mipLevels
5006 img_barrier.subresourceRange.baseMipLevel = 1;
5007 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5008 VK_PIPELINE_STAGE_HOST_BIT,
5009 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5010 nullptr, 1, &img_barrier);
5011 m_errorMonitor->VerifyFound();
5012 img_barrier.subresourceRange.baseMipLevel = 0;
5013
5014 m_errorMonitor->SetDesiredFailureMsg(
5015 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5016 "Buffer Barriers cannot be used during a render pass");
5017 vk_testing::Buffer buffer;
5018 buffer.init(*m_device, 256);
5019 VkBufferMemoryBarrier buf_barrier = {};
5020 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5021 buf_barrier.pNext = NULL;
5022 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5023 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5024 buf_barrier.buffer = buffer.handle();
5025 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5026 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5027 buf_barrier.offset = 0;
5028 buf_barrier.size = VK_WHOLE_SIZE;
5029 // Can't send buffer barrier during a render pass
5030 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5031 VK_PIPELINE_STAGE_HOST_BIT,
5032 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5033 &buf_barrier, 0, nullptr);
5034 m_errorMonitor->VerifyFound();
5035 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
5036
5037 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5038 "which is not less than total size");
5039 buf_barrier.offset = 257;
5040 // Offset greater than total size
5041 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5042 VK_PIPELINE_STAGE_HOST_BIT,
5043 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5044 &buf_barrier, 0, nullptr);
5045 m_errorMonitor->VerifyFound();
5046 buf_barrier.offset = 0;
5047
5048 m_errorMonitor->SetDesiredFailureMsg(
5049 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
5050 buf_barrier.size = 257;
5051 // Size greater than total size
5052 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5053 VK_PIPELINE_STAGE_HOST_BIT,
5054 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5055 &buf_barrier, 0, nullptr);
5056 m_errorMonitor->VerifyFound();
5057 buf_barrier.size = VK_WHOLE_SIZE;
5058
5059 m_errorMonitor->SetDesiredFailureMsg(
5060 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5061 "Image is a depth and stencil format and thus must "
5062 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
5063 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
5064 VkDepthStencilObj ds_image(m_device);
5065 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
5066 ASSERT_TRUE(ds_image.initialized());
5067 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5068 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
5069 img_barrier.image = ds_image.handle();
5070 // Leave aspectMask at COLOR on purpose
5071 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5072 VK_PIPELINE_STAGE_HOST_BIT,
5073 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5074 nullptr, 1, &img_barrier);
5075 m_errorMonitor->VerifyFound();
5076}
5077
Karl Schultz6addd812016-02-02 17:17:23 -07005078TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005079 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005080 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005081
Karl Schultz6addd812016-02-02 17:17:23 -07005082 m_errorMonitor->SetDesiredFailureMsg(
5083 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005084 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
5085
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005086 ASSERT_NO_FATAL_FAILURE(InitState());
5087 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005088 uint32_t qfi = 0;
5089 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005090 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5091 buffCI.size = 1024;
5092 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5093 buffCI.queueFamilyIndexCount = 1;
5094 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005095
5096 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005097 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005098 ASSERT_VK_SUCCESS(err);
5099
5100 BeginCommandBuffer();
5101 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005102 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5103 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005104 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07005105 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
5106 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005107
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005108 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005109
Chia-I Wuf7458c52015-10-26 21:10:41 +08005110 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005111}
5112
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005113TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
5114 // Create an out-of-range queueFamilyIndex
5115 m_errorMonitor->SetDesiredFailureMsg(
5116 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06005117 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005118
5119 ASSERT_NO_FATAL_FAILURE(InitState());
5120 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5121 VkBufferCreateInfo buffCI = {};
5122 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5123 buffCI.size = 1024;
5124 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5125 buffCI.queueFamilyIndexCount = 1;
5126 // Introduce failure by specifying invalid queue_family_index
5127 uint32_t qfi = 777;
5128 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06005129 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005130
5131 VkBuffer ib;
5132 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
5133
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005134 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005135}
5136
Karl Schultz6addd812016-02-02 17:17:23 -07005137TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
5138 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
5139 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005140
Karl Schultz6addd812016-02-02 17:17:23 -07005141 m_errorMonitor->SetDesiredFailureMsg(
5142 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005143 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005144
5145 ASSERT_NO_FATAL_FAILURE(InitState());
5146 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005147
5148 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005149 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005150 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
5151 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005152
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005153 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005154}
5155
Karl Schultz6addd812016-02-02 17:17:23 -07005156TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005157 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07005158 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005159
Karl Schultz6addd812016-02-02 17:17:23 -07005160 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005161 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5162 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
5163 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005164
Tobin Ehlis3b780662015-05-28 12:11:26 -06005165 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005166 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005167 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005168 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5169 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005170
5171 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005172 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5173 ds_pool_ci.pNext = NULL;
5174 ds_pool_ci.maxSets = 1;
5175 ds_pool_ci.poolSizeCount = 1;
5176 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005177
Tobin Ehlis3b780662015-05-28 12:11:26 -06005178 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005179 err =
5180 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005181 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005182 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005183 dsl_binding.binding = 0;
5184 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5185 dsl_binding.descriptorCount = 1;
5186 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5187 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005188
Tony Barboureb254902015-07-15 12:50:33 -06005189 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005190 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5191 ds_layout_ci.pNext = NULL;
5192 ds_layout_ci.bindingCount = 1;
5193 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005194
Tobin Ehlis3b780662015-05-28 12:11:26 -06005195 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005196 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5197 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005198 ASSERT_VK_SUCCESS(err);
5199
5200 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005201 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005202 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005203 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005204 alloc_info.descriptorPool = ds_pool;
5205 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005206 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5207 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005208 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005209
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005210 VkSamplerCreateInfo sampler_ci = {};
5211 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5212 sampler_ci.pNext = NULL;
5213 sampler_ci.magFilter = VK_FILTER_NEAREST;
5214 sampler_ci.minFilter = VK_FILTER_NEAREST;
5215 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5216 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5217 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5218 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5219 sampler_ci.mipLodBias = 1.0;
5220 sampler_ci.anisotropyEnable = VK_FALSE;
5221 sampler_ci.maxAnisotropy = 1;
5222 sampler_ci.compareEnable = VK_FALSE;
5223 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5224 sampler_ci.minLod = 1.0;
5225 sampler_ci.maxLod = 1.0;
5226 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5227 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5228 VkSampler sampler;
5229 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5230 ASSERT_VK_SUCCESS(err);
5231
5232 VkDescriptorImageInfo info = {};
5233 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005234
5235 VkWriteDescriptorSet descriptor_write;
5236 memset(&descriptor_write, 0, sizeof(descriptor_write));
5237 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005238 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005239 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005240 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005241 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005242 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005243
5244 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5245
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005246 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005247
Chia-I Wuf7458c52015-10-26 21:10:41 +08005248 vkDestroySampler(m_device->device(), sampler, NULL);
5249 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5250 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005251}
5252
Karl Schultz6addd812016-02-02 17:17:23 -07005253TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005254 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07005255 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005256
Karl Schultz6addd812016-02-02 17:17:23 -07005257 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005258 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5259 " binding #0 with 1 total descriptors but update of 1 descriptors "
5260 "starting at binding offset of 0 combined with update array element "
5261 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005262
Tobin Ehlis3b780662015-05-28 12:11:26 -06005263 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005264 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005265 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005266 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5267 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005268
5269 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005270 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5271 ds_pool_ci.pNext = NULL;
5272 ds_pool_ci.maxSets = 1;
5273 ds_pool_ci.poolSizeCount = 1;
5274 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005275
Tobin Ehlis3b780662015-05-28 12:11:26 -06005276 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005277 err =
5278 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005279 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005280
Tony Barboureb254902015-07-15 12:50:33 -06005281 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005282 dsl_binding.binding = 0;
5283 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5284 dsl_binding.descriptorCount = 1;
5285 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5286 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005287
5288 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005289 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5290 ds_layout_ci.pNext = NULL;
5291 ds_layout_ci.bindingCount = 1;
5292 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005293
Tobin Ehlis3b780662015-05-28 12:11:26 -06005294 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005295 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5296 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005297 ASSERT_VK_SUCCESS(err);
5298
5299 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005300 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005301 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005302 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005303 alloc_info.descriptorPool = ds_pool;
5304 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005305 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5306 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005307 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005308
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005309 // Correctly update descriptor to avoid "NOT_UPDATED" error
5310 VkDescriptorBufferInfo buff_info = {};
5311 buff_info.buffer =
5312 VkBuffer(0); // Don't care about buffer handle for this test
5313 buff_info.offset = 0;
5314 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005315
5316 VkWriteDescriptorSet descriptor_write;
5317 memset(&descriptor_write, 0, sizeof(descriptor_write));
5318 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005319 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005320 descriptor_write.dstArrayElement =
5321 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08005322 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005323 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5324 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005325
5326 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5327
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005328 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005329
Chia-I Wuf7458c52015-10-26 21:10:41 +08005330 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5331 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005332}
5333
Karl Schultz6addd812016-02-02 17:17:23 -07005334TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
5335 // Create layout w/ count of 1 and attempt update to that layout w/ binding
5336 // index 2
5337 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005338
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5340 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005341
Tobin Ehlis3b780662015-05-28 12:11:26 -06005342 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005343 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005344 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005345 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5346 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005347
5348 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005349 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5350 ds_pool_ci.pNext = NULL;
5351 ds_pool_ci.maxSets = 1;
5352 ds_pool_ci.poolSizeCount = 1;
5353 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005354
Tobin Ehlis3b780662015-05-28 12:11:26 -06005355 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005356 err =
5357 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005358 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005359
Tony Barboureb254902015-07-15 12:50:33 -06005360 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005361 dsl_binding.binding = 0;
5362 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5363 dsl_binding.descriptorCount = 1;
5364 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5365 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005366
5367 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005368 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5369 ds_layout_ci.pNext = NULL;
5370 ds_layout_ci.bindingCount = 1;
5371 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005372 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005373 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5374 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005375 ASSERT_VK_SUCCESS(err);
5376
5377 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005378 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005379 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005380 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005381 alloc_info.descriptorPool = ds_pool;
5382 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005383 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5384 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005385 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005386
Tony Barboureb254902015-07-15 12:50:33 -06005387 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005388 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5389 sampler_ci.pNext = NULL;
5390 sampler_ci.magFilter = VK_FILTER_NEAREST;
5391 sampler_ci.minFilter = VK_FILTER_NEAREST;
5392 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5393 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5394 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5395 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5396 sampler_ci.mipLodBias = 1.0;
5397 sampler_ci.anisotropyEnable = VK_FALSE;
5398 sampler_ci.maxAnisotropy = 1;
5399 sampler_ci.compareEnable = VK_FALSE;
5400 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5401 sampler_ci.minLod = 1.0;
5402 sampler_ci.maxLod = 1.0;
5403 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5404 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005405
Tobin Ehlis3b780662015-05-28 12:11:26 -06005406 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005407 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005408 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005409
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005410 VkDescriptorImageInfo info = {};
5411 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005412
5413 VkWriteDescriptorSet descriptor_write;
5414 memset(&descriptor_write, 0, sizeof(descriptor_write));
5415 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005416 descriptor_write.dstSet = descriptorSet;
5417 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005418 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005419 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005420 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005421 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005422
5423 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5424
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005425 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005426
Chia-I Wuf7458c52015-10-26 21:10:41 +08005427 vkDestroySampler(m_device->device(), sampler, NULL);
5428 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5429 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005430}
5431
Karl Schultz6addd812016-02-02 17:17:23 -07005432TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
5433 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
5434 // types
5435 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005436
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005438 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005439
Tobin Ehlis3b780662015-05-28 12:11:26 -06005440 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005441
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005442 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005443 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5444 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005445
5446 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005447 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5448 ds_pool_ci.pNext = NULL;
5449 ds_pool_ci.maxSets = 1;
5450 ds_pool_ci.poolSizeCount = 1;
5451 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005452
Tobin Ehlis3b780662015-05-28 12:11:26 -06005453 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005454 err =
5455 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005456 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005457 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005458 dsl_binding.binding = 0;
5459 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5460 dsl_binding.descriptorCount = 1;
5461 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5462 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005463
Tony Barboureb254902015-07-15 12:50:33 -06005464 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005465 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5466 ds_layout_ci.pNext = NULL;
5467 ds_layout_ci.bindingCount = 1;
5468 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005469
Tobin Ehlis3b780662015-05-28 12:11:26 -06005470 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005471 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5472 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005473 ASSERT_VK_SUCCESS(err);
5474
5475 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005476 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005477 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005478 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005479 alloc_info.descriptorPool = ds_pool;
5480 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005481 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5482 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005483 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005484
Tony Barboureb254902015-07-15 12:50:33 -06005485 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005486 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5487 sampler_ci.pNext = NULL;
5488 sampler_ci.magFilter = VK_FILTER_NEAREST;
5489 sampler_ci.minFilter = VK_FILTER_NEAREST;
5490 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5491 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5492 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5493 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5494 sampler_ci.mipLodBias = 1.0;
5495 sampler_ci.anisotropyEnable = VK_FALSE;
5496 sampler_ci.maxAnisotropy = 1;
5497 sampler_ci.compareEnable = VK_FALSE;
5498 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5499 sampler_ci.minLod = 1.0;
5500 sampler_ci.maxLod = 1.0;
5501 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5502 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005503 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005504 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005505 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005506
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005507 VkDescriptorImageInfo info = {};
5508 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005509
5510 VkWriteDescriptorSet descriptor_write;
5511 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07005512 descriptor_write.sType =
5513 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005514 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005515 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005516 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005517 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005518 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005519
5520 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5521
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005522 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005523
Chia-I Wuf7458c52015-10-26 21:10:41 +08005524 vkDestroySampler(m_device->device(), sampler, NULL);
5525 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5526 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005527}
5528
Karl Schultz6addd812016-02-02 17:17:23 -07005529TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005530 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07005531 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005532
Karl Schultz6addd812016-02-02 17:17:23 -07005533 m_errorMonitor->SetDesiredFailureMsg(
5534 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005535 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005536
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005537 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005538 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
5539 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005540 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005541 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
5542 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005543
5544 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005545 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5546 ds_pool_ci.pNext = NULL;
5547 ds_pool_ci.maxSets = 1;
5548 ds_pool_ci.poolSizeCount = 1;
5549 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005550
5551 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005552 err =
5553 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005554 ASSERT_VK_SUCCESS(err);
5555
5556 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005557 dsl_binding.binding = 0;
5558 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5559 dsl_binding.descriptorCount = 1;
5560 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5561 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005562
5563 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005564 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5565 ds_layout_ci.pNext = NULL;
5566 ds_layout_ci.bindingCount = 1;
5567 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005568 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005569 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5570 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005571 ASSERT_VK_SUCCESS(err);
5572
5573 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005574 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005575 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005576 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005577 alloc_info.descriptorPool = ds_pool;
5578 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005579 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5580 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005581 ASSERT_VK_SUCCESS(err);
5582
Karl Schultz6addd812016-02-02 17:17:23 -07005583 VkSampler sampler =
5584 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005585
5586 VkDescriptorImageInfo descriptor_info;
5587 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5588 descriptor_info.sampler = sampler;
5589
5590 VkWriteDescriptorSet descriptor_write;
5591 memset(&descriptor_write, 0, sizeof(descriptor_write));
5592 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005593 descriptor_write.dstSet = descriptorSet;
5594 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005595 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005596 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5597 descriptor_write.pImageInfo = &descriptor_info;
5598
5599 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5600
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005601 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005602
Chia-I Wuf7458c52015-10-26 21:10:41 +08005603 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5604 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005605}
5606
Karl Schultz6addd812016-02-02 17:17:23 -07005607TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
5608 // Create a single combined Image/Sampler descriptor and send it an invalid
5609 // imageView
5610 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005611
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005612 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5613 "Attempted write update to combined "
5614 "image sampler descriptor failed due "
5615 "to: Invalid VkImageView: 0xbaadbeef");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005616
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005617 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005618 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005619 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5620 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005621
5622 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005623 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5624 ds_pool_ci.pNext = NULL;
5625 ds_pool_ci.maxSets = 1;
5626 ds_pool_ci.poolSizeCount = 1;
5627 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005628
5629 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005630 err =
5631 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005632 ASSERT_VK_SUCCESS(err);
5633
5634 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005635 dsl_binding.binding = 0;
5636 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5637 dsl_binding.descriptorCount = 1;
5638 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5639 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005640
5641 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005642 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5643 ds_layout_ci.pNext = NULL;
5644 ds_layout_ci.bindingCount = 1;
5645 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005646 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005647 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5648 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005649 ASSERT_VK_SUCCESS(err);
5650
5651 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005652 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005653 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005654 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005655 alloc_info.descriptorPool = ds_pool;
5656 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005657 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5658 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005659 ASSERT_VK_SUCCESS(err);
5660
5661 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005662 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5663 sampler_ci.pNext = NULL;
5664 sampler_ci.magFilter = VK_FILTER_NEAREST;
5665 sampler_ci.minFilter = VK_FILTER_NEAREST;
5666 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5667 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5668 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5669 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5670 sampler_ci.mipLodBias = 1.0;
5671 sampler_ci.anisotropyEnable = VK_FALSE;
5672 sampler_ci.maxAnisotropy = 1;
5673 sampler_ci.compareEnable = VK_FALSE;
5674 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5675 sampler_ci.minLod = 1.0;
5676 sampler_ci.maxLod = 1.0;
5677 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5678 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005679
5680 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005681 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005682 ASSERT_VK_SUCCESS(err);
5683
Karl Schultz6addd812016-02-02 17:17:23 -07005684 VkImageView view =
5685 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005686
5687 VkDescriptorImageInfo descriptor_info;
5688 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5689 descriptor_info.sampler = sampler;
5690 descriptor_info.imageView = view;
5691
5692 VkWriteDescriptorSet descriptor_write;
5693 memset(&descriptor_write, 0, sizeof(descriptor_write));
5694 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005695 descriptor_write.dstSet = descriptorSet;
5696 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005697 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005698 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5699 descriptor_write.pImageInfo = &descriptor_info;
5700
5701 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5702
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005703 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005704
Chia-I Wuf7458c52015-10-26 21:10:41 +08005705 vkDestroySampler(m_device->device(), sampler, NULL);
5706 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5707 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005708}
5709
Karl Schultz6addd812016-02-02 17:17:23 -07005710TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
5711 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
5712 // into the other
5713 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005714
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5716 " binding #1 with type "
5717 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
5718 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005719
Tobin Ehlis04356f92015-10-27 16:35:27 -06005720 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005721 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005722 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005723 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5724 ds_type_count[0].descriptorCount = 1;
5725 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
5726 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005727
5728 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005729 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5730 ds_pool_ci.pNext = NULL;
5731 ds_pool_ci.maxSets = 1;
5732 ds_pool_ci.poolSizeCount = 2;
5733 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005734
5735 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005736 err =
5737 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005738 ASSERT_VK_SUCCESS(err);
5739 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005740 dsl_binding[0].binding = 0;
5741 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5742 dsl_binding[0].descriptorCount = 1;
5743 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
5744 dsl_binding[0].pImmutableSamplers = NULL;
5745 dsl_binding[1].binding = 1;
5746 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5747 dsl_binding[1].descriptorCount = 1;
5748 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
5749 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005750
5751 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005752 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5753 ds_layout_ci.pNext = NULL;
5754 ds_layout_ci.bindingCount = 2;
5755 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005756
5757 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005758 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5759 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005760 ASSERT_VK_SUCCESS(err);
5761
5762 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005763 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005764 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005765 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005766 alloc_info.descriptorPool = ds_pool;
5767 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005768 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5769 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005770 ASSERT_VK_SUCCESS(err);
5771
5772 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005773 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5774 sampler_ci.pNext = NULL;
5775 sampler_ci.magFilter = VK_FILTER_NEAREST;
5776 sampler_ci.minFilter = VK_FILTER_NEAREST;
5777 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5778 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5779 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5780 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5781 sampler_ci.mipLodBias = 1.0;
5782 sampler_ci.anisotropyEnable = VK_FALSE;
5783 sampler_ci.maxAnisotropy = 1;
5784 sampler_ci.compareEnable = VK_FALSE;
5785 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5786 sampler_ci.minLod = 1.0;
5787 sampler_ci.maxLod = 1.0;
5788 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5789 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005790
5791 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005792 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005793 ASSERT_VK_SUCCESS(err);
5794
5795 VkDescriptorImageInfo info = {};
5796 info.sampler = sampler;
5797
5798 VkWriteDescriptorSet descriptor_write;
5799 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
5800 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005801 descriptor_write.dstSet = descriptorSet;
5802 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08005803 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005804 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5805 descriptor_write.pImageInfo = &info;
5806 // This write update should succeed
5807 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5808 // Now perform a copy update that fails due to type mismatch
5809 VkCopyDescriptorSet copy_ds_update;
5810 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5811 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5812 copy_ds_update.srcSet = descriptorSet;
5813 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005814 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005815 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08005816 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005817 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5818
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005819 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005820 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005821 m_errorMonitor->SetDesiredFailureMsg(
5822 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005823 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06005824 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5825 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5826 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005827 copy_ds_update.srcBinding =
5828 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005829 copy_ds_update.dstSet = descriptorSet;
5830 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005831 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005832 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5833
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005834 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005835
Tobin Ehlis04356f92015-10-27 16:35:27 -06005836 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005837 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005838 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
5839 "update array offset of 0 and update of "
5840 "5 descriptors oversteps total number "
5841 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005842
Tobin Ehlis04356f92015-10-27 16:35:27 -06005843 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5844 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5845 copy_ds_update.srcSet = descriptorSet;
5846 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005847 copy_ds_update.dstSet = descriptorSet;
5848 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005849 copy_ds_update.descriptorCount =
5850 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06005851 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5852
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005853 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005854
Chia-I Wuf7458c52015-10-26 21:10:41 +08005855 vkDestroySampler(m_device->device(), sampler, NULL);
5856 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5857 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005858}
5859
Karl Schultz6addd812016-02-02 17:17:23 -07005860TEST_F(VkLayerTest, NumSamplesMismatch) {
5861 // Create CommandBuffer where MSAA samples doesn't match RenderPass
5862 // sampleCount
5863 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005864
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005866 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005867
Tobin Ehlis3b780662015-05-28 12:11:26 -06005868 ASSERT_NO_FATAL_FAILURE(InitState());
5869 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005870 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06005871 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005872 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005873
5874 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005875 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5876 ds_pool_ci.pNext = NULL;
5877 ds_pool_ci.maxSets = 1;
5878 ds_pool_ci.poolSizeCount = 1;
5879 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005880
Tobin Ehlis3b780662015-05-28 12:11:26 -06005881 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005882 err =
5883 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005884 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005885
Tony Barboureb254902015-07-15 12:50:33 -06005886 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08005887 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06005888 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08005889 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005890 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5891 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005892
Tony Barboureb254902015-07-15 12:50:33 -06005893 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5894 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5895 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005896 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07005897 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005898
Tobin Ehlis3b780662015-05-28 12:11:26 -06005899 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005900 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5901 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005902 ASSERT_VK_SUCCESS(err);
5903
5904 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005905 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005906 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005907 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005908 alloc_info.descriptorPool = ds_pool;
5909 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005910 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5911 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005912 ASSERT_VK_SUCCESS(err);
5913
Tony Barboureb254902015-07-15 12:50:33 -06005914 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005915 pipe_ms_state_ci.sType =
5916 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5917 pipe_ms_state_ci.pNext = NULL;
5918 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5919 pipe_ms_state_ci.sampleShadingEnable = 0;
5920 pipe_ms_state_ci.minSampleShading = 1.0;
5921 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005922
Tony Barboureb254902015-07-15 12:50:33 -06005923 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005924 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5925 pipeline_layout_ci.pNext = NULL;
5926 pipeline_layout_ci.setLayoutCount = 1;
5927 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005928
5929 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005930 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5931 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005932 ASSERT_VK_SUCCESS(err);
5933
Karl Schultz6addd812016-02-02 17:17:23 -07005934 VkShaderObj vs(m_device, bindStateVertShaderText,
5935 VK_SHADER_STAGE_VERTEX_BIT, this);
5936 VkShaderObj fs(m_device, bindStateFragShaderText,
5937 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005938 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005939 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005940 VkPipelineObj pipe(m_device);
5941 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005942 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005943 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005944 pipe.SetMSAA(&pipe_ms_state_ci);
5945 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005946
Tony Barbourfe3351b2015-07-28 10:17:20 -06005947 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005948 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5949 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005950
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005951 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005952
Chia-I Wuf7458c52015-10-26 21:10:41 +08005953 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5954 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5955 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005956}
Tobin Ehlis0f10db52016-04-04 10:00:21 -06005957#ifdef ADD_BACK_IN_WHEN_CHECK_IS_BACK // TODO : Re-enable when GH256 fixed
Mark Youngc89c6312016-03-31 16:03:20 -06005958TEST_F(VkLayerTest, NumBlendAttachMismatch) {
5959 // Create Pipeline where the number of blend attachments doesn't match the
5960 // number of color attachments. In this case, we don't add any color
5961 // blend attachments even though we have a color attachment.
5962 VkResult err;
5963
5964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5965 "Mismatch between blend state attachment");
5966
5967 ASSERT_NO_FATAL_FAILURE(InitState());
5968 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5969 VkDescriptorPoolSize ds_type_count = {};
5970 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5971 ds_type_count.descriptorCount = 1;
5972
5973 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5974 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5975 ds_pool_ci.pNext = NULL;
5976 ds_pool_ci.maxSets = 1;
5977 ds_pool_ci.poolSizeCount = 1;
5978 ds_pool_ci.pPoolSizes = &ds_type_count;
5979
5980 VkDescriptorPool ds_pool;
5981 err =
5982 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5983 ASSERT_VK_SUCCESS(err);
5984
5985 VkDescriptorSetLayoutBinding dsl_binding = {};
5986 dsl_binding.binding = 0;
5987 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5988 dsl_binding.descriptorCount = 1;
5989 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5990 dsl_binding.pImmutableSamplers = NULL;
5991
5992 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5993 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5994 ds_layout_ci.pNext = NULL;
5995 ds_layout_ci.bindingCount = 1;
5996 ds_layout_ci.pBindings = &dsl_binding;
5997
5998 VkDescriptorSetLayout ds_layout;
5999 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6000 &ds_layout);
6001 ASSERT_VK_SUCCESS(err);
6002
6003 VkDescriptorSet descriptorSet;
6004 VkDescriptorSetAllocateInfo alloc_info = {};
6005 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6006 alloc_info.descriptorSetCount = 1;
6007 alloc_info.descriptorPool = ds_pool;
6008 alloc_info.pSetLayouts = &ds_layout;
6009 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6010 &descriptorSet);
6011 ASSERT_VK_SUCCESS(err);
6012
6013 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
6014 pipe_ms_state_ci.sType =
6015 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6016 pipe_ms_state_ci.pNext = NULL;
6017 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6018 pipe_ms_state_ci.sampleShadingEnable = 0;
6019 pipe_ms_state_ci.minSampleShading = 1.0;
6020 pipe_ms_state_ci.pSampleMask = NULL;
6021
6022 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6023 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6024 pipeline_layout_ci.pNext = NULL;
6025 pipeline_layout_ci.setLayoutCount = 1;
6026 pipeline_layout_ci.pSetLayouts = &ds_layout;
6027
6028 VkPipelineLayout pipeline_layout;
6029 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6030 &pipeline_layout);
6031 ASSERT_VK_SUCCESS(err);
6032
6033 VkShaderObj vs(m_device, bindStateVertShaderText,
6034 VK_SHADER_STAGE_VERTEX_BIT, this);
6035 VkShaderObj fs(m_device, bindStateFragShaderText,
6036 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006037 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06006038 // but add it to be able to run on more devices
6039 VkPipelineObj pipe(m_device);
6040 pipe.AddShader(&vs);
6041 pipe.AddShader(&fs);
6042 pipe.SetMSAA(&pipe_ms_state_ci);
6043 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6044
6045 BeginCommandBuffer();
6046 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6047 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6048
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006049 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06006050
6051 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6052 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6053 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6054}
Tony Barbour4e81a202016-04-04 11:09:40 -06006055#endif //ADD_BACK_IN_WHEN_CHECK_IS_BACK
Karl Schultz6addd812016-02-02 17:17:23 -07006056TEST_F(VkLayerTest, ClearCmdNoDraw) {
6057 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
6058 // to issuing a Draw
6059 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006060
Karl Schultz6addd812016-02-02 17:17:23 -07006061 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07006062 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006063 "vkCmdClearAttachments() issued on CB object ");
6064
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006065 ASSERT_NO_FATAL_FAILURE(InitState());
6066 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006067
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006068 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006069 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6070 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006071
6072 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006073 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6074 ds_pool_ci.pNext = NULL;
6075 ds_pool_ci.maxSets = 1;
6076 ds_pool_ci.poolSizeCount = 1;
6077 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006078
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006079 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006080 err =
6081 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006082 ASSERT_VK_SUCCESS(err);
6083
Tony Barboureb254902015-07-15 12:50:33 -06006084 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006085 dsl_binding.binding = 0;
6086 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6087 dsl_binding.descriptorCount = 1;
6088 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6089 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006090
Tony Barboureb254902015-07-15 12:50:33 -06006091 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006092 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6093 ds_layout_ci.pNext = NULL;
6094 ds_layout_ci.bindingCount = 1;
6095 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006096
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006097 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006098 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6099 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006100 ASSERT_VK_SUCCESS(err);
6101
6102 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006103 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006104 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006105 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006106 alloc_info.descriptorPool = ds_pool;
6107 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006108 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6109 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006110 ASSERT_VK_SUCCESS(err);
6111
Tony Barboureb254902015-07-15 12:50:33 -06006112 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006113 pipe_ms_state_ci.sType =
6114 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6115 pipe_ms_state_ci.pNext = NULL;
6116 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6117 pipe_ms_state_ci.sampleShadingEnable = 0;
6118 pipe_ms_state_ci.minSampleShading = 1.0;
6119 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006120
Tony Barboureb254902015-07-15 12:50:33 -06006121 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006122 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6123 pipeline_layout_ci.pNext = NULL;
6124 pipeline_layout_ci.setLayoutCount = 1;
6125 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006126
6127 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006128 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6129 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006130 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006131
Karl Schultz6addd812016-02-02 17:17:23 -07006132 VkShaderObj vs(m_device, bindStateVertShaderText,
6133 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006134 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006135 // on more devices
6136 VkShaderObj fs(m_device, bindStateFragShaderText,
6137 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006138
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006139 VkPipelineObj pipe(m_device);
6140 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006141 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006142 pipe.SetMSAA(&pipe_ms_state_ci);
6143 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006144
6145 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006146
Karl Schultz6addd812016-02-02 17:17:23 -07006147 // Main thing we care about for this test is that the VkImage obj we're
6148 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006149 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006150 VkClearAttachment color_attachment;
6151 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6152 color_attachment.clearValue.color.float32[0] = 1.0;
6153 color_attachment.clearValue.color.float32[1] = 1.0;
6154 color_attachment.clearValue.color.float32[2] = 1.0;
6155 color_attachment.clearValue.color.float32[3] = 1.0;
6156 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006157 VkClearRect clear_rect = {
6158 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006159
Karl Schultz6addd812016-02-02 17:17:23 -07006160 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
6161 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006162
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006163 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006164
Chia-I Wuf7458c52015-10-26 21:10:41 +08006165 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6166 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6167 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006168}
6169
Karl Schultz6addd812016-02-02 17:17:23 -07006170TEST_F(VkLayerTest, VtxBufferBadIndex) {
6171 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006172
Karl Schultz6addd812016-02-02 17:17:23 -07006173 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006174 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07006175 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006176
Tobin Ehlis502480b2015-06-24 15:53:07 -06006177 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06006178 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06006179 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006180
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006181 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006182 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6183 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006184
6185 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006186 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6187 ds_pool_ci.pNext = NULL;
6188 ds_pool_ci.maxSets = 1;
6189 ds_pool_ci.poolSizeCount = 1;
6190 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006191
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006192 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006193 err =
6194 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006195 ASSERT_VK_SUCCESS(err);
6196
Tony Barboureb254902015-07-15 12:50:33 -06006197 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006198 dsl_binding.binding = 0;
6199 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6200 dsl_binding.descriptorCount = 1;
6201 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6202 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006203
Tony Barboureb254902015-07-15 12:50:33 -06006204 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006205 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6206 ds_layout_ci.pNext = NULL;
6207 ds_layout_ci.bindingCount = 1;
6208 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006209
Tobin Ehlis502480b2015-06-24 15:53:07 -06006210 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006211 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6212 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006213 ASSERT_VK_SUCCESS(err);
6214
6215 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006216 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006217 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006218 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006219 alloc_info.descriptorPool = ds_pool;
6220 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006221 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6222 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006223 ASSERT_VK_SUCCESS(err);
6224
Tony Barboureb254902015-07-15 12:50:33 -06006225 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006226 pipe_ms_state_ci.sType =
6227 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6228 pipe_ms_state_ci.pNext = NULL;
6229 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6230 pipe_ms_state_ci.sampleShadingEnable = 0;
6231 pipe_ms_state_ci.minSampleShading = 1.0;
6232 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006233
Tony Barboureb254902015-07-15 12:50:33 -06006234 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006235 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6236 pipeline_layout_ci.pNext = NULL;
6237 pipeline_layout_ci.setLayoutCount = 1;
6238 pipeline_layout_ci.pSetLayouts = &ds_layout;
6239 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006240
Karl Schultz6addd812016-02-02 17:17:23 -07006241 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6242 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006243 ASSERT_VK_SUCCESS(err);
6244
Karl Schultz6addd812016-02-02 17:17:23 -07006245 VkShaderObj vs(m_device, bindStateVertShaderText,
6246 VK_SHADER_STAGE_VERTEX_BIT, this);
6247 VkShaderObj fs(m_device, bindStateFragShaderText,
6248 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006249 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006250 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006251 VkPipelineObj pipe(m_device);
6252 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006253 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006254 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006255 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006256 pipe.SetViewport(m_viewports);
6257 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006258 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006259
6260 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006261 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6262 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006263 // Don't care about actual data, just need to get to draw to flag error
6264 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07006265 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
6266 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006267 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06006268 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006269
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006270 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006271
Chia-I Wuf7458c52015-10-26 21:10:41 +08006272 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6273 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6274 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006275}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006276#endif // DRAW_STATE_TESTS
6277
Tobin Ehlis0788f522015-05-26 16:11:58 -06006278#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06006279#if GTEST_IS_THREADSAFE
6280struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006281 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006282 VkEvent event;
6283 bool bailout;
6284};
6285
Karl Schultz6addd812016-02-02 17:17:23 -07006286extern "C" void *AddToCommandBuffer(void *arg) {
6287 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006288
Karl Schultz6addd812016-02-02 17:17:23 -07006289 for (int i = 0; i < 10000; i++) {
6290 vkCmdSetEvent(data->commandBuffer, data->event,
6291 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006292 if (data->bailout) {
6293 break;
6294 }
6295 }
6296 return NULL;
6297}
6298
Karl Schultz6addd812016-02-02 17:17:23 -07006299TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006300 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006301
Karl Schultz6addd812016-02-02 17:17:23 -07006302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6303 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006304
Mike Stroyanaccf7692015-05-12 16:00:45 -06006305 ASSERT_NO_FATAL_FAILURE(InitState());
6306 ASSERT_NO_FATAL_FAILURE(InitViewport());
6307 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6308
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006309 // Calls AllocateCommandBuffers
6310 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006311
6312 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006313 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006314
6315 VkEventCreateInfo event_info;
6316 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006317 VkResult err;
6318
6319 memset(&event_info, 0, sizeof(event_info));
6320 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6321
Chia-I Wuf7458c52015-10-26 21:10:41 +08006322 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006323 ASSERT_VK_SUCCESS(err);
6324
Mike Stroyanaccf7692015-05-12 16:00:45 -06006325 err = vkResetEvent(device(), event);
6326 ASSERT_VK_SUCCESS(err);
6327
6328 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006329 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006330 data.event = event;
6331 data.bailout = false;
6332 m_errorMonitor->SetBailout(&data.bailout);
6333 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006334 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006335 // Add many entries to command buffer from this thread at the same time.
6336 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006337
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006338 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006339 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006340
Mike Stroyan10b8cb72016-01-22 15:22:03 -07006341 m_errorMonitor->SetBailout(NULL);
6342
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006343 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006344
Chia-I Wuf7458c52015-10-26 21:10:41 +08006345 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006346}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006347#endif // GTEST_IS_THREADSAFE
6348#endif // THREADING_TESTS
6349
Chris Forbes9f7ff632015-05-25 11:13:08 +12006350#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006351TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006352 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006353 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006354
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006355 ASSERT_NO_FATAL_FAILURE(InitState());
6356 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6357
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006358 VkShaderModule module;
6359 VkShaderModuleCreateInfo moduleCreateInfo;
6360 struct icd_spv_header spv;
6361
6362 spv.magic = ICD_SPV_MAGIC;
6363 spv.version = ICD_SPV_VERSION;
6364 spv.gen_magic = 0;
6365
6366 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6367 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006368 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006369 moduleCreateInfo.codeSize = 4;
6370 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006371 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006372
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006373 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006374}
6375
Karl Schultz6addd812016-02-02 17:17:23 -07006376TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006377 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006378 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006379
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006380 ASSERT_NO_FATAL_FAILURE(InitState());
6381 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6382
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006383 VkShaderModule module;
6384 VkShaderModuleCreateInfo moduleCreateInfo;
6385 struct icd_spv_header spv;
6386
6387 spv.magic = ~ICD_SPV_MAGIC;
6388 spv.version = ICD_SPV_VERSION;
6389 spv.gen_magic = 0;
6390
6391 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6392 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006393 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006394 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6395 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006396 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006397
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006398 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006399}
6400
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006401#if 0
6402// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07006403TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006405 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006406
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006407 ASSERT_NO_FATAL_FAILURE(InitState());
6408 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6409
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006410 VkShaderModule module;
6411 VkShaderModuleCreateInfo moduleCreateInfo;
6412 struct icd_spv_header spv;
6413
6414 spv.magic = ICD_SPV_MAGIC;
6415 spv.version = ~ICD_SPV_VERSION;
6416 spv.gen_magic = 0;
6417
6418 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6419 moduleCreateInfo.pNext = NULL;
6420
Karl Schultz6addd812016-02-02 17:17:23 -07006421 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006422 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6423 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006424 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006425
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006426 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006427}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006428#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006429
Karl Schultz6addd812016-02-02 17:17:23 -07006430TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006431 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006432 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006433
Chris Forbes9f7ff632015-05-25 11:13:08 +12006434 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006435 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006436
6437 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006438 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006439 "\n"
6440 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006441 "out gl_PerVertex {\n"
6442 " vec4 gl_Position;\n"
6443 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006444 "void main(){\n"
6445 " gl_Position = vec4(1);\n"
6446 " x = 0;\n"
6447 "}\n";
6448 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006449 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006450 "\n"
6451 "layout(location=0) out vec4 color;\n"
6452 "void main(){\n"
6453 " color = vec4(1);\n"
6454 "}\n";
6455
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006456 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6457 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006458
6459 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006460 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006461 pipe.AddShader(&vs);
6462 pipe.AddShader(&fs);
6463
Chris Forbes9f7ff632015-05-25 11:13:08 +12006464 VkDescriptorSetObj descriptorSet(m_device);
6465 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006466 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006467
Tony Barbour5781e8f2015-08-04 16:23:11 -06006468 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006469
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006470 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006471}
Chris Forbes9f7ff632015-05-25 11:13:08 +12006472
Karl Schultz6addd812016-02-02 17:17:23 -07006473TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006475 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006476
Chris Forbes59cb88d2015-05-25 11:13:13 +12006477 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006478 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006479
6480 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006481 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006482 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006483 "out gl_PerVertex {\n"
6484 " vec4 gl_Position;\n"
6485 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006486 "void main(){\n"
6487 " gl_Position = vec4(1);\n"
6488 "}\n";
6489 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006490 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006491 "\n"
6492 "layout(location=0) in float x;\n"
6493 "layout(location=0) out vec4 color;\n"
6494 "void main(){\n"
6495 " color = vec4(x);\n"
6496 "}\n";
6497
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006498 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6499 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006500
6501 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006502 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006503 pipe.AddShader(&vs);
6504 pipe.AddShader(&fs);
6505
Chris Forbes59cb88d2015-05-25 11:13:13 +12006506 VkDescriptorSetObj descriptorSet(m_device);
6507 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006508 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006509
Tony Barbour5781e8f2015-08-04 16:23:11 -06006510 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006511
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006512 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006513}
6514
Karl Schultz6addd812016-02-02 17:17:23 -07006515TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006516 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006517 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006518
6519 ASSERT_NO_FATAL_FAILURE(InitState());
6520 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6521
6522 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006523 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006524 "\n"
6525 "out gl_PerVertex {\n"
6526 " vec4 gl_Position;\n"
6527 "};\n"
6528 "void main(){\n"
6529 " gl_Position = vec4(1);\n"
6530 "}\n";
6531 char const *fsSource =
6532 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006533 "\n"
6534 "in block { layout(location=0) float x; } ins;\n"
6535 "layout(location=0) out vec4 color;\n"
6536 "void main(){\n"
6537 " color = vec4(ins.x);\n"
6538 "}\n";
6539
6540 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6541 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6542
6543 VkPipelineObj pipe(m_device);
6544 pipe.AddColorAttachment();
6545 pipe.AddShader(&vs);
6546 pipe.AddShader(&fs);
6547
6548 VkDescriptorSetObj descriptorSet(m_device);
6549 descriptorSet.AppendDummy();
6550 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6551
6552 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6553
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006554 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006555}
6556
Karl Schultz6addd812016-02-02 17:17:23 -07006557TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13006558 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13006559 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07006560 "output arr[2] of float32' vs 'ptr to "
6561 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13006562
6563 ASSERT_NO_FATAL_FAILURE(InitState());
6564 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6565
6566 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006567 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006568 "\n"
6569 "layout(location=0) out float x[2];\n"
6570 "out gl_PerVertex {\n"
6571 " vec4 gl_Position;\n"
6572 "};\n"
6573 "void main(){\n"
6574 " x[0] = 0; x[1] = 0;\n"
6575 " gl_Position = vec4(1);\n"
6576 "}\n";
6577 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006578 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006579 "\n"
6580 "layout(location=0) in float x[3];\n"
6581 "layout(location=0) out vec4 color;\n"
6582 "void main(){\n"
6583 " color = vec4(x[0] + x[1] + x[2]);\n"
6584 "}\n";
6585
6586 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6587 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6588
6589 VkPipelineObj pipe(m_device);
6590 pipe.AddColorAttachment();
6591 pipe.AddShader(&vs);
6592 pipe.AddShader(&fs);
6593
6594 VkDescriptorSetObj descriptorSet(m_device);
6595 descriptorSet.AppendDummy();
6596 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6597
6598 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6599
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006600 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13006601}
6602
Karl Schultz6addd812016-02-02 17:17:23 -07006603TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006605 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006606
Chris Forbesb56af562015-05-25 11:13:17 +12006607 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006608 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12006609
6610 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006611 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006612 "\n"
6613 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006614 "out gl_PerVertex {\n"
6615 " vec4 gl_Position;\n"
6616 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006617 "void main(){\n"
6618 " x = 0;\n"
6619 " gl_Position = vec4(1);\n"
6620 "}\n";
6621 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006622 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006623 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006624 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12006625 "layout(location=0) out vec4 color;\n"
6626 "void main(){\n"
6627 " color = vec4(x);\n"
6628 "}\n";
6629
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006630 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6631 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12006632
6633 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006634 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12006635 pipe.AddShader(&vs);
6636 pipe.AddShader(&fs);
6637
Chris Forbesb56af562015-05-25 11:13:17 +12006638 VkDescriptorSetObj descriptorSet(m_device);
6639 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006640 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12006641
Tony Barbour5781e8f2015-08-04 16:23:11 -06006642 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12006643
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006644 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12006645}
6646
Karl Schultz6addd812016-02-02 17:17:23 -07006647TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006649 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006650
6651 ASSERT_NO_FATAL_FAILURE(InitState());
6652 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6653
6654 char const *vsSource =
6655 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006656 "\n"
6657 "out block { layout(location=0) int x; } outs;\n"
6658 "out gl_PerVertex {\n"
6659 " vec4 gl_Position;\n"
6660 "};\n"
6661 "void main(){\n"
6662 " outs.x = 0;\n"
6663 " gl_Position = vec4(1);\n"
6664 "}\n";
6665 char const *fsSource =
6666 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006667 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006668 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13006669 "layout(location=0) out vec4 color;\n"
6670 "void main(){\n"
6671 " color = vec4(ins.x);\n"
6672 "}\n";
6673
6674 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6675 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6676
6677 VkPipelineObj pipe(m_device);
6678 pipe.AddColorAttachment();
6679 pipe.AddShader(&vs);
6680 pipe.AddShader(&fs);
6681
6682 VkDescriptorSetObj descriptorSet(m_device);
6683 descriptorSet.AppendDummy();
6684 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6685
6686 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6687
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006688 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006689}
6690
6691TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
6692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6693 "location 0.0 which is not written by vertex shader");
6694
6695 ASSERT_NO_FATAL_FAILURE(InitState());
6696 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6697
6698 char const *vsSource =
6699 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006700 "\n"
6701 "out block { layout(location=1) float x; } outs;\n"
6702 "out gl_PerVertex {\n"
6703 " vec4 gl_Position;\n"
6704 "};\n"
6705 "void main(){\n"
6706 " outs.x = 0;\n"
6707 " gl_Position = vec4(1);\n"
6708 "}\n";
6709 char const *fsSource =
6710 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006711 "\n"
6712 "in block { layout(location=0) float x; } ins;\n"
6713 "layout(location=0) out vec4 color;\n"
6714 "void main(){\n"
6715 " color = vec4(ins.x);\n"
6716 "}\n";
6717
6718 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6719 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6720
6721 VkPipelineObj pipe(m_device);
6722 pipe.AddColorAttachment();
6723 pipe.AddShader(&vs);
6724 pipe.AddShader(&fs);
6725
6726 VkDescriptorSetObj descriptorSet(m_device);
6727 descriptorSet.AppendDummy();
6728 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6729
6730 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6731
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006732 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006733}
6734
6735TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
6736 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6737 "location 0.1 which is not written by vertex shader");
6738
6739 ASSERT_NO_FATAL_FAILURE(InitState());
6740 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6741
6742 char const *vsSource =
6743 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006744 "\n"
6745 "out block { layout(location=0, component=0) float x; } outs;\n"
6746 "out gl_PerVertex {\n"
6747 " vec4 gl_Position;\n"
6748 "};\n"
6749 "void main(){\n"
6750 " outs.x = 0;\n"
6751 " gl_Position = vec4(1);\n"
6752 "}\n";
6753 char const *fsSource =
6754 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006755 "\n"
6756 "in block { layout(location=0, component=1) float x; } ins;\n"
6757 "layout(location=0) out vec4 color;\n"
6758 "void main(){\n"
6759 " color = vec4(ins.x);\n"
6760 "}\n";
6761
6762 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6763 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6764
6765 VkPipelineObj pipe(m_device);
6766 pipe.AddColorAttachment();
6767 pipe.AddShader(&vs);
6768 pipe.AddShader(&fs);
6769
6770 VkDescriptorSetObj descriptorSet(m_device);
6771 descriptorSet.AppendDummy();
6772 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6773
6774 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6775
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006776 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006777}
6778
Karl Schultz6addd812016-02-02 17:17:23 -07006779TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006780 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006781 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006782
Chris Forbesde136e02015-05-25 11:13:28 +12006783 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006784 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12006785
6786 VkVertexInputBindingDescription input_binding;
6787 memset(&input_binding, 0, sizeof(input_binding));
6788
6789 VkVertexInputAttributeDescription input_attrib;
6790 memset(&input_attrib, 0, sizeof(input_attrib));
6791 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6792
6793 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006794 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006795 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006796 "out gl_PerVertex {\n"
6797 " vec4 gl_Position;\n"
6798 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006799 "void main(){\n"
6800 " gl_Position = vec4(1);\n"
6801 "}\n";
6802 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006803 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006804 "\n"
6805 "layout(location=0) out vec4 color;\n"
6806 "void main(){\n"
6807 " color = vec4(1);\n"
6808 "}\n";
6809
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006810 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6811 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12006812
6813 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006814 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12006815 pipe.AddShader(&vs);
6816 pipe.AddShader(&fs);
6817
6818 pipe.AddVertexInputBindings(&input_binding, 1);
6819 pipe.AddVertexInputAttribs(&input_attrib, 1);
6820
Chris Forbesde136e02015-05-25 11:13:28 +12006821 VkDescriptorSetObj descriptorSet(m_device);
6822 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006823 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12006824
Tony Barbour5781e8f2015-08-04 16:23:11 -06006825 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12006826
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006827 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12006828}
6829
Karl Schultz6addd812016-02-02 17:17:23 -07006830TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006831 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006832 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13006833
6834 ASSERT_NO_FATAL_FAILURE(InitState());
6835 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6836
6837 VkVertexInputBindingDescription input_binding;
6838 memset(&input_binding, 0, sizeof(input_binding));
6839
6840 VkVertexInputAttributeDescription input_attrib;
6841 memset(&input_attrib, 0, sizeof(input_attrib));
6842 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6843
6844 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006845 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006846 "\n"
6847 "layout(location=1) in float x;\n"
6848 "out gl_PerVertex {\n"
6849 " vec4 gl_Position;\n"
6850 "};\n"
6851 "void main(){\n"
6852 " gl_Position = vec4(x);\n"
6853 "}\n";
6854 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006855 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006856 "\n"
6857 "layout(location=0) out vec4 color;\n"
6858 "void main(){\n"
6859 " color = vec4(1);\n"
6860 "}\n";
6861
6862 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6863 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6864
6865 VkPipelineObj pipe(m_device);
6866 pipe.AddColorAttachment();
6867 pipe.AddShader(&vs);
6868 pipe.AddShader(&fs);
6869
6870 pipe.AddVertexInputBindings(&input_binding, 1);
6871 pipe.AddVertexInputAttribs(&input_attrib, 1);
6872
6873 VkDescriptorSetObj descriptorSet(m_device);
6874 descriptorSet.AppendDummy();
6875 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6876
6877 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6878
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006879 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13006880}
6881
Karl Schultz6addd812016-02-02 17:17:23 -07006882TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
6883 m_errorMonitor->SetDesiredFailureMsg(
6884 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006885 "VS consumes input at location 0 but not provided");
6886
Chris Forbes62e8e502015-05-25 11:13:29 +12006887 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006888 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12006889
6890 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006891 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006892 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006893 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07006894 "out gl_PerVertex {\n"
6895 " vec4 gl_Position;\n"
6896 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006897 "void main(){\n"
6898 " gl_Position = x;\n"
6899 "}\n";
6900 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006901 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006902 "\n"
6903 "layout(location=0) out vec4 color;\n"
6904 "void main(){\n"
6905 " color = vec4(1);\n"
6906 "}\n";
6907
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006908 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6909 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12006910
6911 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006912 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12006913 pipe.AddShader(&vs);
6914 pipe.AddShader(&fs);
6915
Chris Forbes62e8e502015-05-25 11:13:29 +12006916 VkDescriptorSetObj descriptorSet(m_device);
6917 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006918 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12006919
Tony Barbour5781e8f2015-08-04 16:23:11 -06006920 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12006921
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006922 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12006923}
6924
Karl Schultz6addd812016-02-02 17:17:23 -07006925TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
6926 m_errorMonitor->SetDesiredFailureMsg(
6927 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006928 "location 0 does not match VS input type");
6929
Chris Forbesc97d98e2015-05-25 11:13:31 +12006930 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006931 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006932
6933 VkVertexInputBindingDescription input_binding;
6934 memset(&input_binding, 0, sizeof(input_binding));
6935
6936 VkVertexInputAttributeDescription input_attrib;
6937 memset(&input_attrib, 0, sizeof(input_attrib));
6938 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6939
6940 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006941 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006942 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006943 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006944 "out gl_PerVertex {\n"
6945 " vec4 gl_Position;\n"
6946 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006947 "void main(){\n"
6948 " gl_Position = vec4(x);\n"
6949 "}\n";
6950 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006951 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006952 "\n"
6953 "layout(location=0) out vec4 color;\n"
6954 "void main(){\n"
6955 " color = vec4(1);\n"
6956 "}\n";
6957
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006958 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6959 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006960
6961 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006962 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006963 pipe.AddShader(&vs);
6964 pipe.AddShader(&fs);
6965
6966 pipe.AddVertexInputBindings(&input_binding, 1);
6967 pipe.AddVertexInputAttribs(&input_attrib, 1);
6968
Chris Forbesc97d98e2015-05-25 11:13:31 +12006969 VkDescriptorSetObj descriptorSet(m_device);
6970 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006971 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006972
Tony Barbour5781e8f2015-08-04 16:23:11 -06006973 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006974
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006975 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006976}
6977
Chris Forbesc68b43c2016-04-06 11:18:47 +12006978TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
6979 m_errorMonitor->SetDesiredFailureMsg(
6980 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6981 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
6982
6983 ASSERT_NO_FATAL_FAILURE(InitState());
6984 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6985
6986 char const *vsSource =
6987 "#version 450\n"
6988 "\n"
6989 "out gl_PerVertex {\n"
6990 " vec4 gl_Position;\n"
6991 "};\n"
6992 "void main(){\n"
6993 " gl_Position = vec4(1);\n"
6994 "}\n";
6995 char const *fsSource =
6996 "#version 450\n"
6997 "\n"
6998 "layout(location=0) out vec4 color;\n"
6999 "void main(){\n"
7000 " color = vec4(1);\n"
7001 "}\n";
7002
7003 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7004 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7005
7006 VkPipelineObj pipe(m_device);
7007 pipe.AddColorAttachment();
7008 pipe.AddShader(&vs);
7009 pipe.AddShader(&vs);
7010 pipe.AddShader(&fs);
7011
7012 VkDescriptorSetObj descriptorSet(m_device);
7013 descriptorSet.AppendDummy();
7014 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7015
7016 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7017
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007018 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12007019}
7020
Karl Schultz6addd812016-02-02 17:17:23 -07007021TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007022 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007023
7024 ASSERT_NO_FATAL_FAILURE(InitState());
7025 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7026
7027 VkVertexInputBindingDescription input_binding;
7028 memset(&input_binding, 0, sizeof(input_binding));
7029
7030 VkVertexInputAttributeDescription input_attribs[2];
7031 memset(input_attribs, 0, sizeof(input_attribs));
7032
7033 for (int i = 0; i < 2; i++) {
7034 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7035 input_attribs[i].location = i;
7036 }
7037
7038 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007039 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007040 "\n"
7041 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007042 "out gl_PerVertex {\n"
7043 " vec4 gl_Position;\n"
7044 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007045 "void main(){\n"
7046 " gl_Position = x[0] + x[1];\n"
7047 "}\n";
7048 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007049 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007050 "\n"
7051 "layout(location=0) out vec4 color;\n"
7052 "void main(){\n"
7053 " color = vec4(1);\n"
7054 "}\n";
7055
7056 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7057 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7058
7059 VkPipelineObj pipe(m_device);
7060 pipe.AddColorAttachment();
7061 pipe.AddShader(&vs);
7062 pipe.AddShader(&fs);
7063
7064 pipe.AddVertexInputBindings(&input_binding, 1);
7065 pipe.AddVertexInputAttribs(input_attribs, 2);
7066
7067 VkDescriptorSetObj descriptorSet(m_device);
7068 descriptorSet.AppendDummy();
7069 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7070
7071 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7072
7073 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007074 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007075}
7076
Chris Forbes2682b242015-11-24 11:13:14 +13007077TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
7078{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007079 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007080
7081 ASSERT_NO_FATAL_FAILURE(InitState());
7082 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7083
7084 VkVertexInputBindingDescription input_binding;
7085 memset(&input_binding, 0, sizeof(input_binding));
7086
7087 VkVertexInputAttributeDescription input_attribs[2];
7088 memset(input_attribs, 0, sizeof(input_attribs));
7089
7090 for (int i = 0; i < 2; i++) {
7091 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7092 input_attribs[i].location = i;
7093 }
7094
7095 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007096 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007097 "\n"
7098 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07007099 "out gl_PerVertex {\n"
7100 " vec4 gl_Position;\n"
7101 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007102 "void main(){\n"
7103 " gl_Position = x[0] + x[1];\n"
7104 "}\n";
7105 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007106 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007107 "\n"
7108 "layout(location=0) out vec4 color;\n"
7109 "void main(){\n"
7110 " color = vec4(1);\n"
7111 "}\n";
7112
7113 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7114 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7115
7116 VkPipelineObj pipe(m_device);
7117 pipe.AddColorAttachment();
7118 pipe.AddShader(&vs);
7119 pipe.AddShader(&fs);
7120
7121 pipe.AddVertexInputBindings(&input_binding, 1);
7122 pipe.AddVertexInputAttribs(input_attribs, 2);
7123
7124 VkDescriptorSetObj descriptorSet(m_device);
7125 descriptorSet.AppendDummy();
7126 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7127
7128 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7129
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007130 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007131}
Chris Forbes2682b242015-11-24 11:13:14 +13007132
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007133TEST_F(VkLayerTest, CreatePipelineSimplePositive)
7134{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007135 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007136
7137 ASSERT_NO_FATAL_FAILURE(InitState());
7138 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7139
7140 char const *vsSource =
7141 "#version 450\n"
7142 "out gl_PerVertex {\n"
7143 " vec4 gl_Position;\n"
7144 "};\n"
7145 "void main(){\n"
7146 " gl_Position = vec4(0);\n"
7147 "}\n";
7148 char const *fsSource =
7149 "#version 450\n"
7150 "\n"
7151 "layout(location=0) out vec4 color;\n"
7152 "void main(){\n"
7153 " color = vec4(1);\n"
7154 "}\n";
7155
7156 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7157 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7158
7159 VkPipelineObj pipe(m_device);
7160 pipe.AddColorAttachment();
7161 pipe.AddShader(&vs);
7162 pipe.AddShader(&fs);
7163
7164 VkDescriptorSetObj descriptorSet(m_device);
7165 descriptorSet.AppendDummy();
7166 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7167
7168 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7169
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007170 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007171}
7172
Chris Forbes912c9192016-04-05 17:50:35 +12007173TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
7174{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007175 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12007176
7177 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
7178
7179 ASSERT_NO_FATAL_FAILURE(InitState());
7180 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7181
7182 char const *vsSource =
7183 "#version 450\n"
7184 "out gl_PerVertex {\n"
7185 " vec4 gl_Position;\n"
7186 "};\n"
7187 "layout(location=0) out vec3 x;\n"
7188 "layout(location=1) out ivec3 y;\n"
7189 "layout(location=2) out vec3 z;\n"
7190 "void main(){\n"
7191 " gl_Position = vec4(0);\n"
7192 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
7193 "}\n";
7194 char const *fsSource =
7195 "#version 450\n"
7196 "\n"
7197 "layout(location=0) out vec4 color;\n"
7198 "layout(location=0) in float x;\n"
7199 "layout(location=1) flat in int y;\n"
7200 "layout(location=2) in vec2 z;\n"
7201 "void main(){\n"
7202 " color = vec4(1 + x + y + z.x);\n"
7203 "}\n";
7204
7205 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7206 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7207
7208 VkPipelineObj pipe(m_device);
7209 pipe.AddColorAttachment();
7210 pipe.AddShader(&vs);
7211 pipe.AddShader(&fs);
7212
7213 VkDescriptorSetObj descriptorSet(m_device);
7214 descriptorSet.AppendDummy();
7215 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7216
7217 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7218
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007219 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12007220}
7221
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007222TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
7223{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007224 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007225
7226 ASSERT_NO_FATAL_FAILURE(InitState());
7227 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7228
Chris Forbesc1e852d2016-04-04 19:26:42 +12007229 if (!m_device->phy().features().tessellationShader) {
7230 printf("Device does not support tessellation shaders; skipped.\n");
7231 return;
7232 }
7233
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007234 char const *vsSource =
7235 "#version 450\n"
7236 "void main(){}\n";
7237 char const *tcsSource =
7238 "#version 450\n"
7239 "layout(location=0) out int x[];\n"
7240 "layout(vertices=3) out;\n"
7241 "void main(){\n"
7242 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7243 " gl_TessLevelInner[0] = 1;\n"
7244 " x[gl_InvocationID] = gl_InvocationID;\n"
7245 "}\n";
7246 char const *tesSource =
7247 "#version 450\n"
7248 "layout(triangles, equal_spacing, cw) in;\n"
7249 "layout(location=0) in int x[];\n"
7250 "out gl_PerVertex { vec4 gl_Position; };\n"
7251 "void main(){\n"
7252 " gl_Position.xyz = gl_TessCoord;\n"
7253 " gl_Position.w = x[0] + x[1] + x[2];\n"
7254 "}\n";
7255 char const *fsSource =
7256 "#version 450\n"
7257 "layout(location=0) out vec4 color;\n"
7258 "void main(){\n"
7259 " color = vec4(1);\n"
7260 "}\n";
7261
7262 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7263 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7264 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7265 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7266
7267 VkPipelineInputAssemblyStateCreateInfo iasci{
7268 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7269 nullptr,
7270 0,
7271 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7272 VK_FALSE};
7273
Chris Forbesb4cacb62016-04-04 19:15:00 +12007274 VkPipelineTessellationStateCreateInfo tsci{
7275 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7276 nullptr,
7277 0,
7278 3};
7279
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007280 VkPipelineObj pipe(m_device);
7281 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12007282 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007283 pipe.AddColorAttachment();
7284 pipe.AddShader(&vs);
7285 pipe.AddShader(&tcs);
7286 pipe.AddShader(&tes);
7287 pipe.AddShader(&fs);
7288
7289 VkDescriptorSetObj descriptorSet(m_device);
7290 descriptorSet.AppendDummy();
7291 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7292
7293 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7294
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007295 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007296}
7297
Chris Forbesa0ab8152016-04-20 13:34:27 +12007298TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
7299{
7300 m_errorMonitor->ExpectSuccess();
7301
7302 ASSERT_NO_FATAL_FAILURE(InitState());
7303 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7304
7305 if (!m_device->phy().features().geometryShader) {
7306 printf("Device does not support geometry shaders; skipped.\n");
7307 return;
7308 }
7309
7310 char const *vsSource =
7311 "#version 450\n"
7312 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
7313 "void main(){\n"
7314 " vs_out.x = vec4(1);\n"
7315 "}\n";
7316 char const *gsSource =
7317 "#version 450\n"
7318 "layout(triangles) in;\n"
7319 "layout(triangle_strip, max_vertices=3) out;\n"
7320 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
7321 "out gl_PerVertex { vec4 gl_Position; };\n"
7322 "void main() {\n"
7323 " gl_Position = gs_in[0].x;\n"
7324 " EmitVertex();\n"
7325 "}\n";
7326 char const *fsSource =
7327 "#version 450\n"
7328 "layout(location=0) out vec4 color;\n"
7329 "void main(){\n"
7330 " color = vec4(1);\n"
7331 "}\n";
7332
7333 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7334 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
7335 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7336
7337 VkPipelineObj pipe(m_device);
7338 pipe.AddColorAttachment();
7339 pipe.AddShader(&vs);
7340 pipe.AddShader(&gs);
7341 pipe.AddShader(&fs);
7342
7343 VkDescriptorSetObj descriptorSet(m_device);
7344 descriptorSet.AppendDummy();
7345 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7346
7347 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7348
7349 m_errorMonitor->VerifyNotFound();
7350}
7351
Chris Forbesa0193bc2016-04-04 19:19:47 +12007352TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
7353{
7354 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7355 "is per-vertex in tessellation control shader stage "
7356 "but per-patch in tessellation evaluation shader stage");
7357
7358 ASSERT_NO_FATAL_FAILURE(InitState());
7359 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7360
Chris Forbesc1e852d2016-04-04 19:26:42 +12007361 if (!m_device->phy().features().tessellationShader) {
7362 printf("Device does not support tessellation shaders; skipped.\n");
7363 return;
7364 }
7365
Chris Forbesa0193bc2016-04-04 19:19:47 +12007366 char const *vsSource =
7367 "#version 450\n"
7368 "void main(){}\n";
7369 char const *tcsSource =
7370 "#version 450\n"
7371 "layout(location=0) out int x[];\n"
7372 "layout(vertices=3) out;\n"
7373 "void main(){\n"
7374 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7375 " gl_TessLevelInner[0] = 1;\n"
7376 " x[gl_InvocationID] = gl_InvocationID;\n"
7377 "}\n";
7378 char const *tesSource =
7379 "#version 450\n"
7380 "layout(triangles, equal_spacing, cw) in;\n"
7381 "layout(location=0) patch in int x;\n"
7382 "out gl_PerVertex { vec4 gl_Position; };\n"
7383 "void main(){\n"
7384 " gl_Position.xyz = gl_TessCoord;\n"
7385 " gl_Position.w = x;\n"
7386 "}\n";
7387 char const *fsSource =
7388 "#version 450\n"
7389 "layout(location=0) out vec4 color;\n"
7390 "void main(){\n"
7391 " color = vec4(1);\n"
7392 "}\n";
7393
7394 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7395 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7396 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7397 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7398
7399 VkPipelineInputAssemblyStateCreateInfo iasci{
7400 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7401 nullptr,
7402 0,
7403 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7404 VK_FALSE};
7405
7406 VkPipelineTessellationStateCreateInfo tsci{
7407 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7408 nullptr,
7409 0,
7410 3};
7411
7412 VkPipelineObj pipe(m_device);
7413 pipe.SetInputAssembly(&iasci);
7414 pipe.SetTessellation(&tsci);
7415 pipe.AddColorAttachment();
7416 pipe.AddShader(&vs);
7417 pipe.AddShader(&tcs);
7418 pipe.AddShader(&tes);
7419 pipe.AddShader(&fs);
7420
7421 VkDescriptorSetObj descriptorSet(m_device);
7422 descriptorSet.AppendDummy();
7423 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7424
7425 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7426
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007427 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12007428}
7429
Karl Schultz6addd812016-02-02 17:17:23 -07007430TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
7431 m_errorMonitor->SetDesiredFailureMsg(
7432 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007433 "Duplicate vertex input binding descriptions for binding 0");
7434
Chris Forbes280ba2c2015-06-12 11:16:41 +12007435 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007436 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007437
7438 /* Two binding descriptions for binding 0 */
7439 VkVertexInputBindingDescription input_bindings[2];
7440 memset(input_bindings, 0, sizeof(input_bindings));
7441
7442 VkVertexInputAttributeDescription input_attrib;
7443 memset(&input_attrib, 0, sizeof(input_attrib));
7444 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7445
7446 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007447 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007448 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007449 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007450 "out gl_PerVertex {\n"
7451 " vec4 gl_Position;\n"
7452 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007453 "void main(){\n"
7454 " gl_Position = vec4(x);\n"
7455 "}\n";
7456 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007457 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007458 "\n"
7459 "layout(location=0) out vec4 color;\n"
7460 "void main(){\n"
7461 " color = vec4(1);\n"
7462 "}\n";
7463
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007464 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7465 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007466
7467 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007468 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007469 pipe.AddShader(&vs);
7470 pipe.AddShader(&fs);
7471
7472 pipe.AddVertexInputBindings(input_bindings, 2);
7473 pipe.AddVertexInputAttribs(&input_attrib, 1);
7474
Chris Forbes280ba2c2015-06-12 11:16:41 +12007475 VkDescriptorSetObj descriptorSet(m_device);
7476 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007477 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007478
Tony Barbour5781e8f2015-08-04 16:23:11 -06007479 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007480
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007481 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007482}
Chris Forbes8f68b562015-05-25 11:13:32 +12007483
Chris Forbes35efec72016-04-21 14:32:08 +12007484TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
7485 m_errorMonitor->ExpectSuccess();
7486
7487 ASSERT_NO_FATAL_FAILURE(InitState());
7488 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7489
7490 if (!m_device->phy().features().tessellationShader) {
7491 printf("Device does not support 64bit vertex attributes; skipped.\n");
7492 return;
7493 }
7494
7495 VkVertexInputBindingDescription input_bindings[1];
7496 memset(input_bindings, 0, sizeof(input_bindings));
7497
7498 VkVertexInputAttributeDescription input_attribs[4];
7499 memset(input_attribs, 0, sizeof(input_attribs));
7500 input_attribs[0].location = 0;
7501 input_attribs[0].offset = 0;
7502 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7503 input_attribs[1].location = 2;
7504 input_attribs[1].offset = 32;
7505 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7506 input_attribs[2].location = 4;
7507 input_attribs[2].offset = 64;
7508 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7509 input_attribs[3].location = 6;
7510 input_attribs[3].offset = 96;
7511 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7512
7513 char const *vsSource =
7514 "#version 450\n"
7515 "\n"
7516 "layout(location=0) in dmat4 x;\n"
7517 "out gl_PerVertex {\n"
7518 " vec4 gl_Position;\n"
7519 "};\n"
7520 "void main(){\n"
7521 " gl_Position = vec4(x[0][0]);\n"
7522 "}\n";
7523 char const *fsSource =
7524 "#version 450\n"
7525 "\n"
7526 "layout(location=0) out vec4 color;\n"
7527 "void main(){\n"
7528 " color = vec4(1);\n"
7529 "}\n";
7530
7531 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7532 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7533
7534 VkPipelineObj pipe(m_device);
7535 pipe.AddColorAttachment();
7536 pipe.AddShader(&vs);
7537 pipe.AddShader(&fs);
7538
7539 pipe.AddVertexInputBindings(input_bindings, 1);
7540 pipe.AddVertexInputAttribs(input_attribs, 4);
7541
7542 VkDescriptorSetObj descriptorSet(m_device);
7543 descriptorSet.AppendDummy();
7544 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7545
7546 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7547
7548 m_errorMonitor->VerifyNotFound();
7549}
7550
Karl Schultz6addd812016-02-02 17:17:23 -07007551TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007553 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007554
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007555 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007556
7557 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007558 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007559 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007560 "out gl_PerVertex {\n"
7561 " vec4 gl_Position;\n"
7562 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007563 "void main(){\n"
7564 " gl_Position = vec4(1);\n"
7565 "}\n";
7566 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007567 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007568 "\n"
7569 "void main(){\n"
7570 "}\n";
7571
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007572 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7573 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007574
7575 VkPipelineObj pipe(m_device);
7576 pipe.AddShader(&vs);
7577 pipe.AddShader(&fs);
7578
Chia-I Wu08accc62015-07-07 11:50:03 +08007579 /* set up CB 0, not written */
7580 pipe.AddColorAttachment();
7581 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007582
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007583 VkDescriptorSetObj descriptorSet(m_device);
7584 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007585 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007586
Tony Barbour5781e8f2015-08-04 16:23:11 -06007587 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007588
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007589 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007590}
7591
Karl Schultz6addd812016-02-02 17:17:23 -07007592TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07007593 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007594 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007595 "FS writes to output location 1 with no matching attachment");
7596
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007597 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007598
7599 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007600 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007601 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007602 "out gl_PerVertex {\n"
7603 " vec4 gl_Position;\n"
7604 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007605 "void main(){\n"
7606 " gl_Position = vec4(1);\n"
7607 "}\n";
7608 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007609 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007610 "\n"
7611 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007612 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007613 "void main(){\n"
7614 " x = vec4(1);\n"
7615 " y = vec4(1);\n"
7616 "}\n";
7617
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007618 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7619 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007620
7621 VkPipelineObj pipe(m_device);
7622 pipe.AddShader(&vs);
7623 pipe.AddShader(&fs);
7624
Chia-I Wu08accc62015-07-07 11:50:03 +08007625 /* set up CB 0, not written */
7626 pipe.AddColorAttachment();
7627 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007628 /* FS writes CB 1, but we don't configure it */
7629
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007630 VkDescriptorSetObj descriptorSet(m_device);
7631 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007632 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007633
Tony Barbour5781e8f2015-08-04 16:23:11 -06007634 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007635
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007636 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007637}
7638
Karl Schultz6addd812016-02-02 17:17:23 -07007639TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007640 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007641 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007642
Chris Forbesa36d69e2015-05-25 11:13:44 +12007643 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007644
7645 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007646 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007647 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007648 "out gl_PerVertex {\n"
7649 " vec4 gl_Position;\n"
7650 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007651 "void main(){\n"
7652 " gl_Position = vec4(1);\n"
7653 "}\n";
7654 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007655 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007656 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007657 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12007658 "void main(){\n"
7659 " x = ivec4(1);\n"
7660 "}\n";
7661
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007662 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7663 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007664
7665 VkPipelineObj pipe(m_device);
7666 pipe.AddShader(&vs);
7667 pipe.AddShader(&fs);
7668
Chia-I Wu08accc62015-07-07 11:50:03 +08007669 /* set up CB 0; type is UNORM by default */
7670 pipe.AddColorAttachment();
7671 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007672
Chris Forbesa36d69e2015-05-25 11:13:44 +12007673 VkDescriptorSetObj descriptorSet(m_device);
7674 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007675 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007676
Tony Barbour5781e8f2015-08-04 16:23:11 -06007677 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007678
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007679 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12007680}
Chris Forbes7b1b8932015-06-05 14:43:36 +12007681
Karl Schultz6addd812016-02-02 17:17:23 -07007682TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007684 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007685
Chris Forbes556c76c2015-08-14 12:04:59 +12007686 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12007687
7688 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007689 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007690 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007691 "out gl_PerVertex {\n"
7692 " vec4 gl_Position;\n"
7693 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007694 "void main(){\n"
7695 " gl_Position = vec4(1);\n"
7696 "}\n";
7697 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007698 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007699 "\n"
7700 "layout(location=0) out vec4 x;\n"
7701 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7702 "void main(){\n"
7703 " x = vec4(bar.y);\n"
7704 "}\n";
7705
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007706 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7707 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12007708
Chris Forbes556c76c2015-08-14 12:04:59 +12007709 VkPipelineObj pipe(m_device);
7710 pipe.AddShader(&vs);
7711 pipe.AddShader(&fs);
7712
7713 /* set up CB 0; type is UNORM by default */
7714 pipe.AddColorAttachment();
7715 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7716
7717 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007718 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12007719
7720 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7721
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007722 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12007723}
7724
Chris Forbes5c59e902016-02-26 16:56:09 +13007725TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
7726 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7727 "not declared in layout");
7728
7729 ASSERT_NO_FATAL_FAILURE(InitState());
7730
7731 char const *vsSource =
7732 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007733 "\n"
7734 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
7735 "out gl_PerVertex {\n"
7736 " vec4 gl_Position;\n"
7737 "};\n"
7738 "void main(){\n"
7739 " gl_Position = vec4(consts.x);\n"
7740 "}\n";
7741 char const *fsSource =
7742 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007743 "\n"
7744 "layout(location=0) out vec4 x;\n"
7745 "void main(){\n"
7746 " x = vec4(1);\n"
7747 "}\n";
7748
7749 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7750 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7751
7752 VkPipelineObj pipe(m_device);
7753 pipe.AddShader(&vs);
7754 pipe.AddShader(&fs);
7755
7756 /* set up CB 0; type is UNORM by default */
7757 pipe.AddColorAttachment();
7758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7759
7760 VkDescriptorSetObj descriptorSet(m_device);
7761 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7762
7763 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7764
7765 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007766 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13007767}
7768
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007769#endif // SHADER_CHECKER_TESTS
7770
7771#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06007772TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07007773 m_errorMonitor->SetDesiredFailureMsg(
7774 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007775 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007776
7777 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007778
7779 // Create an image
7780 VkImage image;
7781
Karl Schultz6addd812016-02-02 17:17:23 -07007782 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7783 const int32_t tex_width = 32;
7784 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007785
7786 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007787 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7788 image_create_info.pNext = NULL;
7789 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7790 image_create_info.format = tex_format;
7791 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007792 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07007793 image_create_info.extent.depth = 1;
7794 image_create_info.mipLevels = 1;
7795 image_create_info.arrayLayers = 1;
7796 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7797 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7798 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7799 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007800
7801 // Introduce error by sending down a bogus width extent
7802 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007803 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007804
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007805 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007806}
7807
Mark Youngc48c4c12016-04-11 14:26:49 -06007808TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
7809 m_errorMonitor->SetDesiredFailureMsg(
7810 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7811 "CreateImage extents is 0 for at least one required dimension");
7812
7813 ASSERT_NO_FATAL_FAILURE(InitState());
7814
7815 // Create an image
7816 VkImage image;
7817
7818 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7819 const int32_t tex_width = 32;
7820 const int32_t tex_height = 32;
7821
7822 VkImageCreateInfo image_create_info = {};
7823 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7824 image_create_info.pNext = NULL;
7825 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7826 image_create_info.format = tex_format;
7827 image_create_info.extent.width = tex_width;
7828 image_create_info.extent.height = tex_height;
7829 image_create_info.extent.depth = 1;
7830 image_create_info.mipLevels = 1;
7831 image_create_info.arrayLayers = 1;
7832 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7833 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7834 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7835 image_create_info.flags = 0;
7836
7837 // Introduce error by sending down a bogus width extent
7838 image_create_info.extent.width = 0;
7839 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7840
7841 m_errorMonitor->VerifyFound();
7842}
7843
Karl Schultz6addd812016-02-02 17:17:23 -07007844TEST_F(VkLayerTest, UpdateBufferAlignment) {
7845 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06007846
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007848 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007849
Mike Stroyana3082432015-09-25 13:39:21 -06007850 ASSERT_NO_FATAL_FAILURE(InitState());
7851
7852 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7853 vk_testing::Buffer buffer;
7854 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7855
7856 BeginCommandBuffer();
7857 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007858 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007859 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007860
Mike Stroyana3082432015-09-25 13:39:21 -06007861 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007863 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007864
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007865 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007866 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007867 EndCommandBuffer();
7868}
7869
Karl Schultz6addd812016-02-02 17:17:23 -07007870TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007872 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06007873
7874 ASSERT_NO_FATAL_FAILURE(InitState());
7875
7876 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7877 vk_testing::Buffer buffer;
7878 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7879
7880 BeginCommandBuffer();
7881 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007882 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007883 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007884
Mike Stroyana3082432015-09-25 13:39:21 -06007885 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007887 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007888
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007889 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007890
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007891 m_errorMonitor->VerifyFound();
7892
Mike Stroyana3082432015-09-25 13:39:21 -06007893 EndCommandBuffer();
7894}
7895
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007896#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12007897
Tobin Ehliscde08892015-09-22 10:11:37 -06007898#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007899TEST_F(VkLayerTest, InvalidImageView) {
7900 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06007901
Karl Schultz6addd812016-02-02 17:17:23 -07007902 m_errorMonitor->SetDesiredFailureMsg(
7903 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007904 "vkCreateImageView called with baseMipLevel 10 ");
7905
Tobin Ehliscde08892015-09-22 10:11:37 -06007906 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06007907
Mike Stroyana3082432015-09-25 13:39:21 -06007908 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07007909 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06007910
Karl Schultz6addd812016-02-02 17:17:23 -07007911 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7912 const int32_t tex_width = 32;
7913 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06007914
7915 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007916 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7917 image_create_info.pNext = NULL;
7918 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7919 image_create_info.format = tex_format;
7920 image_create_info.extent.width = tex_width;
7921 image_create_info.extent.height = tex_height;
7922 image_create_info.extent.depth = 1;
7923 image_create_info.mipLevels = 1;
7924 image_create_info.arrayLayers = 1;
7925 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7926 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7927 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7928 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06007929
Chia-I Wuf7458c52015-10-26 21:10:41 +08007930 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06007931 ASSERT_VK_SUCCESS(err);
7932
7933 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007934 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7935 image_view_create_info.image = image;
7936 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7937 image_view_create_info.format = tex_format;
7938 image_view_create_info.subresourceRange.layerCount = 1;
7939 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
7940 image_view_create_info.subresourceRange.levelCount = 1;
7941 image_view_create_info.subresourceRange.aspectMask =
7942 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06007943
7944 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007945 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7946 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06007947
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007948 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06007949}
Mike Stroyana3082432015-09-25 13:39:21 -06007950
Karl Schultz6addd812016-02-02 17:17:23 -07007951TEST_F(VkLayerTest, InvalidImageViewAspect) {
7952 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007953
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007955 "vkCreateImageView: Color image "
7956 "formats must have ONLY the "
7957 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007958
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007959 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007960
7961 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07007962 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007963
Karl Schultz6addd812016-02-02 17:17:23 -07007964 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7965 const int32_t tex_width = 32;
7966 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007967
7968 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007969 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7970 image_create_info.pNext = NULL;
7971 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7972 image_create_info.format = tex_format;
7973 image_create_info.extent.width = tex_width;
7974 image_create_info.extent.height = tex_height;
7975 image_create_info.extent.depth = 1;
7976 image_create_info.mipLevels = 1;
7977 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7978 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7979 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7980 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007981
Chia-I Wuf7458c52015-10-26 21:10:41 +08007982 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007983 ASSERT_VK_SUCCESS(err);
7984
7985 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007986 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7987 image_view_create_info.image = image;
7988 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7989 image_view_create_info.format = tex_format;
7990 image_view_create_info.subresourceRange.baseMipLevel = 0;
7991 image_view_create_info.subresourceRange.levelCount = 1;
7992 // Cause an error by setting an invalid image aspect
7993 image_view_create_info.subresourceRange.aspectMask =
7994 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007995
7996 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007997 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7998 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007999
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008000 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008001}
8002
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008003TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008004 VkResult err;
8005 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008006
Karl Schultz6addd812016-02-02 17:17:23 -07008007 m_errorMonitor->SetDesiredFailureMsg(
8008 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008009 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008010
Mike Stroyana3082432015-09-25 13:39:21 -06008011 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008012
8013 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008014 VkImage srcImage;
8015 VkImage dstImage;
8016 VkDeviceMemory srcMem;
8017 VkDeviceMemory destMem;
8018 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008019
8020 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008021 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8022 image_create_info.pNext = NULL;
8023 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8024 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8025 image_create_info.extent.width = 32;
8026 image_create_info.extent.height = 32;
8027 image_create_info.extent.depth = 1;
8028 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008029 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07008030 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8031 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8032 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8033 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008034
Karl Schultz6addd812016-02-02 17:17:23 -07008035 err =
8036 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008037 ASSERT_VK_SUCCESS(err);
8038
Karl Schultz6addd812016-02-02 17:17:23 -07008039 err =
8040 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008041 ASSERT_VK_SUCCESS(err);
8042
8043 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008044 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008045 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8046 memAlloc.pNext = NULL;
8047 memAlloc.allocationSize = 0;
8048 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008049
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008050 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008051 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008052 pass =
8053 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008054 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008055 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008056 ASSERT_VK_SUCCESS(err);
8057
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008058 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008059 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008060 pass =
8061 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008062 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008063 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008064 ASSERT_VK_SUCCESS(err);
8065
8066 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8067 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008068 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008069 ASSERT_VK_SUCCESS(err);
8070
8071 BeginCommandBuffer();
8072 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008073 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008074 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008075 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008076 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06008077 copyRegion.srcOffset.x = 0;
8078 copyRegion.srcOffset.y = 0;
8079 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008080 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008081 copyRegion.dstSubresource.mipLevel = 0;
8082 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008083 // Introduce failure by forcing the dst layerCount to differ from src
8084 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008085 copyRegion.dstOffset.x = 0;
8086 copyRegion.dstOffset.y = 0;
8087 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008088 copyRegion.extent.width = 1;
8089 copyRegion.extent.height = 1;
8090 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008091 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8092 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008093 EndCommandBuffer();
8094
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008095 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008096
Chia-I Wuf7458c52015-10-26 21:10:41 +08008097 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008098 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008099 vkFreeMemory(m_device->device(), srcMem, NULL);
8100 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008101}
8102
Karl Schultz6addd812016-02-02 17:17:23 -07008103TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06008104 VkResult err;
8105 bool pass;
8106
8107 // Create color images with different format sizes and try to copy between them
8108 m_errorMonitor->SetDesiredFailureMsg(
8109 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8110 "vkCmdCopyImage called with unmatched source and dest image format sizes");
8111
8112 ASSERT_NO_FATAL_FAILURE(InitState());
8113
8114 // Create two images of different types and try to copy between them
8115 VkImage srcImage;
8116 VkImage dstImage;
8117 VkDeviceMemory srcMem;
8118 VkDeviceMemory destMem;
8119 VkMemoryRequirements memReqs;
8120
8121 VkImageCreateInfo image_create_info = {};
8122 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8123 image_create_info.pNext = NULL;
8124 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8125 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8126 image_create_info.extent.width = 32;
8127 image_create_info.extent.height = 32;
8128 image_create_info.extent.depth = 1;
8129 image_create_info.mipLevels = 1;
8130 image_create_info.arrayLayers = 1;
8131 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8132 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8133 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8134 image_create_info.flags = 0;
8135
8136 err =
8137 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
8138 ASSERT_VK_SUCCESS(err);
8139
8140 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8141 // Introduce failure by creating second image with a different-sized format.
8142 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
8143
8144 err =
8145 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
8146 ASSERT_VK_SUCCESS(err);
8147
8148 // Allocate memory
8149 VkMemoryAllocateInfo memAlloc = {};
8150 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8151 memAlloc.pNext = NULL;
8152 memAlloc.allocationSize = 0;
8153 memAlloc.memoryTypeIndex = 0;
8154
8155 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
8156 memAlloc.allocationSize = memReqs.size;
8157 pass =
8158 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
8159 ASSERT_TRUE(pass);
8160 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
8161 ASSERT_VK_SUCCESS(err);
8162
8163 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
8164 memAlloc.allocationSize = memReqs.size;
8165 pass =
8166 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
8167 ASSERT_TRUE(pass);
8168 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
8169 ASSERT_VK_SUCCESS(err);
8170
8171 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8172 ASSERT_VK_SUCCESS(err);
8173 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
8174 ASSERT_VK_SUCCESS(err);
8175
8176 BeginCommandBuffer();
8177 VkImageCopy copyRegion;
8178 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8179 copyRegion.srcSubresource.mipLevel = 0;
8180 copyRegion.srcSubresource.baseArrayLayer = 0;
8181 copyRegion.srcSubresource.layerCount = 0;
8182 copyRegion.srcOffset.x = 0;
8183 copyRegion.srcOffset.y = 0;
8184 copyRegion.srcOffset.z = 0;
8185 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8186 copyRegion.dstSubresource.mipLevel = 0;
8187 copyRegion.dstSubresource.baseArrayLayer = 0;
8188 copyRegion.dstSubresource.layerCount = 0;
8189 copyRegion.dstOffset.x = 0;
8190 copyRegion.dstOffset.y = 0;
8191 copyRegion.dstOffset.z = 0;
8192 copyRegion.extent.width = 1;
8193 copyRegion.extent.height = 1;
8194 copyRegion.extent.depth = 1;
8195 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8196 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
8197 EndCommandBuffer();
8198
8199 m_errorMonitor->VerifyFound();
8200
8201 vkDestroyImage(m_device->device(), srcImage, NULL);
8202 vkDestroyImage(m_device->device(), dstImage, NULL);
8203 vkFreeMemory(m_device->device(), srcMem, NULL);
8204 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008205}
8206
Karl Schultz6addd812016-02-02 17:17:23 -07008207TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
8208 VkResult err;
8209 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008210
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008211 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008212 m_errorMonitor->SetDesiredFailureMsg(
8213 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008214 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008215
Mike Stroyana3082432015-09-25 13:39:21 -06008216 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008217
8218 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008219 VkImage srcImage;
8220 VkImage dstImage;
8221 VkDeviceMemory srcMem;
8222 VkDeviceMemory destMem;
8223 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008224
8225 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008226 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8227 image_create_info.pNext = NULL;
8228 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8229 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8230 image_create_info.extent.width = 32;
8231 image_create_info.extent.height = 32;
8232 image_create_info.extent.depth = 1;
8233 image_create_info.mipLevels = 1;
8234 image_create_info.arrayLayers = 1;
8235 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8236 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8237 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8238 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008239
Karl Schultz6addd812016-02-02 17:17:23 -07008240 err =
8241 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008242 ASSERT_VK_SUCCESS(err);
8243
Karl Schultzbdb75952016-04-19 11:36:49 -06008244 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8245
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008246 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07008247 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008248 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8249 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008250
Karl Schultz6addd812016-02-02 17:17:23 -07008251 err =
8252 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008253 ASSERT_VK_SUCCESS(err);
8254
8255 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008256 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008257 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8258 memAlloc.pNext = NULL;
8259 memAlloc.allocationSize = 0;
8260 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008261
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008262 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008263 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008264 pass =
8265 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008266 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008267 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008268 ASSERT_VK_SUCCESS(err);
8269
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008270 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008271 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008272 pass =
8273 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008274 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008275 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008276 ASSERT_VK_SUCCESS(err);
8277
8278 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8279 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008280 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008281 ASSERT_VK_SUCCESS(err);
8282
8283 BeginCommandBuffer();
8284 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008285 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008286 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008287 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008288 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008289 copyRegion.srcOffset.x = 0;
8290 copyRegion.srcOffset.y = 0;
8291 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008292 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008293 copyRegion.dstSubresource.mipLevel = 0;
8294 copyRegion.dstSubresource.baseArrayLayer = 0;
8295 copyRegion.dstSubresource.layerCount = 0;
8296 copyRegion.dstOffset.x = 0;
8297 copyRegion.dstOffset.y = 0;
8298 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008299 copyRegion.extent.width = 1;
8300 copyRegion.extent.height = 1;
8301 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008302 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8303 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008304 EndCommandBuffer();
8305
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008306 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008307
Chia-I Wuf7458c52015-10-26 21:10:41 +08008308 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008309 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008310 vkFreeMemory(m_device->device(), srcMem, NULL);
8311 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008312}
8313
Karl Schultz6addd812016-02-02 17:17:23 -07008314TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
8315 VkResult err;
8316 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008317
Karl Schultz6addd812016-02-02 17:17:23 -07008318 m_errorMonitor->SetDesiredFailureMsg(
8319 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008320 "vkCmdResolveImage called with source sample count less than 2.");
8321
Mike Stroyana3082432015-09-25 13:39:21 -06008322 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008323
8324 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008325 VkImage srcImage;
8326 VkImage dstImage;
8327 VkDeviceMemory srcMem;
8328 VkDeviceMemory destMem;
8329 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008330
8331 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008332 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8333 image_create_info.pNext = NULL;
8334 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8335 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8336 image_create_info.extent.width = 32;
8337 image_create_info.extent.height = 1;
8338 image_create_info.extent.depth = 1;
8339 image_create_info.mipLevels = 1;
8340 image_create_info.arrayLayers = 1;
8341 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8342 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8343 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8344 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008345
Karl Schultz6addd812016-02-02 17:17:23 -07008346 err =
8347 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008348 ASSERT_VK_SUCCESS(err);
8349
Karl Schultz6addd812016-02-02 17:17:23 -07008350 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8351 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008352
Karl Schultz6addd812016-02-02 17:17:23 -07008353 err =
8354 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008355 ASSERT_VK_SUCCESS(err);
8356
8357 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008358 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008359 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8360 memAlloc.pNext = NULL;
8361 memAlloc.allocationSize = 0;
8362 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008363
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008364 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008365 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008366 pass =
8367 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008368 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008369 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008370 ASSERT_VK_SUCCESS(err);
8371
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008372 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008373 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008374 pass =
8375 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008376 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008377 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008378 ASSERT_VK_SUCCESS(err);
8379
8380 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8381 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008382 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008383 ASSERT_VK_SUCCESS(err);
8384
8385 BeginCommandBuffer();
8386 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008387 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8388 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008389 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008390 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008391 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008392 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008393 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008394 resolveRegion.srcOffset.x = 0;
8395 resolveRegion.srcOffset.y = 0;
8396 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008397 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008398 resolveRegion.dstSubresource.mipLevel = 0;
8399 resolveRegion.dstSubresource.baseArrayLayer = 0;
8400 resolveRegion.dstSubresource.layerCount = 0;
8401 resolveRegion.dstOffset.x = 0;
8402 resolveRegion.dstOffset.y = 0;
8403 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008404 resolveRegion.extent.width = 1;
8405 resolveRegion.extent.height = 1;
8406 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008407 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8408 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008409 EndCommandBuffer();
8410
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008411 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008412
Chia-I Wuf7458c52015-10-26 21:10:41 +08008413 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008414 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008415 vkFreeMemory(m_device->device(), srcMem, NULL);
8416 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008417}
8418
Karl Schultz6addd812016-02-02 17:17:23 -07008419TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
8420 VkResult err;
8421 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008422
Karl Schultz6addd812016-02-02 17:17:23 -07008423 m_errorMonitor->SetDesiredFailureMsg(
8424 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008425 "vkCmdResolveImage called with dest sample count greater than 1.");
8426
Mike Stroyana3082432015-09-25 13:39:21 -06008427 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008428
8429 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008430 VkImage srcImage;
8431 VkImage dstImage;
8432 VkDeviceMemory srcMem;
8433 VkDeviceMemory destMem;
8434 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008435
8436 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008437 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8438 image_create_info.pNext = NULL;
8439 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8440 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8441 image_create_info.extent.width = 32;
8442 image_create_info.extent.height = 1;
8443 image_create_info.extent.depth = 1;
8444 image_create_info.mipLevels = 1;
8445 image_create_info.arrayLayers = 1;
8446 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8447 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8448 // Note: Some implementations expect color attachment usage for any
8449 // multisample surface
8450 image_create_info.usage =
8451 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8452 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008453
Karl Schultz6addd812016-02-02 17:17:23 -07008454 err =
8455 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008456 ASSERT_VK_SUCCESS(err);
8457
Karl Schultz6addd812016-02-02 17:17:23 -07008458 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8459 // Note: Some implementations expect color attachment usage for any
8460 // multisample surface
8461 image_create_info.usage =
8462 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008463
Karl Schultz6addd812016-02-02 17:17:23 -07008464 err =
8465 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008466 ASSERT_VK_SUCCESS(err);
8467
8468 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008469 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008470 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8471 memAlloc.pNext = NULL;
8472 memAlloc.allocationSize = 0;
8473 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008474
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008475 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008476 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008477 pass =
8478 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008479 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008480 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008481 ASSERT_VK_SUCCESS(err);
8482
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008483 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008484 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008485 pass =
8486 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008487 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008488 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008489 ASSERT_VK_SUCCESS(err);
8490
8491 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8492 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008493 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008494 ASSERT_VK_SUCCESS(err);
8495
8496 BeginCommandBuffer();
8497 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008498 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8499 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008500 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008501 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008502 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008503 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008504 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008505 resolveRegion.srcOffset.x = 0;
8506 resolveRegion.srcOffset.y = 0;
8507 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008508 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008509 resolveRegion.dstSubresource.mipLevel = 0;
8510 resolveRegion.dstSubresource.baseArrayLayer = 0;
8511 resolveRegion.dstSubresource.layerCount = 0;
8512 resolveRegion.dstOffset.x = 0;
8513 resolveRegion.dstOffset.y = 0;
8514 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008515 resolveRegion.extent.width = 1;
8516 resolveRegion.extent.height = 1;
8517 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008518 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8519 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008520 EndCommandBuffer();
8521
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008522 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008523
Chia-I Wuf7458c52015-10-26 21:10:41 +08008524 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008525 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008526 vkFreeMemory(m_device->device(), srcMem, NULL);
8527 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008528}
8529
Karl Schultz6addd812016-02-02 17:17:23 -07008530TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
8531 VkResult err;
8532 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008533
Karl Schultz6addd812016-02-02 17:17:23 -07008534 m_errorMonitor->SetDesiredFailureMsg(
8535 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008536 "vkCmdResolveImage called with unmatched source and dest formats.");
8537
Mike Stroyana3082432015-09-25 13:39:21 -06008538 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008539
8540 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008541 VkImage srcImage;
8542 VkImage dstImage;
8543 VkDeviceMemory srcMem;
8544 VkDeviceMemory destMem;
8545 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008546
8547 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008548 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8549 image_create_info.pNext = NULL;
8550 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8551 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8552 image_create_info.extent.width = 32;
8553 image_create_info.extent.height = 1;
8554 image_create_info.extent.depth = 1;
8555 image_create_info.mipLevels = 1;
8556 image_create_info.arrayLayers = 1;
8557 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8558 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8559 // Note: Some implementations expect color attachment usage for any
8560 // multisample surface
8561 image_create_info.usage =
8562 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8563 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008564
Karl Schultz6addd812016-02-02 17:17:23 -07008565 err =
8566 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008567 ASSERT_VK_SUCCESS(err);
8568
Karl Schultz6addd812016-02-02 17:17:23 -07008569 // Set format to something other than source image
8570 image_create_info.format = VK_FORMAT_R32_SFLOAT;
8571 // Note: Some implementations expect color attachment usage for any
8572 // multisample surface
8573 image_create_info.usage =
8574 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8575 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008576
Karl Schultz6addd812016-02-02 17:17:23 -07008577 err =
8578 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008579 ASSERT_VK_SUCCESS(err);
8580
8581 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008582 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008583 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8584 memAlloc.pNext = NULL;
8585 memAlloc.allocationSize = 0;
8586 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008587
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008588 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008589 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008590 pass =
8591 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008592 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008593 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008594 ASSERT_VK_SUCCESS(err);
8595
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008596 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008597 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008598 pass =
8599 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008600 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008601 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008602 ASSERT_VK_SUCCESS(err);
8603
8604 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8605 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008606 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008607 ASSERT_VK_SUCCESS(err);
8608
8609 BeginCommandBuffer();
8610 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008611 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8612 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008613 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008614 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008615 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008616 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008617 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008618 resolveRegion.srcOffset.x = 0;
8619 resolveRegion.srcOffset.y = 0;
8620 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008621 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008622 resolveRegion.dstSubresource.mipLevel = 0;
8623 resolveRegion.dstSubresource.baseArrayLayer = 0;
8624 resolveRegion.dstSubresource.layerCount = 0;
8625 resolveRegion.dstOffset.x = 0;
8626 resolveRegion.dstOffset.y = 0;
8627 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008628 resolveRegion.extent.width = 1;
8629 resolveRegion.extent.height = 1;
8630 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008631 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8632 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008633 EndCommandBuffer();
8634
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008635 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008636
Chia-I Wuf7458c52015-10-26 21:10:41 +08008637 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008638 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008639 vkFreeMemory(m_device->device(), srcMem, NULL);
8640 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008641}
8642
Karl Schultz6addd812016-02-02 17:17:23 -07008643TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
8644 VkResult err;
8645 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008646
Karl Schultz6addd812016-02-02 17:17:23 -07008647 m_errorMonitor->SetDesiredFailureMsg(
8648 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008649 "vkCmdResolveImage called with unmatched source and dest image types.");
8650
Mike Stroyana3082432015-09-25 13:39:21 -06008651 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008652
8653 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008654 VkImage srcImage;
8655 VkImage dstImage;
8656 VkDeviceMemory srcMem;
8657 VkDeviceMemory destMem;
8658 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008659
8660 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008661 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8662 image_create_info.pNext = NULL;
8663 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8664 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8665 image_create_info.extent.width = 32;
8666 image_create_info.extent.height = 1;
8667 image_create_info.extent.depth = 1;
8668 image_create_info.mipLevels = 1;
8669 image_create_info.arrayLayers = 1;
8670 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8671 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8672 // Note: Some implementations expect color attachment usage for any
8673 // multisample surface
8674 image_create_info.usage =
8675 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8676 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008677
Karl Schultz6addd812016-02-02 17:17:23 -07008678 err =
8679 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008680 ASSERT_VK_SUCCESS(err);
8681
Karl Schultz6addd812016-02-02 17:17:23 -07008682 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8683 // Note: Some implementations expect color attachment usage for any
8684 // multisample surface
8685 image_create_info.usage =
8686 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8687 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008688
Karl Schultz6addd812016-02-02 17:17:23 -07008689 err =
8690 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008691 ASSERT_VK_SUCCESS(err);
8692
8693 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008694 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008695 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8696 memAlloc.pNext = NULL;
8697 memAlloc.allocationSize = 0;
8698 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008699
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008700 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008701 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008702 pass =
8703 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008704 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008705 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008706 ASSERT_VK_SUCCESS(err);
8707
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008708 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008709 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008710 pass =
8711 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008712 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008713 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008714 ASSERT_VK_SUCCESS(err);
8715
8716 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8717 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008718 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008719 ASSERT_VK_SUCCESS(err);
8720
8721 BeginCommandBuffer();
8722 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008723 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8724 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008725 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008726 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008727 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008728 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008729 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008730 resolveRegion.srcOffset.x = 0;
8731 resolveRegion.srcOffset.y = 0;
8732 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008733 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008734 resolveRegion.dstSubresource.mipLevel = 0;
8735 resolveRegion.dstSubresource.baseArrayLayer = 0;
8736 resolveRegion.dstSubresource.layerCount = 0;
8737 resolveRegion.dstOffset.x = 0;
8738 resolveRegion.dstOffset.y = 0;
8739 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008740 resolveRegion.extent.width = 1;
8741 resolveRegion.extent.height = 1;
8742 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008743 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8744 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008745 EndCommandBuffer();
8746
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008747 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008748
Chia-I Wuf7458c52015-10-26 21:10:41 +08008749 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008750 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008751 vkFreeMemory(m_device->device(), srcMem, NULL);
8752 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008753}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008754
Karl Schultz6addd812016-02-02 17:17:23 -07008755TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008756 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07008757 // to using a DS format, then cause it to hit error due to COLOR_BIT not
8758 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008759 // The image format check comes 2nd in validation so we trigger it first,
8760 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07008761 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008762
Karl Schultz6addd812016-02-02 17:17:23 -07008763 m_errorMonitor->SetDesiredFailureMsg(
8764 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008765 "Combination depth/stencil image formats can have only the ");
8766
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008767 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008768
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008769 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008770 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8771 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008772
8773 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008774 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8775 ds_pool_ci.pNext = NULL;
8776 ds_pool_ci.maxSets = 1;
8777 ds_pool_ci.poolSizeCount = 1;
8778 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008779
8780 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008781 err =
8782 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008783 ASSERT_VK_SUCCESS(err);
8784
8785 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008786 dsl_binding.binding = 0;
8787 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8788 dsl_binding.descriptorCount = 1;
8789 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8790 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008791
8792 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008793 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8794 ds_layout_ci.pNext = NULL;
8795 ds_layout_ci.bindingCount = 1;
8796 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008797 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008798 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8799 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008800 ASSERT_VK_SUCCESS(err);
8801
8802 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008803 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008804 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008805 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008806 alloc_info.descriptorPool = ds_pool;
8807 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008808 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8809 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008810 ASSERT_VK_SUCCESS(err);
8811
Karl Schultz6addd812016-02-02 17:17:23 -07008812 VkImage image_bad;
8813 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008814 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07008815 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008816 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07008817 const int32_t tex_width = 32;
8818 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008819
8820 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008821 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8822 image_create_info.pNext = NULL;
8823 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8824 image_create_info.format = tex_format_bad;
8825 image_create_info.extent.width = tex_width;
8826 image_create_info.extent.height = tex_height;
8827 image_create_info.extent.depth = 1;
8828 image_create_info.mipLevels = 1;
8829 image_create_info.arrayLayers = 1;
8830 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8831 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8832 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
8833 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
8834 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008835
Karl Schultz6addd812016-02-02 17:17:23 -07008836 err =
8837 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008838 ASSERT_VK_SUCCESS(err);
8839 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07008840 image_create_info.usage =
8841 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8842 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
8843 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008844 ASSERT_VK_SUCCESS(err);
8845
8846 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008847 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8848 image_view_create_info.image = image_bad;
8849 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8850 image_view_create_info.format = tex_format_bad;
8851 image_view_create_info.subresourceRange.baseArrayLayer = 0;
8852 image_view_create_info.subresourceRange.baseMipLevel = 0;
8853 image_view_create_info.subresourceRange.layerCount = 1;
8854 image_view_create_info.subresourceRange.levelCount = 1;
8855 image_view_create_info.subresourceRange.aspectMask =
8856 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008857
8858 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008859 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8860 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008861
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008862 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008863
Chia-I Wuf7458c52015-10-26 21:10:41 +08008864 vkDestroyImage(m_device->device(), image_bad, NULL);
8865 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008866 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8867 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008868}
Tobin Ehliscde08892015-09-22 10:11:37 -06008869#endif // IMAGE_TESTS
8870
Tony Barbour300a6082015-04-07 13:44:53 -06008871int main(int argc, char **argv) {
8872 int result;
8873
Cody Northrop8e54a402016-03-08 22:25:52 -07008874#ifdef ANDROID
8875 int vulkanSupport = InitVulkan();
8876 if (vulkanSupport == 0)
8877 return 1;
8878#endif
8879
Tony Barbour300a6082015-04-07 13:44:53 -06008880 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06008881 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06008882
8883 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
8884
8885 result = RUN_ALL_TESTS();
8886
Tony Barbour6918cd52015-04-09 12:58:51 -06008887 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06008888 return result;
8889}