blob: fecc7374e790de1a28fdf7cdb57203c38f02f1db [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 vkFreeMemory(m_device->device(), mem, NULL);
3093 vkDestroyBuffer(m_device->device(), dyub, NULL);
3094
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);
3571 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
3572 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003573 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3574 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3575}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003576
Karl Schultz6addd812016-02-02 17:17:23 -07003577TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003578
Karl Schultz6addd812016-02-02 17:17:23 -07003579 m_errorMonitor->SetDesiredFailureMsg(
3580 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003581 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003582
3583 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003584 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003585 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003586 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003587
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003588 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003589}
3590
Karl Schultz6addd812016-02-02 17:17:23 -07003591TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3592 VkResult err;
3593 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003594
Karl Schultz6addd812016-02-02 17:17:23 -07003595 m_errorMonitor->SetDesiredFailureMsg(
3596 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003597 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003598
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003599 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003600
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003601 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003602 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003603 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003604 cmd.commandPool = m_commandPool;
3605 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003606 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003607
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003608 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003609 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003610
3611 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003612 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003613 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003614 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003615 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003616 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3617 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003618 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003619
3620 // The error should be caught by validation of the BeginCommandBuffer call
3621 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3622
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003623 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003624 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003625}
3626
Karl Schultz6addd812016-02-02 17:17:23 -07003627TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003628 // Cause error due to Begin while recording CB
3629 // Then cause 2 errors for attempting to reset CB w/o having
3630 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3631 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003633 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003634
3635 ASSERT_NO_FATAL_FAILURE(InitState());
3636
3637 // Calls AllocateCommandBuffers
3638 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3639
Karl Schultz6addd812016-02-02 17:17:23 -07003640 // Force the failure by setting the Renderpass and Framebuffer fields with
3641 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003642 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003643 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003644 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3645 cmd_buf_info.pNext = NULL;
3646 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003647 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003648
3649 // Begin CB to transition to recording state
3650 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3651 // Can't re-begin. This should trigger error
3652 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003653 m_errorMonitor->VerifyFound();
3654
Karl Schultz6addd812016-02-02 17:17:23 -07003655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3656 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003657 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3658 // Reset attempt will trigger error due to incorrect CommandPool state
3659 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003660 m_errorMonitor->VerifyFound();
3661
Karl Schultz6addd812016-02-02 17:17:23 -07003662 m_errorMonitor->SetDesiredFailureMsg(
3663 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3664 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003665 // Transition CB to RECORDED state
3666 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3667 // Now attempting to Begin will implicitly reset, which triggers error
3668 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003669 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003670}
3671
Karl Schultz6addd812016-02-02 17:17:23 -07003672TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003673 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003674 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003675
Karl Schultz6addd812016-02-02 17:17:23 -07003676 m_errorMonitor->SetDesiredFailureMsg(
3677 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003678 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3679
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003680 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003681 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003682
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003683 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003684 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3685 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003686
3687 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003688 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3689 ds_pool_ci.pNext = NULL;
3690 ds_pool_ci.maxSets = 1;
3691 ds_pool_ci.poolSizeCount = 1;
3692 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003693
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003694 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003695 err =
3696 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003697 ASSERT_VK_SUCCESS(err);
3698
Tony Barboureb254902015-07-15 12:50:33 -06003699 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003700 dsl_binding.binding = 0;
3701 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3702 dsl_binding.descriptorCount = 1;
3703 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3704 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003705
Tony Barboureb254902015-07-15 12:50:33 -06003706 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003707 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3708 ds_layout_ci.pNext = NULL;
3709 ds_layout_ci.bindingCount = 1;
3710 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003711
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003712 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003713 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3714 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003715 ASSERT_VK_SUCCESS(err);
3716
3717 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003718 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003719 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003720 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003721 alloc_info.descriptorPool = ds_pool;
3722 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003723 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3724 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003725 ASSERT_VK_SUCCESS(err);
3726
Tony Barboureb254902015-07-15 12:50:33 -06003727 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003728 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3729 pipeline_layout_ci.setLayoutCount = 1;
3730 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003731
3732 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003733 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3734 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003735 ASSERT_VK_SUCCESS(err);
3736
Tobin Ehlise68360f2015-10-01 11:15:13 -06003737 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07003738 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06003739
3740 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003741 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3742 vp_state_ci.scissorCount = 1;
3743 vp_state_ci.pScissors = &sc;
3744 vp_state_ci.viewportCount = 1;
3745 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003746
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003747 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3748 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3749 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3750 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3751 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3752 rs_state_ci.depthClampEnable = VK_FALSE;
3753 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3754 rs_state_ci.depthBiasEnable = VK_FALSE;
3755
Tony Barboureb254902015-07-15 12:50:33 -06003756 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003757 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3758 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003759 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003760 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3761 gp_ci.layout = pipeline_layout;
3762 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06003763
3764 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003765 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3766 pc_ci.initialDataSize = 0;
3767 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003768
3769 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003770 VkPipelineCache pipelineCache;
3771
Karl Schultz6addd812016-02-02 17:17:23 -07003772 err =
3773 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06003774 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003775 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3776 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003777
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003778 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003779
Chia-I Wuf7458c52015-10-26 21:10:41 +08003780 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3781 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3782 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3783 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003784}
Tobin Ehlis912df022015-09-17 08:46:18 -06003785/*// TODO : This test should be good, but needs Tess support in compiler to run
3786TEST_F(VkLayerTest, InvalidPatchControlPoints)
3787{
3788 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06003789 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003790
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003791 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003792 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
3793primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003794
Tobin Ehlis912df022015-09-17 08:46:18 -06003795 ASSERT_NO_FATAL_FAILURE(InitState());
3796 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06003797
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003798 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06003799 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003800 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003801
3802 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3803 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3804 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003805 ds_pool_ci.poolSizeCount = 1;
3806 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06003807
3808 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003809 err = vkCreateDescriptorPool(m_device->device(),
3810VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06003811 ASSERT_VK_SUCCESS(err);
3812
3813 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08003814 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06003815 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08003816 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003817 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3818 dsl_binding.pImmutableSamplers = NULL;
3819
3820 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003821 ds_layout_ci.sType =
3822VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003823 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003824 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003825 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06003826
3827 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003828 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3829&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003830 ASSERT_VK_SUCCESS(err);
3831
3832 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003833 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
3834VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06003835 ASSERT_VK_SUCCESS(err);
3836
3837 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003838 pipeline_layout_ci.sType =
3839VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003840 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003841 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003842 pipeline_layout_ci.pSetLayouts = &ds_layout;
3843
3844 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003845 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3846&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003847 ASSERT_VK_SUCCESS(err);
3848
3849 VkPipelineShaderStageCreateInfo shaderStages[3];
3850 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
3851
Karl Schultz6addd812016-02-02 17:17:23 -07003852 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
3853this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003854 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07003855 VkShaderObj
3856tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
3857this);
3858 VkShaderObj
3859te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
3860this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003861
Karl Schultz6addd812016-02-02 17:17:23 -07003862 shaderStages[0].sType =
3863VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003864 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003865 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003866 shaderStages[1].sType =
3867VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003868 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003869 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003870 shaderStages[2].sType =
3871VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003872 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003873 shaderStages[2].shader = te.handle();
3874
3875 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003876 iaCI.sType =
3877VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08003878 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06003879
3880 VkPipelineTessellationStateCreateInfo tsCI = {};
3881 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
3882 tsCI.patchControlPoints = 0; // This will cause an error
3883
3884 VkGraphicsPipelineCreateInfo gp_ci = {};
3885 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3886 gp_ci.pNext = NULL;
3887 gp_ci.stageCount = 3;
3888 gp_ci.pStages = shaderStages;
3889 gp_ci.pVertexInputState = NULL;
3890 gp_ci.pInputAssemblyState = &iaCI;
3891 gp_ci.pTessellationState = &tsCI;
3892 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003893 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06003894 gp_ci.pMultisampleState = NULL;
3895 gp_ci.pDepthStencilState = NULL;
3896 gp_ci.pColorBlendState = NULL;
3897 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3898 gp_ci.layout = pipeline_layout;
3899 gp_ci.renderPass = renderPass();
3900
3901 VkPipelineCacheCreateInfo pc_ci = {};
3902 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3903 pc_ci.pNext = NULL;
3904 pc_ci.initialSize = 0;
3905 pc_ci.initialData = 0;
3906 pc_ci.maxSize = 0;
3907
3908 VkPipeline pipeline;
3909 VkPipelineCache pipelineCache;
3910
Karl Schultz6addd812016-02-02 17:17:23 -07003911 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
3912&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06003913 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003914 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3915&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06003916
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003917 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003918
Chia-I Wuf7458c52015-10-26 21:10:41 +08003919 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3920 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3921 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3922 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06003923}
3924*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06003925// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07003926TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07003927 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003928
Karl Schultz6addd812016-02-02 17:17:23 -07003929 m_errorMonitor->SetDesiredFailureMsg(
3930 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003931 "Gfx Pipeline viewport count (1) must match scissor count (0).");
3932
Tobin Ehlise68360f2015-10-01 11:15:13 -06003933 ASSERT_NO_FATAL_FAILURE(InitState());
3934 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003935
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003936 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003937 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3938 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003939
3940 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003941 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3942 ds_pool_ci.maxSets = 1;
3943 ds_pool_ci.poolSizeCount = 1;
3944 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003945
3946 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003947 err =
3948 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003949 ASSERT_VK_SUCCESS(err);
3950
3951 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003952 dsl_binding.binding = 0;
3953 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3954 dsl_binding.descriptorCount = 1;
3955 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003956
3957 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003958 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3959 ds_layout_ci.bindingCount = 1;
3960 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003961
3962 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003963 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3964 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003965 ASSERT_VK_SUCCESS(err);
3966
3967 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003968 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003969 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003970 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003971 alloc_info.descriptorPool = ds_pool;
3972 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003973 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3974 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003975 ASSERT_VK_SUCCESS(err);
3976
3977 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003978 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3979 pipeline_layout_ci.setLayoutCount = 1;
3980 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003981
3982 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003983 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3984 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003985 ASSERT_VK_SUCCESS(err);
3986
3987 VkViewport vp = {}; // Just need dummy vp to point to
3988
3989 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003990 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3991 vp_state_ci.scissorCount = 0;
3992 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
3993 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003994
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003995 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3996 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3997 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3998 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3999 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4000 rs_state_ci.depthClampEnable = VK_FALSE;
4001 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4002 rs_state_ci.depthBiasEnable = VK_FALSE;
4003
Cody Northropeb3a6c12015-10-05 14:44:45 -06004004 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004005 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004006
Karl Schultz6addd812016-02-02 17:17:23 -07004007 VkShaderObj vs(m_device, bindStateVertShaderText,
4008 VK_SHADER_STAGE_VERTEX_BIT, this);
4009 VkShaderObj fs(m_device, bindStateFragShaderText,
4010 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004011 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004012 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004013 shaderStages[0] = vs.GetStageCreateInfo();
4014 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004015
4016 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004017 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4018 gp_ci.stageCount = 2;
4019 gp_ci.pStages = shaderStages;
4020 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004021 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004022 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4023 gp_ci.layout = pipeline_layout;
4024 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004025
4026 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004027 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004028
4029 VkPipeline pipeline;
4030 VkPipelineCache pipelineCache;
4031
Karl Schultz6addd812016-02-02 17:17:23 -07004032 err =
4033 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004034 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004035 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4036 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004037
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004038 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004039
Chia-I Wuf7458c52015-10-26 21:10:41 +08004040 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4041 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4042 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4043 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004044}
Karl Schultz6addd812016-02-02 17:17:23 -07004045// Don't set viewport state in PSO. This is an error b/c we always need this
4046// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06004047// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07004048TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06004049 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004050 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004051
Karl Schultz6addd812016-02-02 17:17:23 -07004052 m_errorMonitor->SetDesiredFailureMsg(
4053 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004054 "Gfx Pipeline pViewportState is null. Even if ");
4055
Tobin Ehlise68360f2015-10-01 11:15:13 -06004056 ASSERT_NO_FATAL_FAILURE(InitState());
4057 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004058
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004059 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004060 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4061 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004062
4063 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004064 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4065 ds_pool_ci.maxSets = 1;
4066 ds_pool_ci.poolSizeCount = 1;
4067 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004068
4069 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004070 err =
4071 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004072 ASSERT_VK_SUCCESS(err);
4073
4074 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004075 dsl_binding.binding = 0;
4076 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4077 dsl_binding.descriptorCount = 1;
4078 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004079
4080 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004081 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4082 ds_layout_ci.bindingCount = 1;
4083 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004084
4085 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004086 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4087 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004088 ASSERT_VK_SUCCESS(err);
4089
4090 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004091 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004092 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004093 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004094 alloc_info.descriptorPool = ds_pool;
4095 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004096 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4097 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004098 ASSERT_VK_SUCCESS(err);
4099
4100 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004101 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4102 pipeline_layout_ci.setLayoutCount = 1;
4103 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004104
4105 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004106 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4107 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004108 ASSERT_VK_SUCCESS(err);
4109
4110 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4111 // Set scissor as dynamic to avoid second error
4112 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004113 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4114 dyn_state_ci.dynamicStateCount = 1;
4115 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004116
Cody Northropeb3a6c12015-10-05 14:44:45 -06004117 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004118 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004119
Karl Schultz6addd812016-02-02 17:17:23 -07004120 VkShaderObj vs(m_device, bindStateVertShaderText,
4121 VK_SHADER_STAGE_VERTEX_BIT, this);
4122 VkShaderObj fs(m_device, bindStateFragShaderText,
4123 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004124 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004125 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004126 shaderStages[0] = vs.GetStageCreateInfo();
4127 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004128
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004129
4130 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4131 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4132 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4133 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4134 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4135 rs_state_ci.depthClampEnable = VK_FALSE;
4136 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4137 rs_state_ci.depthBiasEnable = VK_FALSE;
4138
Tobin Ehlise68360f2015-10-01 11:15:13 -06004139 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004140 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4141 gp_ci.stageCount = 2;
4142 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004143 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004144 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
4145 // should cause validation error
4146 gp_ci.pDynamicState = &dyn_state_ci;
4147 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4148 gp_ci.layout = pipeline_layout;
4149 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004150
4151 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004152 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004153
4154 VkPipeline pipeline;
4155 VkPipelineCache pipelineCache;
4156
Karl Schultz6addd812016-02-02 17:17:23 -07004157 err =
4158 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004159 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004160 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4161 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004162
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004163 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004164
Chia-I Wuf7458c52015-10-26 21:10:41 +08004165 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4166 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4167 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4168 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004169}
4170// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07004171// Then run second test where dynamic scissor count doesn't match PSO scissor
4172// count
4173TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
4174 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004175
Karl Schultz6addd812016-02-02 17:17:23 -07004176 m_errorMonitor->SetDesiredFailureMsg(
4177 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004178 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
4179
Tobin Ehlise68360f2015-10-01 11:15:13 -06004180 ASSERT_NO_FATAL_FAILURE(InitState());
4181 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004182
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004183 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004184 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4185 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004186
4187 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004188 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4189 ds_pool_ci.maxSets = 1;
4190 ds_pool_ci.poolSizeCount = 1;
4191 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004192
4193 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004194 err =
4195 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004196 ASSERT_VK_SUCCESS(err);
4197
4198 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004199 dsl_binding.binding = 0;
4200 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4201 dsl_binding.descriptorCount = 1;
4202 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004203
4204 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004205 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4206 ds_layout_ci.bindingCount = 1;
4207 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004208
4209 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004210 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4211 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004212 ASSERT_VK_SUCCESS(err);
4213
4214 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004215 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004216 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004217 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004218 alloc_info.descriptorPool = ds_pool;
4219 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004220 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4221 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004222 ASSERT_VK_SUCCESS(err);
4223
4224 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004225 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4226 pipeline_layout_ci.setLayoutCount = 1;
4227 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004228
4229 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004230 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4231 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004232 ASSERT_VK_SUCCESS(err);
4233
4234 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004235 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4236 vp_state_ci.viewportCount = 1;
4237 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
4238 vp_state_ci.scissorCount = 1;
4239 vp_state_ci.pScissors =
4240 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06004241
4242 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4243 // Set scissor as dynamic to avoid that error
4244 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004245 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4246 dyn_state_ci.dynamicStateCount = 1;
4247 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004248
Cody Northropeb3a6c12015-10-05 14:44:45 -06004249 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004250 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004251
Karl Schultz6addd812016-02-02 17:17:23 -07004252 VkShaderObj vs(m_device, bindStateVertShaderText,
4253 VK_SHADER_STAGE_VERTEX_BIT, this);
4254 VkShaderObj fs(m_device, bindStateFragShaderText,
4255 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004256 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004257 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004258 shaderStages[0] = vs.GetStageCreateInfo();
4259 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004260
Cody Northropf6622dc2015-10-06 10:33:21 -06004261 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4262 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4263 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004264 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004265 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004266 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004267 vi_ci.pVertexAttributeDescriptions = nullptr;
4268
4269 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4270 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4271 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4272
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004273 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004274 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06004275 rs_ci.pNext = nullptr;
4276
Mark Youngc89c6312016-03-31 16:03:20 -06004277 VkPipelineColorBlendAttachmentState att = {};
4278 att.blendEnable = VK_FALSE;
4279 att.colorWriteMask = 0xf;
4280
Cody Northropf6622dc2015-10-06 10:33:21 -06004281 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4282 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4283 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004284 cb_ci.attachmentCount = 1;
4285 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06004286
Tobin Ehlise68360f2015-10-01 11:15:13 -06004287 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004288 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4289 gp_ci.stageCount = 2;
4290 gp_ci.pStages = shaderStages;
4291 gp_ci.pVertexInputState = &vi_ci;
4292 gp_ci.pInputAssemblyState = &ia_ci;
4293 gp_ci.pViewportState = &vp_state_ci;
4294 gp_ci.pRasterizationState = &rs_ci;
4295 gp_ci.pColorBlendState = &cb_ci;
4296 gp_ci.pDynamicState = &dyn_state_ci;
4297 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4298 gp_ci.layout = pipeline_layout;
4299 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004300
4301 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004302 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004303
4304 VkPipeline pipeline;
4305 VkPipelineCache pipelineCache;
4306
Karl Schultz6addd812016-02-02 17:17:23 -07004307 err =
4308 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004309 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004310 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4311 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004312
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004313 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004314
Tobin Ehlisd332f282015-10-02 11:00:56 -06004315 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07004316 // First need to successfully create the PSO from above by setting
4317 // pViewports
4318 m_errorMonitor->SetDesiredFailureMsg(
4319 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4320 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
4321 "scissorCount is 1. These counts must match.");
4322
4323 VkViewport vp = {}; // Just need dummy vp to point to
4324 vp_state_ci.pViewports = &vp;
4325 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4326 &gp_ci, NULL, &pipeline);
4327 ASSERT_VK_SUCCESS(err);
4328 BeginCommandBuffer();
4329 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4330 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4331 VkRect2D scissors[2] = {}; // don't care about data
4332 // Count of 2 doesn't match PSO count of 1
4333 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
4334 Draw(1, 0, 0, 0);
4335
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004336 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004337
4338 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4339 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4340 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4341 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4342}
4343// Create PSO w/o non-zero scissorCount but no scissor data
4344// Then run second test where dynamic viewportCount doesn't match PSO
4345// viewportCount
4346TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
4347 VkResult err;
4348
4349 m_errorMonitor->SetDesiredFailureMsg(
4350 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4351 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
4352
4353 ASSERT_NO_FATAL_FAILURE(InitState());
4354 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4355
4356 VkDescriptorPoolSize ds_type_count = {};
4357 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4358 ds_type_count.descriptorCount = 1;
4359
4360 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4361 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4362 ds_pool_ci.maxSets = 1;
4363 ds_pool_ci.poolSizeCount = 1;
4364 ds_pool_ci.pPoolSizes = &ds_type_count;
4365
4366 VkDescriptorPool ds_pool;
4367 err =
4368 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4369 ASSERT_VK_SUCCESS(err);
4370
4371 VkDescriptorSetLayoutBinding dsl_binding = {};
4372 dsl_binding.binding = 0;
4373 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4374 dsl_binding.descriptorCount = 1;
4375 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4376
4377 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4378 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4379 ds_layout_ci.bindingCount = 1;
4380 ds_layout_ci.pBindings = &dsl_binding;
4381
4382 VkDescriptorSetLayout ds_layout;
4383 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4384 &ds_layout);
4385 ASSERT_VK_SUCCESS(err);
4386
4387 VkDescriptorSet descriptorSet;
4388 VkDescriptorSetAllocateInfo alloc_info = {};
4389 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4390 alloc_info.descriptorSetCount = 1;
4391 alloc_info.descriptorPool = ds_pool;
4392 alloc_info.pSetLayouts = &ds_layout;
4393 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4394 &descriptorSet);
4395 ASSERT_VK_SUCCESS(err);
4396
4397 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4398 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4399 pipeline_layout_ci.setLayoutCount = 1;
4400 pipeline_layout_ci.pSetLayouts = &ds_layout;
4401
4402 VkPipelineLayout pipeline_layout;
4403 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4404 &pipeline_layout);
4405 ASSERT_VK_SUCCESS(err);
4406
4407 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4408 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4409 vp_state_ci.scissorCount = 1;
4410 vp_state_ci.pScissors =
4411 NULL; // Null scissor w/ count of 1 should cause error
4412 vp_state_ci.viewportCount = 1;
4413 vp_state_ci.pViewports =
4414 NULL; // vp is dynamic (below) so this won't cause error
4415
4416 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
4417 // Set scissor as dynamic to avoid that error
4418 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4419 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4420 dyn_state_ci.dynamicStateCount = 1;
4421 dyn_state_ci.pDynamicStates = &vp_state;
4422
4423 VkPipelineShaderStageCreateInfo shaderStages[2];
4424 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4425
4426 VkShaderObj vs(m_device, bindStateVertShaderText,
4427 VK_SHADER_STAGE_VERTEX_BIT, this);
4428 VkShaderObj fs(m_device, bindStateFragShaderText,
4429 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004430 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004431 // but add it to be able to run on more devices
4432 shaderStages[0] = vs.GetStageCreateInfo();
4433 shaderStages[1] = fs.GetStageCreateInfo();
4434
4435 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4436 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4437 vi_ci.pNext = nullptr;
4438 vi_ci.vertexBindingDescriptionCount = 0;
4439 vi_ci.pVertexBindingDescriptions = nullptr;
4440 vi_ci.vertexAttributeDescriptionCount = 0;
4441 vi_ci.pVertexAttributeDescriptions = nullptr;
4442
4443 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4444 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4445 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4446
4447 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4448 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4449 rs_ci.pNext = nullptr;
4450
Mark Youngc89c6312016-03-31 16:03:20 -06004451 VkPipelineColorBlendAttachmentState att = {};
4452 att.blendEnable = VK_FALSE;
4453 att.colorWriteMask = 0xf;
4454
Karl Schultz6addd812016-02-02 17:17:23 -07004455 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4456 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4457 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004458 cb_ci.attachmentCount = 1;
4459 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004460
4461 VkGraphicsPipelineCreateInfo gp_ci = {};
4462 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4463 gp_ci.stageCount = 2;
4464 gp_ci.pStages = shaderStages;
4465 gp_ci.pVertexInputState = &vi_ci;
4466 gp_ci.pInputAssemblyState = &ia_ci;
4467 gp_ci.pViewportState = &vp_state_ci;
4468 gp_ci.pRasterizationState = &rs_ci;
4469 gp_ci.pColorBlendState = &cb_ci;
4470 gp_ci.pDynamicState = &dyn_state_ci;
4471 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4472 gp_ci.layout = pipeline_layout;
4473 gp_ci.renderPass = renderPass();
4474
4475 VkPipelineCacheCreateInfo pc_ci = {};
4476 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4477
4478 VkPipeline pipeline;
4479 VkPipelineCache pipelineCache;
4480
4481 err =
4482 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4483 ASSERT_VK_SUCCESS(err);
4484 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4485 &gp_ci, NULL, &pipeline);
4486
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004487 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004488
4489 // Now hit second fail case where we set scissor w/ different count than PSO
4490 // First need to successfully create the PSO from above by setting
4491 // pViewports
4492 m_errorMonitor->SetDesiredFailureMsg(
4493 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4494 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4495 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004496
Tobin Ehlisd332f282015-10-02 11:00:56 -06004497 VkRect2D sc = {}; // Just need dummy vp to point to
4498 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004499 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4500 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004501 ASSERT_VK_SUCCESS(err);
4502 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004503 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4504 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004505 VkViewport viewports[2] = {}; // don't care about data
4506 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004507 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004508 Draw(1, 0, 0, 0);
4509
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004510 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004511
Chia-I Wuf7458c52015-10-26 21:10:41 +08004512 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4513 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4514 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4515 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004516}
4517
Mark Young7394fdd2016-03-31 14:56:43 -06004518TEST_F(VkLayerTest, PSOLineWidthInvalid) {
4519 VkResult err;
4520
4521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004522 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004523
4524 ASSERT_NO_FATAL_FAILURE(InitState());
4525 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4526
4527 VkDescriptorPoolSize ds_type_count = {};
4528 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4529 ds_type_count.descriptorCount = 1;
4530
4531 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4532 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4533 ds_pool_ci.maxSets = 1;
4534 ds_pool_ci.poolSizeCount = 1;
4535 ds_pool_ci.pPoolSizes = &ds_type_count;
4536
4537 VkDescriptorPool ds_pool;
4538 err =
4539 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4540 ASSERT_VK_SUCCESS(err);
4541
4542 VkDescriptorSetLayoutBinding dsl_binding = {};
4543 dsl_binding.binding = 0;
4544 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4545 dsl_binding.descriptorCount = 1;
4546 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4547
4548 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4549 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4550 ds_layout_ci.bindingCount = 1;
4551 ds_layout_ci.pBindings = &dsl_binding;
4552
4553 VkDescriptorSetLayout ds_layout;
4554 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4555 &ds_layout);
4556 ASSERT_VK_SUCCESS(err);
4557
4558 VkDescriptorSet descriptorSet;
4559 VkDescriptorSetAllocateInfo alloc_info = {};
4560 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4561 alloc_info.descriptorSetCount = 1;
4562 alloc_info.descriptorPool = ds_pool;
4563 alloc_info.pSetLayouts = &ds_layout;
4564 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4565 &descriptorSet);
4566 ASSERT_VK_SUCCESS(err);
4567
4568 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4569 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4570 pipeline_layout_ci.setLayoutCount = 1;
4571 pipeline_layout_ci.pSetLayouts = &ds_layout;
4572
4573 VkPipelineLayout pipeline_layout;
4574 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4575 &pipeline_layout);
4576 ASSERT_VK_SUCCESS(err);
4577
4578 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4579 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4580 vp_state_ci.scissorCount = 1;
4581 vp_state_ci.pScissors = NULL;
4582 vp_state_ci.viewportCount = 1;
4583 vp_state_ci.pViewports = NULL;
4584
4585 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
4586 VK_DYNAMIC_STATE_SCISSOR,
4587 VK_DYNAMIC_STATE_LINE_WIDTH};
4588 // Set scissor as dynamic to avoid that error
4589 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4590 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4591 dyn_state_ci.dynamicStateCount = 2;
4592 dyn_state_ci.pDynamicStates = dynamic_states;
4593
4594 VkPipelineShaderStageCreateInfo shaderStages[2];
4595 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4596
4597 VkShaderObj vs(m_device, bindStateVertShaderText,
4598 VK_SHADER_STAGE_VERTEX_BIT, this);
4599 VkShaderObj fs(m_device, bindStateFragShaderText,
4600 VK_SHADER_STAGE_FRAGMENT_BIT,
4601 this); // TODO - We shouldn't need a fragment shader
4602 // but add it to be able to run on more devices
4603 shaderStages[0] = vs.GetStageCreateInfo();
4604 shaderStages[1] = fs.GetStageCreateInfo();
4605
4606 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4607 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4608 vi_ci.pNext = nullptr;
4609 vi_ci.vertexBindingDescriptionCount = 0;
4610 vi_ci.pVertexBindingDescriptions = nullptr;
4611 vi_ci.vertexAttributeDescriptionCount = 0;
4612 vi_ci.pVertexAttributeDescriptions = nullptr;
4613
4614 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4615 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4616 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4617
4618 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4619 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4620 rs_ci.pNext = nullptr;
4621
Mark Young47107952016-05-02 15:59:55 -06004622 // Check too low (line width of -1.0f).
4623 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06004624
4625 VkPipelineColorBlendAttachmentState att = {};
4626 att.blendEnable = VK_FALSE;
4627 att.colorWriteMask = 0xf;
4628
4629 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4630 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4631 cb_ci.pNext = nullptr;
4632 cb_ci.attachmentCount = 1;
4633 cb_ci.pAttachments = &att;
4634
4635 VkGraphicsPipelineCreateInfo gp_ci = {};
4636 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4637 gp_ci.stageCount = 2;
4638 gp_ci.pStages = shaderStages;
4639 gp_ci.pVertexInputState = &vi_ci;
4640 gp_ci.pInputAssemblyState = &ia_ci;
4641 gp_ci.pViewportState = &vp_state_ci;
4642 gp_ci.pRasterizationState = &rs_ci;
4643 gp_ci.pColorBlendState = &cb_ci;
4644 gp_ci.pDynamicState = &dyn_state_ci;
4645 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4646 gp_ci.layout = pipeline_layout;
4647 gp_ci.renderPass = renderPass();
4648
4649 VkPipelineCacheCreateInfo pc_ci = {};
4650 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4651
4652 VkPipeline pipeline;
4653 VkPipelineCache pipelineCache;
4654
4655 err =
4656 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4657 ASSERT_VK_SUCCESS(err);
4658 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4659 &gp_ci, NULL, &pipeline);
4660
4661 m_errorMonitor->VerifyFound();
4662
4663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4664 "Attempt to set lineWidth to 65536");
4665
4666 // Check too high (line width of 65536.0f).
4667 rs_ci.lineWidth = 65536.0f;
4668
4669 err =
4670 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4671 ASSERT_VK_SUCCESS(err);
4672 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4673 &gp_ci, NULL, &pipeline);
4674
4675 m_errorMonitor->VerifyFound();
4676
4677 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004678 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004679
4680 dyn_state_ci.dynamicStateCount = 3;
4681
4682 rs_ci.lineWidth = 1.0f;
4683
4684 err =
4685 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4686 ASSERT_VK_SUCCESS(err);
4687 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4688 &gp_ci, NULL, &pipeline);
4689 BeginCommandBuffer();
4690 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4691 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4692
4693 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06004694 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06004695 m_errorMonitor->VerifyFound();
4696
4697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4698 "Attempt to set lineWidth to 65536");
4699
4700 // Check too high with dynamic setting.
4701 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
4702 m_errorMonitor->VerifyFound();
4703 EndCommandBuffer();
4704
4705 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4706 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4707 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4708 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4709}
4710
Karl Schultz6addd812016-02-02 17:17:23 -07004711TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004712 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004713 m_errorMonitor->SetDesiredFailureMsg(
4714 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004715 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004716
4717 ASSERT_NO_FATAL_FAILURE(InitState());
4718 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004719
Tony Barbourfe3351b2015-07-28 10:17:20 -06004720 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004721 // Don't care about RenderPass handle b/c error should be flagged before
4722 // that
4723 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
4724 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004725
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004726 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004727}
4728
Karl Schultz6addd812016-02-02 17:17:23 -07004729TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004730 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004731 m_errorMonitor->SetDesiredFailureMsg(
4732 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004733 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004734
4735 ASSERT_NO_FATAL_FAILURE(InitState());
4736 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004737
Tony Barbourfe3351b2015-07-28 10:17:20 -06004738 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004739 // Just create a dummy Renderpass that's non-NULL so we can get to the
4740 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06004741 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004742 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4743 rp_begin.pNext = NULL;
4744 rp_begin.renderPass = renderPass();
4745 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004746
Karl Schultz6addd812016-02-02 17:17:23 -07004747 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
4748 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004749
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004750 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004751}
4752
Karl Schultz6addd812016-02-02 17:17:23 -07004753TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004754 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004755 m_errorMonitor->SetDesiredFailureMsg(
4756 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004757 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004758
4759 ASSERT_NO_FATAL_FAILURE(InitState());
4760 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004761
4762 // Renderpass is started here
4763 BeginCommandBuffer();
4764
4765 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004766 vk_testing::Buffer dstBuffer;
4767 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004768
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004769 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004770
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004771 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004772}
4773
Karl Schultz6addd812016-02-02 17:17:23 -07004774TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004775 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004776 m_errorMonitor->SetDesiredFailureMsg(
4777 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004778 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004779
4780 ASSERT_NO_FATAL_FAILURE(InitState());
4781 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004782
4783 // Renderpass is started here
4784 BeginCommandBuffer();
4785
4786 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004787 vk_testing::Buffer dstBuffer;
4788 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004789
Karl Schultz6addd812016-02-02 17:17:23 -07004790 VkDeviceSize dstOffset = 0;
4791 VkDeviceSize dataSize = 1024;
4792 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004793
Karl Schultz6addd812016-02-02 17:17:23 -07004794 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
4795 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004796
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004797 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004798}
4799
Karl Schultz6addd812016-02-02 17:17:23 -07004800TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004801 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004802 m_errorMonitor->SetDesiredFailureMsg(
4803 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004804 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004805
4806 ASSERT_NO_FATAL_FAILURE(InitState());
4807 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004808
4809 // Renderpass is started here
4810 BeginCommandBuffer();
4811
Michael Lentine0a369f62016-02-03 16:51:46 -06004812 VkClearColorValue clear_color;
4813 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07004814 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
4815 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4816 const int32_t tex_width = 32;
4817 const int32_t tex_height = 32;
4818 VkImageCreateInfo image_create_info = {};
4819 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4820 image_create_info.pNext = NULL;
4821 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4822 image_create_info.format = tex_format;
4823 image_create_info.extent.width = tex_width;
4824 image_create_info.extent.height = tex_height;
4825 image_create_info.extent.depth = 1;
4826 image_create_info.mipLevels = 1;
4827 image_create_info.arrayLayers = 1;
4828 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4829 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4830 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004831
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004832 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004833 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4834 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004835
Karl Schultz6addd812016-02-02 17:17:23 -07004836 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4837 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004838
Karl Schultz6addd812016-02-02 17:17:23 -07004839 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4840 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004841
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004842 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004843}
4844
Karl Schultz6addd812016-02-02 17:17:23 -07004845TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004846 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004847 m_errorMonitor->SetDesiredFailureMsg(
4848 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004849 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004850
4851 ASSERT_NO_FATAL_FAILURE(InitState());
4852 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004853
4854 // Renderpass is started here
4855 BeginCommandBuffer();
4856
4857 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07004858 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004859 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
4860 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4861 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
4862 image_create_info.extent.width = 64;
4863 image_create_info.extent.height = 64;
4864 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4865 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004866
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004867 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004868 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4869 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004870
Karl Schultz6addd812016-02-02 17:17:23 -07004871 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4872 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004873
Karl Schultz6addd812016-02-02 17:17:23 -07004874 vkCmdClearDepthStencilImage(
4875 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4876 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
4877 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004878
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004879 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004880}
4881
Karl Schultz6addd812016-02-02 17:17:23 -07004882TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004883 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004884 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004885
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004887 "vkCmdClearAttachments: This call "
4888 "must be issued inside an active "
4889 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004890
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004891 ASSERT_NO_FATAL_FAILURE(InitState());
4892 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004893
4894 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004895 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004896 ASSERT_VK_SUCCESS(err);
4897
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004898 VkClearAttachment color_attachment;
4899 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4900 color_attachment.clearValue.color.float32[0] = 0;
4901 color_attachment.clearValue.color.float32[1] = 0;
4902 color_attachment.clearValue.color.float32[2] = 0;
4903 color_attachment.clearValue.color.float32[3] = 0;
4904 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004905 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
4906 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4907 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004908
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004909 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004910}
4911
Karl Schultz9e66a292016-04-21 15:57:51 -06004912TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
4913 // Try to add a buffer memory barrier with no buffer.
4914 m_errorMonitor->SetDesiredFailureMsg(
4915 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4916 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
4917
4918 ASSERT_NO_FATAL_FAILURE(InitState());
4919 BeginCommandBuffer();
4920
4921 VkBufferMemoryBarrier buf_barrier = {};
4922 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
4923 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4924 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4925 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4926 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4927 buf_barrier.buffer = VK_NULL_HANDLE;
4928 buf_barrier.offset = 0;
4929 buf_barrier.size = VK_WHOLE_SIZE;
4930 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4931 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
4932 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
4933
4934 m_errorMonitor->VerifyFound();
4935}
4936
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06004937TEST_F(VkLayerTest, InvalidBarriers) {
4938 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
4939
4940 m_errorMonitor->SetDesiredFailureMsg(
4941 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
4942
4943 ASSERT_NO_FATAL_FAILURE(InitState());
4944 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4945
4946 VkMemoryBarrier mem_barrier = {};
4947 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
4948 mem_barrier.pNext = NULL;
4949 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4950 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4951 BeginCommandBuffer();
4952 // BeginCommandBuffer() starts a render pass
4953 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4954 VK_PIPELINE_STAGE_HOST_BIT,
4955 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
4956 &mem_barrier, 0, nullptr, 0, nullptr);
4957 m_errorMonitor->VerifyFound();
4958
4959 m_errorMonitor->SetDesiredFailureMsg(
4960 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4961 "Image Layout cannot be transitioned to UNDEFINED");
4962 VkImageObj image(m_device);
4963 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
4964 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4965 ASSERT_TRUE(image.initialized());
4966 VkImageMemoryBarrier img_barrier = {};
4967 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4968 img_barrier.pNext = NULL;
4969 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
4970 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4971 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
4972 // New layout can't be UNDEFINED
4973 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4974 img_barrier.image = image.handle();
4975 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4976 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
4977 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4978 img_barrier.subresourceRange.baseArrayLayer = 0;
4979 img_barrier.subresourceRange.baseMipLevel = 0;
4980 img_barrier.subresourceRange.layerCount = 1;
4981 img_barrier.subresourceRange.levelCount = 1;
4982 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4983 VK_PIPELINE_STAGE_HOST_BIT,
4984 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
4985 nullptr, 1, &img_barrier);
4986 m_errorMonitor->VerifyFound();
4987 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
4988
4989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4990 "Subresource must have the sum of the "
4991 "baseArrayLayer");
4992 // baseArrayLayer + layerCount must be <= image's arrayLayers
4993 img_barrier.subresourceRange.baseArrayLayer = 1;
4994 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
4995 VK_PIPELINE_STAGE_HOST_BIT,
4996 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
4997 nullptr, 1, &img_barrier);
4998 m_errorMonitor->VerifyFound();
4999 img_barrier.subresourceRange.baseArrayLayer = 0;
5000
5001 m_errorMonitor->SetDesiredFailureMsg(
5002 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5003 "Subresource must have the sum of the baseMipLevel");
5004 // baseMipLevel + levelCount must be <= image's mipLevels
5005 img_barrier.subresourceRange.baseMipLevel = 1;
5006 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5007 VK_PIPELINE_STAGE_HOST_BIT,
5008 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5009 nullptr, 1, &img_barrier);
5010 m_errorMonitor->VerifyFound();
5011 img_barrier.subresourceRange.baseMipLevel = 0;
5012
5013 m_errorMonitor->SetDesiredFailureMsg(
5014 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5015 "Buffer Barriers cannot be used during a render pass");
5016 vk_testing::Buffer buffer;
5017 buffer.init(*m_device, 256);
5018 VkBufferMemoryBarrier buf_barrier = {};
5019 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5020 buf_barrier.pNext = NULL;
5021 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5022 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5023 buf_barrier.buffer = buffer.handle();
5024 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5025 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5026 buf_barrier.offset = 0;
5027 buf_barrier.size = VK_WHOLE_SIZE;
5028 // Can't send buffer barrier during a render pass
5029 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5030 VK_PIPELINE_STAGE_HOST_BIT,
5031 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5032 &buf_barrier, 0, nullptr);
5033 m_errorMonitor->VerifyFound();
5034 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
5035
5036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5037 "which is not less than total size");
5038 buf_barrier.offset = 257;
5039 // Offset greater than total size
5040 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5041 VK_PIPELINE_STAGE_HOST_BIT,
5042 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5043 &buf_barrier, 0, nullptr);
5044 m_errorMonitor->VerifyFound();
5045 buf_barrier.offset = 0;
5046
5047 m_errorMonitor->SetDesiredFailureMsg(
5048 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
5049 buf_barrier.size = 257;
5050 // Size greater than total size
5051 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5052 VK_PIPELINE_STAGE_HOST_BIT,
5053 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5054 &buf_barrier, 0, nullptr);
5055 m_errorMonitor->VerifyFound();
5056 buf_barrier.size = VK_WHOLE_SIZE;
5057
5058 m_errorMonitor->SetDesiredFailureMsg(
5059 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5060 "Image is a depth and stencil format and thus must "
5061 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
5062 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
5063 VkDepthStencilObj ds_image(m_device);
5064 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
5065 ASSERT_TRUE(ds_image.initialized());
5066 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5067 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
5068 img_barrier.image = ds_image.handle();
5069 // Leave aspectMask at COLOR on purpose
5070 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5071 VK_PIPELINE_STAGE_HOST_BIT,
5072 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5073 nullptr, 1, &img_barrier);
5074 m_errorMonitor->VerifyFound();
5075}
5076
Karl Schultz6addd812016-02-02 17:17:23 -07005077TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005078 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005079 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005080
Karl Schultz6addd812016-02-02 17:17:23 -07005081 m_errorMonitor->SetDesiredFailureMsg(
5082 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005083 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
5084
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005085 ASSERT_NO_FATAL_FAILURE(InitState());
5086 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005087 uint32_t qfi = 0;
5088 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005089 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5090 buffCI.size = 1024;
5091 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5092 buffCI.queueFamilyIndexCount = 1;
5093 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005094
5095 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005096 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005097 ASSERT_VK_SUCCESS(err);
5098
5099 BeginCommandBuffer();
5100 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005101 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5102 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005103 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07005104 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
5105 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005106
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005107 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005108
Chia-I Wuf7458c52015-10-26 21:10:41 +08005109 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005110}
5111
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005112TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
5113 // Create an out-of-range queueFamilyIndex
5114 m_errorMonitor->SetDesiredFailureMsg(
5115 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06005116 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005117
5118 ASSERT_NO_FATAL_FAILURE(InitState());
5119 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5120 VkBufferCreateInfo buffCI = {};
5121 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5122 buffCI.size = 1024;
5123 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5124 buffCI.queueFamilyIndexCount = 1;
5125 // Introduce failure by specifying invalid queue_family_index
5126 uint32_t qfi = 777;
5127 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06005128 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005129
5130 VkBuffer ib;
5131 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
5132
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005133 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005134}
5135
Karl Schultz6addd812016-02-02 17:17:23 -07005136TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
5137 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
5138 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005139
Karl Schultz6addd812016-02-02 17:17:23 -07005140 m_errorMonitor->SetDesiredFailureMsg(
5141 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005142 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005143
5144 ASSERT_NO_FATAL_FAILURE(InitState());
5145 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005146
5147 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005148 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005149 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
5150 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005151
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005152 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005153}
5154
Karl Schultz6addd812016-02-02 17:17:23 -07005155TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005156 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07005157 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005158
Karl Schultz6addd812016-02-02 17:17:23 -07005159 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005160 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5161 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
5162 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005163
Tobin Ehlis3b780662015-05-28 12:11:26 -06005164 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005165 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005166 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005167 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5168 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005169
5170 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005171 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5172 ds_pool_ci.pNext = NULL;
5173 ds_pool_ci.maxSets = 1;
5174 ds_pool_ci.poolSizeCount = 1;
5175 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005176
Tobin Ehlis3b780662015-05-28 12:11:26 -06005177 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005178 err =
5179 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005180 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005181 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005182 dsl_binding.binding = 0;
5183 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5184 dsl_binding.descriptorCount = 1;
5185 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5186 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005187
Tony Barboureb254902015-07-15 12:50:33 -06005188 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005189 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5190 ds_layout_ci.pNext = NULL;
5191 ds_layout_ci.bindingCount = 1;
5192 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005193
Tobin Ehlis3b780662015-05-28 12:11:26 -06005194 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005195 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5196 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005197 ASSERT_VK_SUCCESS(err);
5198
5199 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005200 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005201 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005202 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005203 alloc_info.descriptorPool = ds_pool;
5204 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005205 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5206 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005207 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005208
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005209 VkSamplerCreateInfo sampler_ci = {};
5210 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5211 sampler_ci.pNext = NULL;
5212 sampler_ci.magFilter = VK_FILTER_NEAREST;
5213 sampler_ci.minFilter = VK_FILTER_NEAREST;
5214 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5215 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5216 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5217 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5218 sampler_ci.mipLodBias = 1.0;
5219 sampler_ci.anisotropyEnable = VK_FALSE;
5220 sampler_ci.maxAnisotropy = 1;
5221 sampler_ci.compareEnable = VK_FALSE;
5222 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5223 sampler_ci.minLod = 1.0;
5224 sampler_ci.maxLod = 1.0;
5225 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5226 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5227 VkSampler sampler;
5228 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5229 ASSERT_VK_SUCCESS(err);
5230
5231 VkDescriptorImageInfo info = {};
5232 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005233
5234 VkWriteDescriptorSet descriptor_write;
5235 memset(&descriptor_write, 0, sizeof(descriptor_write));
5236 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005237 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005238 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005239 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005240 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005241 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005242
5243 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5244
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005245 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005246
Chia-I Wuf7458c52015-10-26 21:10:41 +08005247 vkDestroySampler(m_device->device(), sampler, NULL);
5248 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5249 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005250}
5251
Karl Schultz6addd812016-02-02 17:17:23 -07005252TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005253 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07005254 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005255
Karl Schultz6addd812016-02-02 17:17:23 -07005256 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005257 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5258 " binding #0 with 1 total descriptors but update of 1 descriptors "
5259 "starting at binding offset of 0 combined with update array element "
5260 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005261
Tobin Ehlis3b780662015-05-28 12:11:26 -06005262 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005263 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005264 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005265 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5266 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005267
5268 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005269 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5270 ds_pool_ci.pNext = NULL;
5271 ds_pool_ci.maxSets = 1;
5272 ds_pool_ci.poolSizeCount = 1;
5273 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005274
Tobin Ehlis3b780662015-05-28 12:11:26 -06005275 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005276 err =
5277 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005278 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005279
Tony Barboureb254902015-07-15 12:50:33 -06005280 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005281 dsl_binding.binding = 0;
5282 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5283 dsl_binding.descriptorCount = 1;
5284 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5285 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005286
5287 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005288 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5289 ds_layout_ci.pNext = NULL;
5290 ds_layout_ci.bindingCount = 1;
5291 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005292
Tobin Ehlis3b780662015-05-28 12:11:26 -06005293 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005294 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5295 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005296 ASSERT_VK_SUCCESS(err);
5297
5298 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005299 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005300 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005301 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005302 alloc_info.descriptorPool = ds_pool;
5303 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005304 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5305 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005306 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005307
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005308 // Correctly update descriptor to avoid "NOT_UPDATED" error
5309 VkDescriptorBufferInfo buff_info = {};
5310 buff_info.buffer =
5311 VkBuffer(0); // Don't care about buffer handle for this test
5312 buff_info.offset = 0;
5313 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005314
5315 VkWriteDescriptorSet descriptor_write;
5316 memset(&descriptor_write, 0, sizeof(descriptor_write));
5317 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005318 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005319 descriptor_write.dstArrayElement =
5320 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08005321 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005322 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5323 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005324
5325 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5326
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005327 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005328
Chia-I Wuf7458c52015-10-26 21:10:41 +08005329 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5330 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005331}
5332
Karl Schultz6addd812016-02-02 17:17:23 -07005333TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
5334 // Create layout w/ count of 1 and attempt update to that layout w/ binding
5335 // index 2
5336 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005337
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5339 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005340
Tobin Ehlis3b780662015-05-28 12:11:26 -06005341 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005342 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005343 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005344 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5345 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005346
5347 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005348 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5349 ds_pool_ci.pNext = NULL;
5350 ds_pool_ci.maxSets = 1;
5351 ds_pool_ci.poolSizeCount = 1;
5352 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005353
Tobin Ehlis3b780662015-05-28 12:11:26 -06005354 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005355 err =
5356 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005357 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005358
Tony Barboureb254902015-07-15 12:50:33 -06005359 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005360 dsl_binding.binding = 0;
5361 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5362 dsl_binding.descriptorCount = 1;
5363 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5364 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005365
5366 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005367 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5368 ds_layout_ci.pNext = NULL;
5369 ds_layout_ci.bindingCount = 1;
5370 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005371 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005372 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5373 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005374 ASSERT_VK_SUCCESS(err);
5375
5376 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005377 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005378 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005379 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005380 alloc_info.descriptorPool = ds_pool;
5381 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005382 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5383 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005384 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005385
Tony Barboureb254902015-07-15 12:50:33 -06005386 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005387 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5388 sampler_ci.pNext = NULL;
5389 sampler_ci.magFilter = VK_FILTER_NEAREST;
5390 sampler_ci.minFilter = VK_FILTER_NEAREST;
5391 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5392 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5393 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5394 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5395 sampler_ci.mipLodBias = 1.0;
5396 sampler_ci.anisotropyEnable = VK_FALSE;
5397 sampler_ci.maxAnisotropy = 1;
5398 sampler_ci.compareEnable = VK_FALSE;
5399 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5400 sampler_ci.minLod = 1.0;
5401 sampler_ci.maxLod = 1.0;
5402 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5403 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005404
Tobin Ehlis3b780662015-05-28 12:11:26 -06005405 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005406 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005407 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005408
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005409 VkDescriptorImageInfo info = {};
5410 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005411
5412 VkWriteDescriptorSet descriptor_write;
5413 memset(&descriptor_write, 0, sizeof(descriptor_write));
5414 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005415 descriptor_write.dstSet = descriptorSet;
5416 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005417 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005418 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005419 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005420 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005421
5422 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5423
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005424 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005425
Chia-I Wuf7458c52015-10-26 21:10:41 +08005426 vkDestroySampler(m_device->device(), sampler, NULL);
5427 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5428 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005429}
5430
Karl Schultz6addd812016-02-02 17:17:23 -07005431TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
5432 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
5433 // types
5434 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005435
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005436 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005437 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005438
Tobin Ehlis3b780662015-05-28 12:11:26 -06005439 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005440
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005441 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005442 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5443 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005444
5445 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005446 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5447 ds_pool_ci.pNext = NULL;
5448 ds_pool_ci.maxSets = 1;
5449 ds_pool_ci.poolSizeCount = 1;
5450 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005451
Tobin Ehlis3b780662015-05-28 12:11:26 -06005452 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005453 err =
5454 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005455 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005456 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005457 dsl_binding.binding = 0;
5458 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5459 dsl_binding.descriptorCount = 1;
5460 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5461 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005462
Tony Barboureb254902015-07-15 12:50:33 -06005463 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005464 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5465 ds_layout_ci.pNext = NULL;
5466 ds_layout_ci.bindingCount = 1;
5467 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005468
Tobin Ehlis3b780662015-05-28 12:11:26 -06005469 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005470 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5471 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005472 ASSERT_VK_SUCCESS(err);
5473
5474 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005475 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005476 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005477 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005478 alloc_info.descriptorPool = ds_pool;
5479 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005480 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5481 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005482 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005483
Tony Barboureb254902015-07-15 12:50:33 -06005484 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005485 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5486 sampler_ci.pNext = NULL;
5487 sampler_ci.magFilter = VK_FILTER_NEAREST;
5488 sampler_ci.minFilter = VK_FILTER_NEAREST;
5489 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5490 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5491 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5492 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5493 sampler_ci.mipLodBias = 1.0;
5494 sampler_ci.anisotropyEnable = VK_FALSE;
5495 sampler_ci.maxAnisotropy = 1;
5496 sampler_ci.compareEnable = VK_FALSE;
5497 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5498 sampler_ci.minLod = 1.0;
5499 sampler_ci.maxLod = 1.0;
5500 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5501 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005502 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005503 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005504 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005505
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005506 VkDescriptorImageInfo info = {};
5507 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005508
5509 VkWriteDescriptorSet descriptor_write;
5510 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07005511 descriptor_write.sType =
5512 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005513 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005514 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005515 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005516 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005517 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005518
5519 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5520
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005521 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005522
Chia-I Wuf7458c52015-10-26 21:10:41 +08005523 vkDestroySampler(m_device->device(), sampler, NULL);
5524 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5525 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005526}
5527
Karl Schultz6addd812016-02-02 17:17:23 -07005528TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005529 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07005530 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005531
Karl Schultz6addd812016-02-02 17:17:23 -07005532 m_errorMonitor->SetDesiredFailureMsg(
5533 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005534 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005535
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005536 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005537 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
5538 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005539 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005540 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
5541 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005542
5543 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005544 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5545 ds_pool_ci.pNext = NULL;
5546 ds_pool_ci.maxSets = 1;
5547 ds_pool_ci.poolSizeCount = 1;
5548 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005549
5550 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005551 err =
5552 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005553 ASSERT_VK_SUCCESS(err);
5554
5555 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005556 dsl_binding.binding = 0;
5557 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5558 dsl_binding.descriptorCount = 1;
5559 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5560 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005561
5562 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005563 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5564 ds_layout_ci.pNext = NULL;
5565 ds_layout_ci.bindingCount = 1;
5566 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005567 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005568 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5569 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005570 ASSERT_VK_SUCCESS(err);
5571
5572 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005573 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005574 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005575 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005576 alloc_info.descriptorPool = ds_pool;
5577 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005578 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5579 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005580 ASSERT_VK_SUCCESS(err);
5581
Karl Schultz6addd812016-02-02 17:17:23 -07005582 VkSampler sampler =
5583 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005584
5585 VkDescriptorImageInfo descriptor_info;
5586 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5587 descriptor_info.sampler = sampler;
5588
5589 VkWriteDescriptorSet descriptor_write;
5590 memset(&descriptor_write, 0, sizeof(descriptor_write));
5591 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005592 descriptor_write.dstSet = descriptorSet;
5593 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005594 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005595 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5596 descriptor_write.pImageInfo = &descriptor_info;
5597
5598 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5599
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005600 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005601
Chia-I Wuf7458c52015-10-26 21:10:41 +08005602 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5603 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005604}
5605
Karl Schultz6addd812016-02-02 17:17:23 -07005606TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
5607 // Create a single combined Image/Sampler descriptor and send it an invalid
5608 // imageView
5609 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005610
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5612 "Attempted write update to combined "
5613 "image sampler descriptor failed due "
5614 "to: Invalid VkImageView: 0xbaadbeef");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005615
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005616 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005617 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005618 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5619 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005620
5621 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005622 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5623 ds_pool_ci.pNext = NULL;
5624 ds_pool_ci.maxSets = 1;
5625 ds_pool_ci.poolSizeCount = 1;
5626 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005627
5628 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005629 err =
5630 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005631 ASSERT_VK_SUCCESS(err);
5632
5633 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005634 dsl_binding.binding = 0;
5635 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5636 dsl_binding.descriptorCount = 1;
5637 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5638 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005639
5640 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005641 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5642 ds_layout_ci.pNext = NULL;
5643 ds_layout_ci.bindingCount = 1;
5644 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005645 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005646 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5647 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005648 ASSERT_VK_SUCCESS(err);
5649
5650 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005651 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005652 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005653 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005654 alloc_info.descriptorPool = ds_pool;
5655 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005656 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5657 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005658 ASSERT_VK_SUCCESS(err);
5659
5660 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005661 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5662 sampler_ci.pNext = NULL;
5663 sampler_ci.magFilter = VK_FILTER_NEAREST;
5664 sampler_ci.minFilter = VK_FILTER_NEAREST;
5665 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5666 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5667 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5668 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5669 sampler_ci.mipLodBias = 1.0;
5670 sampler_ci.anisotropyEnable = VK_FALSE;
5671 sampler_ci.maxAnisotropy = 1;
5672 sampler_ci.compareEnable = VK_FALSE;
5673 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5674 sampler_ci.minLod = 1.0;
5675 sampler_ci.maxLod = 1.0;
5676 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5677 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005678
5679 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005680 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005681 ASSERT_VK_SUCCESS(err);
5682
Karl Schultz6addd812016-02-02 17:17:23 -07005683 VkImageView view =
5684 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005685
5686 VkDescriptorImageInfo descriptor_info;
5687 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5688 descriptor_info.sampler = sampler;
5689 descriptor_info.imageView = view;
5690
5691 VkWriteDescriptorSet descriptor_write;
5692 memset(&descriptor_write, 0, sizeof(descriptor_write));
5693 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005694 descriptor_write.dstSet = descriptorSet;
5695 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005696 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005697 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5698 descriptor_write.pImageInfo = &descriptor_info;
5699
5700 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5701
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005702 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005703
Chia-I Wuf7458c52015-10-26 21:10:41 +08005704 vkDestroySampler(m_device->device(), sampler, NULL);
5705 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5706 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005707}
5708
Karl Schultz6addd812016-02-02 17:17:23 -07005709TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
5710 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
5711 // into the other
5712 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005713
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005714 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5715 " binding #1 with type "
5716 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
5717 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005718
Tobin Ehlis04356f92015-10-27 16:35:27 -06005719 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005720 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005721 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005722 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5723 ds_type_count[0].descriptorCount = 1;
5724 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
5725 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005726
5727 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005728 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5729 ds_pool_ci.pNext = NULL;
5730 ds_pool_ci.maxSets = 1;
5731 ds_pool_ci.poolSizeCount = 2;
5732 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005733
5734 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005735 err =
5736 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005737 ASSERT_VK_SUCCESS(err);
5738 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005739 dsl_binding[0].binding = 0;
5740 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5741 dsl_binding[0].descriptorCount = 1;
5742 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
5743 dsl_binding[0].pImmutableSamplers = NULL;
5744 dsl_binding[1].binding = 1;
5745 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5746 dsl_binding[1].descriptorCount = 1;
5747 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
5748 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005749
5750 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005751 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5752 ds_layout_ci.pNext = NULL;
5753 ds_layout_ci.bindingCount = 2;
5754 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005755
5756 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005757 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5758 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005759 ASSERT_VK_SUCCESS(err);
5760
5761 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005762 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005763 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005764 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005765 alloc_info.descriptorPool = ds_pool;
5766 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005767 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5768 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005769 ASSERT_VK_SUCCESS(err);
5770
5771 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005772 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5773 sampler_ci.pNext = NULL;
5774 sampler_ci.magFilter = VK_FILTER_NEAREST;
5775 sampler_ci.minFilter = VK_FILTER_NEAREST;
5776 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5777 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5778 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5779 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5780 sampler_ci.mipLodBias = 1.0;
5781 sampler_ci.anisotropyEnable = VK_FALSE;
5782 sampler_ci.maxAnisotropy = 1;
5783 sampler_ci.compareEnable = VK_FALSE;
5784 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5785 sampler_ci.minLod = 1.0;
5786 sampler_ci.maxLod = 1.0;
5787 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5788 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005789
5790 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005791 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005792 ASSERT_VK_SUCCESS(err);
5793
5794 VkDescriptorImageInfo info = {};
5795 info.sampler = sampler;
5796
5797 VkWriteDescriptorSet descriptor_write;
5798 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
5799 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005800 descriptor_write.dstSet = descriptorSet;
5801 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08005802 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005803 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5804 descriptor_write.pImageInfo = &info;
5805 // This write update should succeed
5806 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5807 // Now perform a copy update that fails due to type mismatch
5808 VkCopyDescriptorSet copy_ds_update;
5809 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5810 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5811 copy_ds_update.srcSet = descriptorSet;
5812 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005813 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005814 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08005815 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005816 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5817
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005818 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005819 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005820 m_errorMonitor->SetDesiredFailureMsg(
5821 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005822 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06005823 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5824 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5825 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005826 copy_ds_update.srcBinding =
5827 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005828 copy_ds_update.dstSet = descriptorSet;
5829 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005830 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005831 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5832
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005833 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005834
Tobin Ehlis04356f92015-10-27 16:35:27 -06005835 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005836 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005837 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
5838 "update array offset of 0 and update of "
5839 "5 descriptors oversteps total number "
5840 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005841
Tobin Ehlis04356f92015-10-27 16:35:27 -06005842 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5843 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5844 copy_ds_update.srcSet = descriptorSet;
5845 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005846 copy_ds_update.dstSet = descriptorSet;
5847 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005848 copy_ds_update.descriptorCount =
5849 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06005850 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5851
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005852 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005853
Chia-I Wuf7458c52015-10-26 21:10:41 +08005854 vkDestroySampler(m_device->device(), sampler, NULL);
5855 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5856 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005857}
5858
Karl Schultz6addd812016-02-02 17:17:23 -07005859TEST_F(VkLayerTest, NumSamplesMismatch) {
5860 // Create CommandBuffer where MSAA samples doesn't match RenderPass
5861 // sampleCount
5862 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005863
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005865 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005866
Tobin Ehlis3b780662015-05-28 12:11:26 -06005867 ASSERT_NO_FATAL_FAILURE(InitState());
5868 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005869 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06005870 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005871 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005872
5873 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005874 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5875 ds_pool_ci.pNext = NULL;
5876 ds_pool_ci.maxSets = 1;
5877 ds_pool_ci.poolSizeCount = 1;
5878 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005879
Tobin Ehlis3b780662015-05-28 12:11:26 -06005880 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005881 err =
5882 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005883 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005884
Tony Barboureb254902015-07-15 12:50:33 -06005885 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08005886 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06005887 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08005888 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005889 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5890 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005891
Tony Barboureb254902015-07-15 12:50:33 -06005892 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5893 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5894 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005895 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07005896 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005897
Tobin Ehlis3b780662015-05-28 12:11:26 -06005898 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005899 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5900 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005901 ASSERT_VK_SUCCESS(err);
5902
5903 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005904 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005905 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005906 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005907 alloc_info.descriptorPool = ds_pool;
5908 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005909 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5910 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005911 ASSERT_VK_SUCCESS(err);
5912
Tony Barboureb254902015-07-15 12:50:33 -06005913 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005914 pipe_ms_state_ci.sType =
5915 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5916 pipe_ms_state_ci.pNext = NULL;
5917 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5918 pipe_ms_state_ci.sampleShadingEnable = 0;
5919 pipe_ms_state_ci.minSampleShading = 1.0;
5920 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005921
Tony Barboureb254902015-07-15 12:50:33 -06005922 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005923 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5924 pipeline_layout_ci.pNext = NULL;
5925 pipeline_layout_ci.setLayoutCount = 1;
5926 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005927
5928 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005929 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5930 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005931 ASSERT_VK_SUCCESS(err);
5932
Karl Schultz6addd812016-02-02 17:17:23 -07005933 VkShaderObj vs(m_device, bindStateVertShaderText,
5934 VK_SHADER_STAGE_VERTEX_BIT, this);
5935 VkShaderObj fs(m_device, bindStateFragShaderText,
5936 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005937 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005938 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005939 VkPipelineObj pipe(m_device);
5940 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005941 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005942 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005943 pipe.SetMSAA(&pipe_ms_state_ci);
5944 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005945
Tony Barbourfe3351b2015-07-28 10:17:20 -06005946 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005947 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5948 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005949
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005950 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005951
Chia-I Wuf7458c52015-10-26 21:10:41 +08005952 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5953 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5954 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005955}
Tobin Ehlis0f10db52016-04-04 10:00:21 -06005956#ifdef ADD_BACK_IN_WHEN_CHECK_IS_BACK // TODO : Re-enable when GH256 fixed
Mark Youngc89c6312016-03-31 16:03:20 -06005957TEST_F(VkLayerTest, NumBlendAttachMismatch) {
5958 // Create Pipeline where the number of blend attachments doesn't match the
5959 // number of color attachments. In this case, we don't add any color
5960 // blend attachments even though we have a color attachment.
5961 VkResult err;
5962
5963 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5964 "Mismatch between blend state attachment");
5965
5966 ASSERT_NO_FATAL_FAILURE(InitState());
5967 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5968 VkDescriptorPoolSize ds_type_count = {};
5969 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5970 ds_type_count.descriptorCount = 1;
5971
5972 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5973 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5974 ds_pool_ci.pNext = NULL;
5975 ds_pool_ci.maxSets = 1;
5976 ds_pool_ci.poolSizeCount = 1;
5977 ds_pool_ci.pPoolSizes = &ds_type_count;
5978
5979 VkDescriptorPool ds_pool;
5980 err =
5981 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5982 ASSERT_VK_SUCCESS(err);
5983
5984 VkDescriptorSetLayoutBinding dsl_binding = {};
5985 dsl_binding.binding = 0;
5986 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5987 dsl_binding.descriptorCount = 1;
5988 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5989 dsl_binding.pImmutableSamplers = NULL;
5990
5991 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5992 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5993 ds_layout_ci.pNext = NULL;
5994 ds_layout_ci.bindingCount = 1;
5995 ds_layout_ci.pBindings = &dsl_binding;
5996
5997 VkDescriptorSetLayout ds_layout;
5998 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5999 &ds_layout);
6000 ASSERT_VK_SUCCESS(err);
6001
6002 VkDescriptorSet descriptorSet;
6003 VkDescriptorSetAllocateInfo alloc_info = {};
6004 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6005 alloc_info.descriptorSetCount = 1;
6006 alloc_info.descriptorPool = ds_pool;
6007 alloc_info.pSetLayouts = &ds_layout;
6008 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6009 &descriptorSet);
6010 ASSERT_VK_SUCCESS(err);
6011
6012 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
6013 pipe_ms_state_ci.sType =
6014 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6015 pipe_ms_state_ci.pNext = NULL;
6016 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6017 pipe_ms_state_ci.sampleShadingEnable = 0;
6018 pipe_ms_state_ci.minSampleShading = 1.0;
6019 pipe_ms_state_ci.pSampleMask = NULL;
6020
6021 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6022 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6023 pipeline_layout_ci.pNext = NULL;
6024 pipeline_layout_ci.setLayoutCount = 1;
6025 pipeline_layout_ci.pSetLayouts = &ds_layout;
6026
6027 VkPipelineLayout pipeline_layout;
6028 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6029 &pipeline_layout);
6030 ASSERT_VK_SUCCESS(err);
6031
6032 VkShaderObj vs(m_device, bindStateVertShaderText,
6033 VK_SHADER_STAGE_VERTEX_BIT, this);
6034 VkShaderObj fs(m_device, bindStateFragShaderText,
6035 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006036 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06006037 // but add it to be able to run on more devices
6038 VkPipelineObj pipe(m_device);
6039 pipe.AddShader(&vs);
6040 pipe.AddShader(&fs);
6041 pipe.SetMSAA(&pipe_ms_state_ci);
6042 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6043
6044 BeginCommandBuffer();
6045 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6046 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6047
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006048 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06006049
6050 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6051 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6052 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6053}
Tony Barbour4e81a202016-04-04 11:09:40 -06006054#endif //ADD_BACK_IN_WHEN_CHECK_IS_BACK
Karl Schultz6addd812016-02-02 17:17:23 -07006055TEST_F(VkLayerTest, ClearCmdNoDraw) {
6056 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
6057 // to issuing a Draw
6058 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006059
Karl Schultz6addd812016-02-02 17:17:23 -07006060 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07006061 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006062 "vkCmdClearAttachments() issued on CB object ");
6063
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006064 ASSERT_NO_FATAL_FAILURE(InitState());
6065 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006066
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006067 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006068 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6069 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006070
6071 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006072 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6073 ds_pool_ci.pNext = NULL;
6074 ds_pool_ci.maxSets = 1;
6075 ds_pool_ci.poolSizeCount = 1;
6076 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006077
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006078 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006079 err =
6080 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006081 ASSERT_VK_SUCCESS(err);
6082
Tony Barboureb254902015-07-15 12:50:33 -06006083 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006084 dsl_binding.binding = 0;
6085 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6086 dsl_binding.descriptorCount = 1;
6087 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6088 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006089
Tony Barboureb254902015-07-15 12:50:33 -06006090 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006091 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6092 ds_layout_ci.pNext = NULL;
6093 ds_layout_ci.bindingCount = 1;
6094 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006095
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006096 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006097 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6098 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006099 ASSERT_VK_SUCCESS(err);
6100
6101 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006102 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006103 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006104 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006105 alloc_info.descriptorPool = ds_pool;
6106 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006107 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6108 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006109 ASSERT_VK_SUCCESS(err);
6110
Tony Barboureb254902015-07-15 12:50:33 -06006111 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006112 pipe_ms_state_ci.sType =
6113 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6114 pipe_ms_state_ci.pNext = NULL;
6115 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6116 pipe_ms_state_ci.sampleShadingEnable = 0;
6117 pipe_ms_state_ci.minSampleShading = 1.0;
6118 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006119
Tony Barboureb254902015-07-15 12:50:33 -06006120 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006121 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6122 pipeline_layout_ci.pNext = NULL;
6123 pipeline_layout_ci.setLayoutCount = 1;
6124 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006125
6126 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006127 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6128 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006129 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006130
Karl Schultz6addd812016-02-02 17:17:23 -07006131 VkShaderObj vs(m_device, bindStateVertShaderText,
6132 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006133 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006134 // on more devices
6135 VkShaderObj fs(m_device, bindStateFragShaderText,
6136 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006137
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006138 VkPipelineObj pipe(m_device);
6139 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006140 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006141 pipe.SetMSAA(&pipe_ms_state_ci);
6142 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006143
6144 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006145
Karl Schultz6addd812016-02-02 17:17:23 -07006146 // Main thing we care about for this test is that the VkImage obj we're
6147 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006148 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006149 VkClearAttachment color_attachment;
6150 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6151 color_attachment.clearValue.color.float32[0] = 1.0;
6152 color_attachment.clearValue.color.float32[1] = 1.0;
6153 color_attachment.clearValue.color.float32[2] = 1.0;
6154 color_attachment.clearValue.color.float32[3] = 1.0;
6155 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006156 VkClearRect clear_rect = {
6157 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006158
Karl Schultz6addd812016-02-02 17:17:23 -07006159 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
6160 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006161
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006162 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006163
Chia-I Wuf7458c52015-10-26 21:10:41 +08006164 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6165 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6166 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006167}
6168
Karl Schultz6addd812016-02-02 17:17:23 -07006169TEST_F(VkLayerTest, VtxBufferBadIndex) {
6170 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006171
Karl Schultz6addd812016-02-02 17:17:23 -07006172 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006173 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07006174 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006175
Tobin Ehlis502480b2015-06-24 15:53:07 -06006176 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06006177 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06006178 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006179
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006180 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006181 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6182 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006183
6184 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006185 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6186 ds_pool_ci.pNext = NULL;
6187 ds_pool_ci.maxSets = 1;
6188 ds_pool_ci.poolSizeCount = 1;
6189 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006190
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006191 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006192 err =
6193 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006194 ASSERT_VK_SUCCESS(err);
6195
Tony Barboureb254902015-07-15 12:50:33 -06006196 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006197 dsl_binding.binding = 0;
6198 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6199 dsl_binding.descriptorCount = 1;
6200 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6201 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006202
Tony Barboureb254902015-07-15 12:50:33 -06006203 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006204 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6205 ds_layout_ci.pNext = NULL;
6206 ds_layout_ci.bindingCount = 1;
6207 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006208
Tobin Ehlis502480b2015-06-24 15:53:07 -06006209 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006210 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6211 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006212 ASSERT_VK_SUCCESS(err);
6213
6214 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006215 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006216 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006217 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006218 alloc_info.descriptorPool = ds_pool;
6219 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006220 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6221 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006222 ASSERT_VK_SUCCESS(err);
6223
Tony Barboureb254902015-07-15 12:50:33 -06006224 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006225 pipe_ms_state_ci.sType =
6226 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6227 pipe_ms_state_ci.pNext = NULL;
6228 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6229 pipe_ms_state_ci.sampleShadingEnable = 0;
6230 pipe_ms_state_ci.minSampleShading = 1.0;
6231 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006232
Tony Barboureb254902015-07-15 12:50:33 -06006233 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006234 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6235 pipeline_layout_ci.pNext = NULL;
6236 pipeline_layout_ci.setLayoutCount = 1;
6237 pipeline_layout_ci.pSetLayouts = &ds_layout;
6238 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006239
Karl Schultz6addd812016-02-02 17:17:23 -07006240 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6241 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006242 ASSERT_VK_SUCCESS(err);
6243
Karl Schultz6addd812016-02-02 17:17:23 -07006244 VkShaderObj vs(m_device, bindStateVertShaderText,
6245 VK_SHADER_STAGE_VERTEX_BIT, this);
6246 VkShaderObj fs(m_device, bindStateFragShaderText,
6247 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006248 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006249 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006250 VkPipelineObj pipe(m_device);
6251 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006252 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006253 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006254 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006255 pipe.SetViewport(m_viewports);
6256 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006257 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006258
6259 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006260 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6261 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006262 // Don't care about actual data, just need to get to draw to flag error
6263 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07006264 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
6265 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006266 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06006267 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006268
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006269 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006270
Chia-I Wuf7458c52015-10-26 21:10:41 +08006271 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6272 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6273 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006274}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006275#endif // DRAW_STATE_TESTS
6276
Tobin Ehlis0788f522015-05-26 16:11:58 -06006277#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06006278#if GTEST_IS_THREADSAFE
6279struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006280 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006281 VkEvent event;
6282 bool bailout;
6283};
6284
Karl Schultz6addd812016-02-02 17:17:23 -07006285extern "C" void *AddToCommandBuffer(void *arg) {
6286 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006287
Karl Schultz6addd812016-02-02 17:17:23 -07006288 for (int i = 0; i < 10000; i++) {
6289 vkCmdSetEvent(data->commandBuffer, data->event,
6290 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006291 if (data->bailout) {
6292 break;
6293 }
6294 }
6295 return NULL;
6296}
6297
Karl Schultz6addd812016-02-02 17:17:23 -07006298TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006299 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006300
Karl Schultz6addd812016-02-02 17:17:23 -07006301 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6302 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006303
Mike Stroyanaccf7692015-05-12 16:00:45 -06006304 ASSERT_NO_FATAL_FAILURE(InitState());
6305 ASSERT_NO_FATAL_FAILURE(InitViewport());
6306 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6307
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006308 // Calls AllocateCommandBuffers
6309 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006310
6311 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006312 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006313
6314 VkEventCreateInfo event_info;
6315 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006316 VkResult err;
6317
6318 memset(&event_info, 0, sizeof(event_info));
6319 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6320
Chia-I Wuf7458c52015-10-26 21:10:41 +08006321 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006322 ASSERT_VK_SUCCESS(err);
6323
Mike Stroyanaccf7692015-05-12 16:00:45 -06006324 err = vkResetEvent(device(), event);
6325 ASSERT_VK_SUCCESS(err);
6326
6327 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006328 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006329 data.event = event;
6330 data.bailout = false;
6331 m_errorMonitor->SetBailout(&data.bailout);
6332 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006333 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006334 // Add many entries to command buffer from this thread at the same time.
6335 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006336
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006337 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006338 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006339
Mike Stroyan10b8cb72016-01-22 15:22:03 -07006340 m_errorMonitor->SetBailout(NULL);
6341
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006342 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006343
Chia-I Wuf7458c52015-10-26 21:10:41 +08006344 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006345}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006346#endif // GTEST_IS_THREADSAFE
6347#endif // THREADING_TESTS
6348
Chris Forbes9f7ff632015-05-25 11:13:08 +12006349#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006350TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006351 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006352 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006353
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006354 ASSERT_NO_FATAL_FAILURE(InitState());
6355 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6356
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006357 VkShaderModule module;
6358 VkShaderModuleCreateInfo moduleCreateInfo;
6359 struct icd_spv_header spv;
6360
6361 spv.magic = ICD_SPV_MAGIC;
6362 spv.version = ICD_SPV_VERSION;
6363 spv.gen_magic = 0;
6364
6365 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6366 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006367 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006368 moduleCreateInfo.codeSize = 4;
6369 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006370 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006371
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006372 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006373}
6374
Karl Schultz6addd812016-02-02 17:17:23 -07006375TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006376 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006377 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006378
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006379 ASSERT_NO_FATAL_FAILURE(InitState());
6380 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6381
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006382 VkShaderModule module;
6383 VkShaderModuleCreateInfo moduleCreateInfo;
6384 struct icd_spv_header spv;
6385
6386 spv.magic = ~ICD_SPV_MAGIC;
6387 spv.version = ICD_SPV_VERSION;
6388 spv.gen_magic = 0;
6389
6390 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6391 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006392 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006393 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6394 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006395 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006396
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006397 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006398}
6399
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006400#if 0
6401// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07006402TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006404 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006405
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006406 ASSERT_NO_FATAL_FAILURE(InitState());
6407 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6408
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006409 VkShaderModule module;
6410 VkShaderModuleCreateInfo moduleCreateInfo;
6411 struct icd_spv_header spv;
6412
6413 spv.magic = ICD_SPV_MAGIC;
6414 spv.version = ~ICD_SPV_VERSION;
6415 spv.gen_magic = 0;
6416
6417 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6418 moduleCreateInfo.pNext = NULL;
6419
Karl Schultz6addd812016-02-02 17:17:23 -07006420 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006421 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6422 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006423 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006424
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006425 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006426}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006427#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006428
Karl Schultz6addd812016-02-02 17:17:23 -07006429TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006430 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006431 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006432
Chris Forbes9f7ff632015-05-25 11:13:08 +12006433 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006434 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006435
6436 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006437 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006438 "\n"
6439 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006440 "out gl_PerVertex {\n"
6441 " vec4 gl_Position;\n"
6442 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006443 "void main(){\n"
6444 " gl_Position = vec4(1);\n"
6445 " x = 0;\n"
6446 "}\n";
6447 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006448 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006449 "\n"
6450 "layout(location=0) out vec4 color;\n"
6451 "void main(){\n"
6452 " color = vec4(1);\n"
6453 "}\n";
6454
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006455 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6456 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006457
6458 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006459 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006460 pipe.AddShader(&vs);
6461 pipe.AddShader(&fs);
6462
Chris Forbes9f7ff632015-05-25 11:13:08 +12006463 VkDescriptorSetObj descriptorSet(m_device);
6464 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006465 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006466
Tony Barbour5781e8f2015-08-04 16:23:11 -06006467 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006468
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006469 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006470}
Chris Forbes9f7ff632015-05-25 11:13:08 +12006471
Karl Schultz6addd812016-02-02 17:17:23 -07006472TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006474 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006475
Chris Forbes59cb88d2015-05-25 11:13:13 +12006476 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006477 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006478
6479 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006480 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006481 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006482 "out gl_PerVertex {\n"
6483 " vec4 gl_Position;\n"
6484 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006485 "void main(){\n"
6486 " gl_Position = vec4(1);\n"
6487 "}\n";
6488 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006489 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006490 "\n"
6491 "layout(location=0) in float x;\n"
6492 "layout(location=0) out vec4 color;\n"
6493 "void main(){\n"
6494 " color = vec4(x);\n"
6495 "}\n";
6496
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006497 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6498 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006499
6500 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006501 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006502 pipe.AddShader(&vs);
6503 pipe.AddShader(&fs);
6504
Chris Forbes59cb88d2015-05-25 11:13:13 +12006505 VkDescriptorSetObj descriptorSet(m_device);
6506 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006507 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006508
Tony Barbour5781e8f2015-08-04 16:23:11 -06006509 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006510
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006511 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006512}
6513
Karl Schultz6addd812016-02-02 17:17:23 -07006514TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006516 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006517
6518 ASSERT_NO_FATAL_FAILURE(InitState());
6519 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6520
6521 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006522 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006523 "\n"
6524 "out gl_PerVertex {\n"
6525 " vec4 gl_Position;\n"
6526 "};\n"
6527 "void main(){\n"
6528 " gl_Position = vec4(1);\n"
6529 "}\n";
6530 char const *fsSource =
6531 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006532 "\n"
6533 "in block { layout(location=0) float x; } ins;\n"
6534 "layout(location=0) out vec4 color;\n"
6535 "void main(){\n"
6536 " color = vec4(ins.x);\n"
6537 "}\n";
6538
6539 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6540 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6541
6542 VkPipelineObj pipe(m_device);
6543 pipe.AddColorAttachment();
6544 pipe.AddShader(&vs);
6545 pipe.AddShader(&fs);
6546
6547 VkDescriptorSetObj descriptorSet(m_device);
6548 descriptorSet.AppendDummy();
6549 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6550
6551 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6552
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006553 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006554}
6555
Karl Schultz6addd812016-02-02 17:17:23 -07006556TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13006557 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13006558 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07006559 "output arr[2] of float32' vs 'ptr to "
6560 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13006561
6562 ASSERT_NO_FATAL_FAILURE(InitState());
6563 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6564
6565 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006566 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006567 "\n"
6568 "layout(location=0) out float x[2];\n"
6569 "out gl_PerVertex {\n"
6570 " vec4 gl_Position;\n"
6571 "};\n"
6572 "void main(){\n"
6573 " x[0] = 0; x[1] = 0;\n"
6574 " gl_Position = vec4(1);\n"
6575 "}\n";
6576 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006577 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006578 "\n"
6579 "layout(location=0) in float x[3];\n"
6580 "layout(location=0) out vec4 color;\n"
6581 "void main(){\n"
6582 " color = vec4(x[0] + x[1] + x[2]);\n"
6583 "}\n";
6584
6585 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6586 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6587
6588 VkPipelineObj pipe(m_device);
6589 pipe.AddColorAttachment();
6590 pipe.AddShader(&vs);
6591 pipe.AddShader(&fs);
6592
6593 VkDescriptorSetObj descriptorSet(m_device);
6594 descriptorSet.AppendDummy();
6595 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6596
6597 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6598
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006599 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13006600}
6601
Karl Schultz6addd812016-02-02 17:17:23 -07006602TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006603 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006604 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006605
Chris Forbesb56af562015-05-25 11:13:17 +12006606 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006607 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12006608
6609 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006610 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006611 "\n"
6612 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006613 "out gl_PerVertex {\n"
6614 " vec4 gl_Position;\n"
6615 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006616 "void main(){\n"
6617 " x = 0;\n"
6618 " gl_Position = vec4(1);\n"
6619 "}\n";
6620 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006621 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12006622 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006623 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12006624 "layout(location=0) out vec4 color;\n"
6625 "void main(){\n"
6626 " color = vec4(x);\n"
6627 "}\n";
6628
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006629 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6630 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12006631
6632 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006633 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12006634 pipe.AddShader(&vs);
6635 pipe.AddShader(&fs);
6636
Chris Forbesb56af562015-05-25 11:13:17 +12006637 VkDescriptorSetObj descriptorSet(m_device);
6638 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006639 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12006640
Tony Barbour5781e8f2015-08-04 16:23:11 -06006641 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12006642
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006643 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12006644}
6645
Karl Schultz6addd812016-02-02 17:17:23 -07006646TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006648 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006649
6650 ASSERT_NO_FATAL_FAILURE(InitState());
6651 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6652
6653 char const *vsSource =
6654 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006655 "\n"
6656 "out block { layout(location=0) int x; } outs;\n"
6657 "out gl_PerVertex {\n"
6658 " vec4 gl_Position;\n"
6659 "};\n"
6660 "void main(){\n"
6661 " outs.x = 0;\n"
6662 " gl_Position = vec4(1);\n"
6663 "}\n";
6664 char const *fsSource =
6665 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006666 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006667 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13006668 "layout(location=0) out vec4 color;\n"
6669 "void main(){\n"
6670 " color = vec4(ins.x);\n"
6671 "}\n";
6672
6673 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6674 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6675
6676 VkPipelineObj pipe(m_device);
6677 pipe.AddColorAttachment();
6678 pipe.AddShader(&vs);
6679 pipe.AddShader(&fs);
6680
6681 VkDescriptorSetObj descriptorSet(m_device);
6682 descriptorSet.AppendDummy();
6683 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6684
6685 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6686
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006687 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006688}
6689
6690TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
6691 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6692 "location 0.0 which is not written by vertex shader");
6693
6694 ASSERT_NO_FATAL_FAILURE(InitState());
6695 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6696
6697 char const *vsSource =
6698 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006699 "\n"
6700 "out block { layout(location=1) float x; } outs;\n"
6701 "out gl_PerVertex {\n"
6702 " vec4 gl_Position;\n"
6703 "};\n"
6704 "void main(){\n"
6705 " outs.x = 0;\n"
6706 " gl_Position = vec4(1);\n"
6707 "}\n";
6708 char const *fsSource =
6709 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006710 "\n"
6711 "in block { layout(location=0) float x; } ins;\n"
6712 "layout(location=0) out vec4 color;\n"
6713 "void main(){\n"
6714 " color = vec4(ins.x);\n"
6715 "}\n";
6716
6717 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6718 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6719
6720 VkPipelineObj pipe(m_device);
6721 pipe.AddColorAttachment();
6722 pipe.AddShader(&vs);
6723 pipe.AddShader(&fs);
6724
6725 VkDescriptorSetObj descriptorSet(m_device);
6726 descriptorSet.AppendDummy();
6727 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6728
6729 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6730
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006731 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13006732}
6733
6734TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
6735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6736 "location 0.1 which is not written by vertex shader");
6737
6738 ASSERT_NO_FATAL_FAILURE(InitState());
6739 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6740
6741 char const *vsSource =
6742 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006743 "\n"
6744 "out block { layout(location=0, component=0) float x; } outs;\n"
6745 "out gl_PerVertex {\n"
6746 " vec4 gl_Position;\n"
6747 "};\n"
6748 "void main(){\n"
6749 " outs.x = 0;\n"
6750 " gl_Position = vec4(1);\n"
6751 "}\n";
6752 char const *fsSource =
6753 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13006754 "\n"
6755 "in block { layout(location=0, component=1) float x; } ins;\n"
6756 "layout(location=0) out vec4 color;\n"
6757 "void main(){\n"
6758 " color = vec4(ins.x);\n"
6759 "}\n";
6760
6761 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6762 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6763
6764 VkPipelineObj pipe(m_device);
6765 pipe.AddColorAttachment();
6766 pipe.AddShader(&vs);
6767 pipe.AddShader(&fs);
6768
6769 VkDescriptorSetObj descriptorSet(m_device);
6770 descriptorSet.AppendDummy();
6771 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6772
6773 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6774
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006775 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006776}
6777
Karl Schultz6addd812016-02-02 17:17:23 -07006778TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006780 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006781
Chris Forbesde136e02015-05-25 11:13:28 +12006782 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006783 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12006784
6785 VkVertexInputBindingDescription input_binding;
6786 memset(&input_binding, 0, sizeof(input_binding));
6787
6788 VkVertexInputAttributeDescription input_attrib;
6789 memset(&input_attrib, 0, sizeof(input_attrib));
6790 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6791
6792 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006793 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006794 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006795 "out gl_PerVertex {\n"
6796 " vec4 gl_Position;\n"
6797 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006798 "void main(){\n"
6799 " gl_Position = vec4(1);\n"
6800 "}\n";
6801 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006802 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006803 "\n"
6804 "layout(location=0) out vec4 color;\n"
6805 "void main(){\n"
6806 " color = vec4(1);\n"
6807 "}\n";
6808
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006809 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6810 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12006811
6812 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006813 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12006814 pipe.AddShader(&vs);
6815 pipe.AddShader(&fs);
6816
6817 pipe.AddVertexInputBindings(&input_binding, 1);
6818 pipe.AddVertexInputAttribs(&input_attrib, 1);
6819
Chris Forbesde136e02015-05-25 11:13:28 +12006820 VkDescriptorSetObj descriptorSet(m_device);
6821 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006822 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12006823
Tony Barbour5781e8f2015-08-04 16:23:11 -06006824 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12006825
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006826 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12006827}
6828
Karl Schultz6addd812016-02-02 17:17:23 -07006829TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006831 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13006832
6833 ASSERT_NO_FATAL_FAILURE(InitState());
6834 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6835
6836 VkVertexInputBindingDescription input_binding;
6837 memset(&input_binding, 0, sizeof(input_binding));
6838
6839 VkVertexInputAttributeDescription input_attrib;
6840 memset(&input_attrib, 0, sizeof(input_attrib));
6841 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6842
6843 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006844 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006845 "\n"
6846 "layout(location=1) in float x;\n"
6847 "out gl_PerVertex {\n"
6848 " vec4 gl_Position;\n"
6849 "};\n"
6850 "void main(){\n"
6851 " gl_Position = vec4(x);\n"
6852 "}\n";
6853 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006854 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006855 "\n"
6856 "layout(location=0) out vec4 color;\n"
6857 "void main(){\n"
6858 " color = vec4(1);\n"
6859 "}\n";
6860
6861 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6862 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6863
6864 VkPipelineObj pipe(m_device);
6865 pipe.AddColorAttachment();
6866 pipe.AddShader(&vs);
6867 pipe.AddShader(&fs);
6868
6869 pipe.AddVertexInputBindings(&input_binding, 1);
6870 pipe.AddVertexInputAttribs(&input_attrib, 1);
6871
6872 VkDescriptorSetObj descriptorSet(m_device);
6873 descriptorSet.AppendDummy();
6874 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6875
6876 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6877
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006878 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13006879}
6880
Karl Schultz6addd812016-02-02 17:17:23 -07006881TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
6882 m_errorMonitor->SetDesiredFailureMsg(
6883 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006884 "VS consumes input at location 0 but not provided");
6885
Chris Forbes62e8e502015-05-25 11:13:29 +12006886 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006887 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12006888
6889 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006890 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006891 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006892 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07006893 "out gl_PerVertex {\n"
6894 " vec4 gl_Position;\n"
6895 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006896 "void main(){\n"
6897 " gl_Position = x;\n"
6898 "}\n";
6899 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006900 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006901 "\n"
6902 "layout(location=0) out vec4 color;\n"
6903 "void main(){\n"
6904 " color = vec4(1);\n"
6905 "}\n";
6906
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006907 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6908 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12006909
6910 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006911 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12006912 pipe.AddShader(&vs);
6913 pipe.AddShader(&fs);
6914
Chris Forbes62e8e502015-05-25 11:13:29 +12006915 VkDescriptorSetObj descriptorSet(m_device);
6916 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006917 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12006918
Tony Barbour5781e8f2015-08-04 16:23:11 -06006919 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12006920
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006921 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12006922}
6923
Karl Schultz6addd812016-02-02 17:17:23 -07006924TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
6925 m_errorMonitor->SetDesiredFailureMsg(
6926 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006927 "location 0 does not match VS input type");
6928
Chris Forbesc97d98e2015-05-25 11:13:31 +12006929 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006930 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006931
6932 VkVertexInputBindingDescription input_binding;
6933 memset(&input_binding, 0, sizeof(input_binding));
6934
6935 VkVertexInputAttributeDescription input_attrib;
6936 memset(&input_attrib, 0, sizeof(input_attrib));
6937 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6938
6939 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006940 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006941 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006942 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006943 "out gl_PerVertex {\n"
6944 " vec4 gl_Position;\n"
6945 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006946 "void main(){\n"
6947 " gl_Position = vec4(x);\n"
6948 "}\n";
6949 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006950 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006951 "\n"
6952 "layout(location=0) out vec4 color;\n"
6953 "void main(){\n"
6954 " color = vec4(1);\n"
6955 "}\n";
6956
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006957 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6958 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006959
6960 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006961 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006962 pipe.AddShader(&vs);
6963 pipe.AddShader(&fs);
6964
6965 pipe.AddVertexInputBindings(&input_binding, 1);
6966 pipe.AddVertexInputAttribs(&input_attrib, 1);
6967
Chris Forbesc97d98e2015-05-25 11:13:31 +12006968 VkDescriptorSetObj descriptorSet(m_device);
6969 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006970 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006971
Tony Barbour5781e8f2015-08-04 16:23:11 -06006972 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006973
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006974 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006975}
6976
Chris Forbesc68b43c2016-04-06 11:18:47 +12006977TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
6978 m_errorMonitor->SetDesiredFailureMsg(
6979 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6980 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
6981
6982 ASSERT_NO_FATAL_FAILURE(InitState());
6983 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6984
6985 char const *vsSource =
6986 "#version 450\n"
6987 "\n"
6988 "out gl_PerVertex {\n"
6989 " vec4 gl_Position;\n"
6990 "};\n"
6991 "void main(){\n"
6992 " gl_Position = vec4(1);\n"
6993 "}\n";
6994 char const *fsSource =
6995 "#version 450\n"
6996 "\n"
6997 "layout(location=0) out vec4 color;\n"
6998 "void main(){\n"
6999 " color = vec4(1);\n"
7000 "}\n";
7001
7002 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7003 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7004
7005 VkPipelineObj pipe(m_device);
7006 pipe.AddColorAttachment();
7007 pipe.AddShader(&vs);
7008 pipe.AddShader(&vs);
7009 pipe.AddShader(&fs);
7010
7011 VkDescriptorSetObj descriptorSet(m_device);
7012 descriptorSet.AppendDummy();
7013 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7014
7015 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7016
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007017 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12007018}
7019
Karl Schultz6addd812016-02-02 17:17:23 -07007020TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007021 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007022
7023 ASSERT_NO_FATAL_FAILURE(InitState());
7024 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7025
7026 VkVertexInputBindingDescription input_binding;
7027 memset(&input_binding, 0, sizeof(input_binding));
7028
7029 VkVertexInputAttributeDescription input_attribs[2];
7030 memset(input_attribs, 0, sizeof(input_attribs));
7031
7032 for (int i = 0; i < 2; i++) {
7033 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7034 input_attribs[i].location = i;
7035 }
7036
7037 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007038 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007039 "\n"
7040 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007041 "out gl_PerVertex {\n"
7042 " vec4 gl_Position;\n"
7043 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007044 "void main(){\n"
7045 " gl_Position = x[0] + x[1];\n"
7046 "}\n";
7047 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007048 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007049 "\n"
7050 "layout(location=0) out vec4 color;\n"
7051 "void main(){\n"
7052 " color = vec4(1);\n"
7053 "}\n";
7054
7055 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7056 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7057
7058 VkPipelineObj pipe(m_device);
7059 pipe.AddColorAttachment();
7060 pipe.AddShader(&vs);
7061 pipe.AddShader(&fs);
7062
7063 pipe.AddVertexInputBindings(&input_binding, 1);
7064 pipe.AddVertexInputAttribs(input_attribs, 2);
7065
7066 VkDescriptorSetObj descriptorSet(m_device);
7067 descriptorSet.AppendDummy();
7068 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7069
7070 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7071
7072 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007073 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007074}
7075
Chris Forbes2682b242015-11-24 11:13:14 +13007076TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
7077{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007078 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007079
7080 ASSERT_NO_FATAL_FAILURE(InitState());
7081 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7082
7083 VkVertexInputBindingDescription input_binding;
7084 memset(&input_binding, 0, sizeof(input_binding));
7085
7086 VkVertexInputAttributeDescription input_attribs[2];
7087 memset(input_attribs, 0, sizeof(input_attribs));
7088
7089 for (int i = 0; i < 2; i++) {
7090 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7091 input_attribs[i].location = i;
7092 }
7093
7094 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007095 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007096 "\n"
7097 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07007098 "out gl_PerVertex {\n"
7099 " vec4 gl_Position;\n"
7100 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007101 "void main(){\n"
7102 " gl_Position = x[0] + x[1];\n"
7103 "}\n";
7104 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007105 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007106 "\n"
7107 "layout(location=0) out vec4 color;\n"
7108 "void main(){\n"
7109 " color = vec4(1);\n"
7110 "}\n";
7111
7112 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7113 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7114
7115 VkPipelineObj pipe(m_device);
7116 pipe.AddColorAttachment();
7117 pipe.AddShader(&vs);
7118 pipe.AddShader(&fs);
7119
7120 pipe.AddVertexInputBindings(&input_binding, 1);
7121 pipe.AddVertexInputAttribs(input_attribs, 2);
7122
7123 VkDescriptorSetObj descriptorSet(m_device);
7124 descriptorSet.AppendDummy();
7125 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7126
7127 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7128
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007129 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007130}
Chris Forbes2682b242015-11-24 11:13:14 +13007131
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007132TEST_F(VkLayerTest, CreatePipelineSimplePositive)
7133{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007134 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007135
7136 ASSERT_NO_FATAL_FAILURE(InitState());
7137 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7138
7139 char const *vsSource =
7140 "#version 450\n"
7141 "out gl_PerVertex {\n"
7142 " vec4 gl_Position;\n"
7143 "};\n"
7144 "void main(){\n"
7145 " gl_Position = vec4(0);\n"
7146 "}\n";
7147 char const *fsSource =
7148 "#version 450\n"
7149 "\n"
7150 "layout(location=0) out vec4 color;\n"
7151 "void main(){\n"
7152 " color = vec4(1);\n"
7153 "}\n";
7154
7155 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7156 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7157
7158 VkPipelineObj pipe(m_device);
7159 pipe.AddColorAttachment();
7160 pipe.AddShader(&vs);
7161 pipe.AddShader(&fs);
7162
7163 VkDescriptorSetObj descriptorSet(m_device);
7164 descriptorSet.AppendDummy();
7165 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7166
7167 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7168
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007169 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007170}
7171
Chris Forbes912c9192016-04-05 17:50:35 +12007172TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
7173{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007174 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12007175
7176 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
7177
7178 ASSERT_NO_FATAL_FAILURE(InitState());
7179 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7180
7181 char const *vsSource =
7182 "#version 450\n"
7183 "out gl_PerVertex {\n"
7184 " vec4 gl_Position;\n"
7185 "};\n"
7186 "layout(location=0) out vec3 x;\n"
7187 "layout(location=1) out ivec3 y;\n"
7188 "layout(location=2) out vec3 z;\n"
7189 "void main(){\n"
7190 " gl_Position = vec4(0);\n"
7191 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
7192 "}\n";
7193 char const *fsSource =
7194 "#version 450\n"
7195 "\n"
7196 "layout(location=0) out vec4 color;\n"
7197 "layout(location=0) in float x;\n"
7198 "layout(location=1) flat in int y;\n"
7199 "layout(location=2) in vec2 z;\n"
7200 "void main(){\n"
7201 " color = vec4(1 + x + y + z.x);\n"
7202 "}\n";
7203
7204 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7205 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7206
7207 VkPipelineObj pipe(m_device);
7208 pipe.AddColorAttachment();
7209 pipe.AddShader(&vs);
7210 pipe.AddShader(&fs);
7211
7212 VkDescriptorSetObj descriptorSet(m_device);
7213 descriptorSet.AppendDummy();
7214 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7215
7216 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7217
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007218 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12007219}
7220
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007221TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
7222{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007223 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007224
7225 ASSERT_NO_FATAL_FAILURE(InitState());
7226 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7227
Chris Forbesc1e852d2016-04-04 19:26:42 +12007228 if (!m_device->phy().features().tessellationShader) {
7229 printf("Device does not support tessellation shaders; skipped.\n");
7230 return;
7231 }
7232
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007233 char const *vsSource =
7234 "#version 450\n"
7235 "void main(){}\n";
7236 char const *tcsSource =
7237 "#version 450\n"
7238 "layout(location=0) out int x[];\n"
7239 "layout(vertices=3) out;\n"
7240 "void main(){\n"
7241 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7242 " gl_TessLevelInner[0] = 1;\n"
7243 " x[gl_InvocationID] = gl_InvocationID;\n"
7244 "}\n";
7245 char const *tesSource =
7246 "#version 450\n"
7247 "layout(triangles, equal_spacing, cw) in;\n"
7248 "layout(location=0) in int x[];\n"
7249 "out gl_PerVertex { vec4 gl_Position; };\n"
7250 "void main(){\n"
7251 " gl_Position.xyz = gl_TessCoord;\n"
7252 " gl_Position.w = x[0] + x[1] + x[2];\n"
7253 "}\n";
7254 char const *fsSource =
7255 "#version 450\n"
7256 "layout(location=0) out vec4 color;\n"
7257 "void main(){\n"
7258 " color = vec4(1);\n"
7259 "}\n";
7260
7261 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7262 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7263 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7264 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7265
7266 VkPipelineInputAssemblyStateCreateInfo iasci{
7267 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7268 nullptr,
7269 0,
7270 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7271 VK_FALSE};
7272
Chris Forbesb4cacb62016-04-04 19:15:00 +12007273 VkPipelineTessellationStateCreateInfo tsci{
7274 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7275 nullptr,
7276 0,
7277 3};
7278
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007279 VkPipelineObj pipe(m_device);
7280 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12007281 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007282 pipe.AddColorAttachment();
7283 pipe.AddShader(&vs);
7284 pipe.AddShader(&tcs);
7285 pipe.AddShader(&tes);
7286 pipe.AddShader(&fs);
7287
7288 VkDescriptorSetObj descriptorSet(m_device);
7289 descriptorSet.AppendDummy();
7290 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7291
7292 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7293
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007294 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007295}
7296
Chris Forbesa0ab8152016-04-20 13:34:27 +12007297TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
7298{
7299 m_errorMonitor->ExpectSuccess();
7300
7301 ASSERT_NO_FATAL_FAILURE(InitState());
7302 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7303
7304 if (!m_device->phy().features().geometryShader) {
7305 printf("Device does not support geometry shaders; skipped.\n");
7306 return;
7307 }
7308
7309 char const *vsSource =
7310 "#version 450\n"
7311 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
7312 "void main(){\n"
7313 " vs_out.x = vec4(1);\n"
7314 "}\n";
7315 char const *gsSource =
7316 "#version 450\n"
7317 "layout(triangles) in;\n"
7318 "layout(triangle_strip, max_vertices=3) out;\n"
7319 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
7320 "out gl_PerVertex { vec4 gl_Position; };\n"
7321 "void main() {\n"
7322 " gl_Position = gs_in[0].x;\n"
7323 " EmitVertex();\n"
7324 "}\n";
7325 char const *fsSource =
7326 "#version 450\n"
7327 "layout(location=0) out vec4 color;\n"
7328 "void main(){\n"
7329 " color = vec4(1);\n"
7330 "}\n";
7331
7332 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7333 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
7334 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7335
7336 VkPipelineObj pipe(m_device);
7337 pipe.AddColorAttachment();
7338 pipe.AddShader(&vs);
7339 pipe.AddShader(&gs);
7340 pipe.AddShader(&fs);
7341
7342 VkDescriptorSetObj descriptorSet(m_device);
7343 descriptorSet.AppendDummy();
7344 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7345
7346 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7347
7348 m_errorMonitor->VerifyNotFound();
7349}
7350
Chris Forbesa0193bc2016-04-04 19:19:47 +12007351TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
7352{
7353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7354 "is per-vertex in tessellation control shader stage "
7355 "but per-patch in tessellation evaluation shader stage");
7356
7357 ASSERT_NO_FATAL_FAILURE(InitState());
7358 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7359
Chris Forbesc1e852d2016-04-04 19:26:42 +12007360 if (!m_device->phy().features().tessellationShader) {
7361 printf("Device does not support tessellation shaders; skipped.\n");
7362 return;
7363 }
7364
Chris Forbesa0193bc2016-04-04 19:19:47 +12007365 char const *vsSource =
7366 "#version 450\n"
7367 "void main(){}\n";
7368 char const *tcsSource =
7369 "#version 450\n"
7370 "layout(location=0) out int x[];\n"
7371 "layout(vertices=3) out;\n"
7372 "void main(){\n"
7373 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7374 " gl_TessLevelInner[0] = 1;\n"
7375 " x[gl_InvocationID] = gl_InvocationID;\n"
7376 "}\n";
7377 char const *tesSource =
7378 "#version 450\n"
7379 "layout(triangles, equal_spacing, cw) in;\n"
7380 "layout(location=0) patch in int x;\n"
7381 "out gl_PerVertex { vec4 gl_Position; };\n"
7382 "void main(){\n"
7383 " gl_Position.xyz = gl_TessCoord;\n"
7384 " gl_Position.w = x;\n"
7385 "}\n";
7386 char const *fsSource =
7387 "#version 450\n"
7388 "layout(location=0) out vec4 color;\n"
7389 "void main(){\n"
7390 " color = vec4(1);\n"
7391 "}\n";
7392
7393 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7394 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7395 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7396 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7397
7398 VkPipelineInputAssemblyStateCreateInfo iasci{
7399 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7400 nullptr,
7401 0,
7402 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7403 VK_FALSE};
7404
7405 VkPipelineTessellationStateCreateInfo tsci{
7406 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7407 nullptr,
7408 0,
7409 3};
7410
7411 VkPipelineObj pipe(m_device);
7412 pipe.SetInputAssembly(&iasci);
7413 pipe.SetTessellation(&tsci);
7414 pipe.AddColorAttachment();
7415 pipe.AddShader(&vs);
7416 pipe.AddShader(&tcs);
7417 pipe.AddShader(&tes);
7418 pipe.AddShader(&fs);
7419
7420 VkDescriptorSetObj descriptorSet(m_device);
7421 descriptorSet.AppendDummy();
7422 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7423
7424 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7425
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007426 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12007427}
7428
Karl Schultz6addd812016-02-02 17:17:23 -07007429TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
7430 m_errorMonitor->SetDesiredFailureMsg(
7431 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007432 "Duplicate vertex input binding descriptions for binding 0");
7433
Chris Forbes280ba2c2015-06-12 11:16:41 +12007434 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007435 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007436
7437 /* Two binding descriptions for binding 0 */
7438 VkVertexInputBindingDescription input_bindings[2];
7439 memset(input_bindings, 0, sizeof(input_bindings));
7440
7441 VkVertexInputAttributeDescription input_attrib;
7442 memset(&input_attrib, 0, sizeof(input_attrib));
7443 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7444
7445 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007446 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007447 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007448 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007449 "out gl_PerVertex {\n"
7450 " vec4 gl_Position;\n"
7451 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007452 "void main(){\n"
7453 " gl_Position = vec4(x);\n"
7454 "}\n";
7455 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007456 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007457 "\n"
7458 "layout(location=0) out vec4 color;\n"
7459 "void main(){\n"
7460 " color = vec4(1);\n"
7461 "}\n";
7462
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007463 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7464 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007465
7466 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007467 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007468 pipe.AddShader(&vs);
7469 pipe.AddShader(&fs);
7470
7471 pipe.AddVertexInputBindings(input_bindings, 2);
7472 pipe.AddVertexInputAttribs(&input_attrib, 1);
7473
Chris Forbes280ba2c2015-06-12 11:16:41 +12007474 VkDescriptorSetObj descriptorSet(m_device);
7475 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007476 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007477
Tony Barbour5781e8f2015-08-04 16:23:11 -06007478 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007479
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007480 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007481}
Chris Forbes8f68b562015-05-25 11:13:32 +12007482
Chris Forbes35efec72016-04-21 14:32:08 +12007483TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
7484 m_errorMonitor->ExpectSuccess();
7485
7486 ASSERT_NO_FATAL_FAILURE(InitState());
7487 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7488
7489 if (!m_device->phy().features().tessellationShader) {
7490 printf("Device does not support 64bit vertex attributes; skipped.\n");
7491 return;
7492 }
7493
7494 VkVertexInputBindingDescription input_bindings[1];
7495 memset(input_bindings, 0, sizeof(input_bindings));
7496
7497 VkVertexInputAttributeDescription input_attribs[4];
7498 memset(input_attribs, 0, sizeof(input_attribs));
7499 input_attribs[0].location = 0;
7500 input_attribs[0].offset = 0;
7501 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7502 input_attribs[1].location = 2;
7503 input_attribs[1].offset = 32;
7504 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7505 input_attribs[2].location = 4;
7506 input_attribs[2].offset = 64;
7507 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7508 input_attribs[3].location = 6;
7509 input_attribs[3].offset = 96;
7510 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7511
7512 char const *vsSource =
7513 "#version 450\n"
7514 "\n"
7515 "layout(location=0) in dmat4 x;\n"
7516 "out gl_PerVertex {\n"
7517 " vec4 gl_Position;\n"
7518 "};\n"
7519 "void main(){\n"
7520 " gl_Position = vec4(x[0][0]);\n"
7521 "}\n";
7522 char const *fsSource =
7523 "#version 450\n"
7524 "\n"
7525 "layout(location=0) out vec4 color;\n"
7526 "void main(){\n"
7527 " color = vec4(1);\n"
7528 "}\n";
7529
7530 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7531 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7532
7533 VkPipelineObj pipe(m_device);
7534 pipe.AddColorAttachment();
7535 pipe.AddShader(&vs);
7536 pipe.AddShader(&fs);
7537
7538 pipe.AddVertexInputBindings(input_bindings, 1);
7539 pipe.AddVertexInputAttribs(input_attribs, 4);
7540
7541 VkDescriptorSetObj descriptorSet(m_device);
7542 descriptorSet.AppendDummy();
7543 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7544
7545 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7546
7547 m_errorMonitor->VerifyNotFound();
7548}
7549
Karl Schultz6addd812016-02-02 17:17:23 -07007550TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007552 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007553
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007554 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007555
7556 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007557 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007558 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007559 "out gl_PerVertex {\n"
7560 " vec4 gl_Position;\n"
7561 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007562 "void main(){\n"
7563 " gl_Position = vec4(1);\n"
7564 "}\n";
7565 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007566 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007567 "\n"
7568 "void main(){\n"
7569 "}\n";
7570
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007571 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7572 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007573
7574 VkPipelineObj pipe(m_device);
7575 pipe.AddShader(&vs);
7576 pipe.AddShader(&fs);
7577
Chia-I Wu08accc62015-07-07 11:50:03 +08007578 /* set up CB 0, not written */
7579 pipe.AddColorAttachment();
7580 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007581
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007582 VkDescriptorSetObj descriptorSet(m_device);
7583 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007584 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007585
Tony Barbour5781e8f2015-08-04 16:23:11 -06007586 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007587
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007588 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007589}
7590
Karl Schultz6addd812016-02-02 17:17:23 -07007591TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07007592 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007593 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007594 "FS writes to output location 1 with no matching attachment");
7595
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007596 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007597
7598 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007599 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007600 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007601 "out gl_PerVertex {\n"
7602 " vec4 gl_Position;\n"
7603 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007604 "void main(){\n"
7605 " gl_Position = vec4(1);\n"
7606 "}\n";
7607 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007608 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007609 "\n"
7610 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007611 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007612 "void main(){\n"
7613 " x = vec4(1);\n"
7614 " y = vec4(1);\n"
7615 "}\n";
7616
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007617 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7618 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007619
7620 VkPipelineObj pipe(m_device);
7621 pipe.AddShader(&vs);
7622 pipe.AddShader(&fs);
7623
Chia-I Wu08accc62015-07-07 11:50:03 +08007624 /* set up CB 0, not written */
7625 pipe.AddColorAttachment();
7626 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007627 /* FS writes CB 1, but we don't configure it */
7628
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007629 VkDescriptorSetObj descriptorSet(m_device);
7630 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007631 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007632
Tony Barbour5781e8f2015-08-04 16:23:11 -06007633 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007634
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007635 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007636}
7637
Karl Schultz6addd812016-02-02 17:17:23 -07007638TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007639 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007640 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007641
Chris Forbesa36d69e2015-05-25 11:13:44 +12007642 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007643
7644 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007645 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007646 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007647 "out gl_PerVertex {\n"
7648 " vec4 gl_Position;\n"
7649 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007650 "void main(){\n"
7651 " gl_Position = vec4(1);\n"
7652 "}\n";
7653 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007654 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12007655 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007656 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12007657 "void main(){\n"
7658 " x = ivec4(1);\n"
7659 "}\n";
7660
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007661 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7662 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007663
7664 VkPipelineObj pipe(m_device);
7665 pipe.AddShader(&vs);
7666 pipe.AddShader(&fs);
7667
Chia-I Wu08accc62015-07-07 11:50:03 +08007668 /* set up CB 0; type is UNORM by default */
7669 pipe.AddColorAttachment();
7670 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007671
Chris Forbesa36d69e2015-05-25 11:13:44 +12007672 VkDescriptorSetObj descriptorSet(m_device);
7673 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007674 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12007675
Tony Barbour5781e8f2015-08-04 16:23:11 -06007676 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12007677
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007678 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12007679}
Chris Forbes7b1b8932015-06-05 14:43:36 +12007680
Karl Schultz6addd812016-02-02 17:17:23 -07007681TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007682 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007683 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007684
Chris Forbes556c76c2015-08-14 12:04:59 +12007685 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12007686
7687 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007688 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007689 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007690 "out gl_PerVertex {\n"
7691 " vec4 gl_Position;\n"
7692 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007693 "void main(){\n"
7694 " gl_Position = vec4(1);\n"
7695 "}\n";
7696 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007697 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12007698 "\n"
7699 "layout(location=0) out vec4 x;\n"
7700 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7701 "void main(){\n"
7702 " x = vec4(bar.y);\n"
7703 "}\n";
7704
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007705 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7706 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12007707
Chris Forbes556c76c2015-08-14 12:04:59 +12007708 VkPipelineObj pipe(m_device);
7709 pipe.AddShader(&vs);
7710 pipe.AddShader(&fs);
7711
7712 /* set up CB 0; type is UNORM by default */
7713 pipe.AddColorAttachment();
7714 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7715
7716 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007717 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12007718
7719 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7720
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007721 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12007722}
7723
Chris Forbes5c59e902016-02-26 16:56:09 +13007724TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
7725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7726 "not declared in layout");
7727
7728 ASSERT_NO_FATAL_FAILURE(InitState());
7729
7730 char const *vsSource =
7731 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007732 "\n"
7733 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
7734 "out gl_PerVertex {\n"
7735 " vec4 gl_Position;\n"
7736 "};\n"
7737 "void main(){\n"
7738 " gl_Position = vec4(consts.x);\n"
7739 "}\n";
7740 char const *fsSource =
7741 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13007742 "\n"
7743 "layout(location=0) out vec4 x;\n"
7744 "void main(){\n"
7745 " x = vec4(1);\n"
7746 "}\n";
7747
7748 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7749 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7750
7751 VkPipelineObj pipe(m_device);
7752 pipe.AddShader(&vs);
7753 pipe.AddShader(&fs);
7754
7755 /* set up CB 0; type is UNORM by default */
7756 pipe.AddColorAttachment();
7757 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7758
7759 VkDescriptorSetObj descriptorSet(m_device);
7760 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7761
7762 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7763
7764 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007765 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13007766}
7767
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007768#endif // SHADER_CHECKER_TESTS
7769
7770#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06007771TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07007772 m_errorMonitor->SetDesiredFailureMsg(
7773 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007774 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007775
7776 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007777
7778 // Create an image
7779 VkImage image;
7780
Karl Schultz6addd812016-02-02 17:17:23 -07007781 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7782 const int32_t tex_width = 32;
7783 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007784
7785 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007786 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7787 image_create_info.pNext = NULL;
7788 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7789 image_create_info.format = tex_format;
7790 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007791 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07007792 image_create_info.extent.depth = 1;
7793 image_create_info.mipLevels = 1;
7794 image_create_info.arrayLayers = 1;
7795 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7796 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7797 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7798 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007799
7800 // Introduce error by sending down a bogus width extent
7801 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007802 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007803
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007804 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007805}
7806
Mark Youngc48c4c12016-04-11 14:26:49 -06007807TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
7808 m_errorMonitor->SetDesiredFailureMsg(
7809 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7810 "CreateImage extents is 0 for at least one required dimension");
7811
7812 ASSERT_NO_FATAL_FAILURE(InitState());
7813
7814 // Create an image
7815 VkImage image;
7816
7817 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7818 const int32_t tex_width = 32;
7819 const int32_t tex_height = 32;
7820
7821 VkImageCreateInfo image_create_info = {};
7822 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7823 image_create_info.pNext = NULL;
7824 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7825 image_create_info.format = tex_format;
7826 image_create_info.extent.width = tex_width;
7827 image_create_info.extent.height = tex_height;
7828 image_create_info.extent.depth = 1;
7829 image_create_info.mipLevels = 1;
7830 image_create_info.arrayLayers = 1;
7831 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7832 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7833 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7834 image_create_info.flags = 0;
7835
7836 // Introduce error by sending down a bogus width extent
7837 image_create_info.extent.width = 0;
7838 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7839
7840 m_errorMonitor->VerifyFound();
7841}
7842
Karl Schultz6addd812016-02-02 17:17:23 -07007843TEST_F(VkLayerTest, UpdateBufferAlignment) {
7844 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06007845
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007847 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007848
Mike Stroyana3082432015-09-25 13:39:21 -06007849 ASSERT_NO_FATAL_FAILURE(InitState());
7850
7851 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7852 vk_testing::Buffer buffer;
7853 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7854
7855 BeginCommandBuffer();
7856 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007857 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007858 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007859
Mike Stroyana3082432015-09-25 13:39:21 -06007860 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007862 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007863
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007864 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007865 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007866 EndCommandBuffer();
7867}
7868
Karl Schultz6addd812016-02-02 17:17:23 -07007869TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007870 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007871 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06007872
7873 ASSERT_NO_FATAL_FAILURE(InitState());
7874
7875 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7876 vk_testing::Buffer buffer;
7877 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7878
7879 BeginCommandBuffer();
7880 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007881 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007882 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007883
Mike Stroyana3082432015-09-25 13:39:21 -06007884 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007885 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007886 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007887
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007888 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007889
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007890 m_errorMonitor->VerifyFound();
7891
Mike Stroyana3082432015-09-25 13:39:21 -06007892 EndCommandBuffer();
7893}
7894
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007895#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12007896
Tobin Ehliscde08892015-09-22 10:11:37 -06007897#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007898TEST_F(VkLayerTest, InvalidImageView) {
7899 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06007900
Karl Schultz6addd812016-02-02 17:17:23 -07007901 m_errorMonitor->SetDesiredFailureMsg(
7902 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007903 "vkCreateImageView called with baseMipLevel 10 ");
7904
Tobin Ehliscde08892015-09-22 10:11:37 -06007905 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06007906
Mike Stroyana3082432015-09-25 13:39:21 -06007907 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07007908 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06007909
Karl Schultz6addd812016-02-02 17:17:23 -07007910 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7911 const int32_t tex_width = 32;
7912 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06007913
7914 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007915 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7916 image_create_info.pNext = NULL;
7917 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7918 image_create_info.format = tex_format;
7919 image_create_info.extent.width = tex_width;
7920 image_create_info.extent.height = tex_height;
7921 image_create_info.extent.depth = 1;
7922 image_create_info.mipLevels = 1;
7923 image_create_info.arrayLayers = 1;
7924 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7925 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7926 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7927 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06007928
Chia-I Wuf7458c52015-10-26 21:10:41 +08007929 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06007930 ASSERT_VK_SUCCESS(err);
7931
7932 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007933 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7934 image_view_create_info.image = image;
7935 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7936 image_view_create_info.format = tex_format;
7937 image_view_create_info.subresourceRange.layerCount = 1;
7938 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
7939 image_view_create_info.subresourceRange.levelCount = 1;
7940 image_view_create_info.subresourceRange.aspectMask =
7941 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06007942
7943 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007944 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7945 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06007946
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007947 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06007948}
Mike Stroyana3082432015-09-25 13:39:21 -06007949
Karl Schultz6addd812016-02-02 17:17:23 -07007950TEST_F(VkLayerTest, InvalidImageViewAspect) {
7951 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007952
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007953 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007954 "vkCreateImageView: Color image "
7955 "formats must have ONLY the "
7956 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007957
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007958 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007959
7960 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07007961 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007962
Karl Schultz6addd812016-02-02 17:17:23 -07007963 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7964 const int32_t tex_width = 32;
7965 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007966
7967 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007968 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7969 image_create_info.pNext = NULL;
7970 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7971 image_create_info.format = tex_format;
7972 image_create_info.extent.width = tex_width;
7973 image_create_info.extent.height = tex_height;
7974 image_create_info.extent.depth = 1;
7975 image_create_info.mipLevels = 1;
7976 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7977 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7978 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7979 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007980
Chia-I Wuf7458c52015-10-26 21:10:41 +08007981 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007982 ASSERT_VK_SUCCESS(err);
7983
7984 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007985 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7986 image_view_create_info.image = image;
7987 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7988 image_view_create_info.format = tex_format;
7989 image_view_create_info.subresourceRange.baseMipLevel = 0;
7990 image_view_create_info.subresourceRange.levelCount = 1;
7991 // Cause an error by setting an invalid image aspect
7992 image_view_create_info.subresourceRange.aspectMask =
7993 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007994
7995 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007996 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7997 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007998
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007999 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008000}
8001
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008002TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008003 VkResult err;
8004 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008005
Karl Schultz6addd812016-02-02 17:17:23 -07008006 m_errorMonitor->SetDesiredFailureMsg(
8007 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008008 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008009
Mike Stroyana3082432015-09-25 13:39:21 -06008010 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008011
8012 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008013 VkImage srcImage;
8014 VkImage dstImage;
8015 VkDeviceMemory srcMem;
8016 VkDeviceMemory destMem;
8017 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008018
8019 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008020 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8021 image_create_info.pNext = NULL;
8022 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8023 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8024 image_create_info.extent.width = 32;
8025 image_create_info.extent.height = 32;
8026 image_create_info.extent.depth = 1;
8027 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008028 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07008029 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8030 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8031 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8032 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008033
Karl Schultz6addd812016-02-02 17:17:23 -07008034 err =
8035 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008036 ASSERT_VK_SUCCESS(err);
8037
Karl Schultz6addd812016-02-02 17:17:23 -07008038 err =
8039 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008040 ASSERT_VK_SUCCESS(err);
8041
8042 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008043 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008044 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8045 memAlloc.pNext = NULL;
8046 memAlloc.allocationSize = 0;
8047 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008048
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008049 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008050 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008051 pass =
8052 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008053 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008054 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008055 ASSERT_VK_SUCCESS(err);
8056
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008057 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008058 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008059 pass =
8060 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008061 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008062 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008063 ASSERT_VK_SUCCESS(err);
8064
8065 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8066 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008067 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008068 ASSERT_VK_SUCCESS(err);
8069
8070 BeginCommandBuffer();
8071 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008072 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008073 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008074 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008075 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06008076 copyRegion.srcOffset.x = 0;
8077 copyRegion.srcOffset.y = 0;
8078 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008079 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008080 copyRegion.dstSubresource.mipLevel = 0;
8081 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008082 // Introduce failure by forcing the dst layerCount to differ from src
8083 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008084 copyRegion.dstOffset.x = 0;
8085 copyRegion.dstOffset.y = 0;
8086 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008087 copyRegion.extent.width = 1;
8088 copyRegion.extent.height = 1;
8089 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008090 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8091 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008092 EndCommandBuffer();
8093
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008094 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008095
Chia-I Wuf7458c52015-10-26 21:10:41 +08008096 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008097 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008098 vkFreeMemory(m_device->device(), srcMem, NULL);
8099 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008100}
8101
Karl Schultz6addd812016-02-02 17:17:23 -07008102TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06008103 VkResult err;
8104 bool pass;
8105
8106 // Create color images with different format sizes and try to copy between them
8107 m_errorMonitor->SetDesiredFailureMsg(
8108 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8109 "vkCmdCopyImage called with unmatched source and dest image format sizes");
8110
8111 ASSERT_NO_FATAL_FAILURE(InitState());
8112
8113 // Create two images of different types and try to copy between them
8114 VkImage srcImage;
8115 VkImage dstImage;
8116 VkDeviceMemory srcMem;
8117 VkDeviceMemory destMem;
8118 VkMemoryRequirements memReqs;
8119
8120 VkImageCreateInfo image_create_info = {};
8121 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8122 image_create_info.pNext = NULL;
8123 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8124 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8125 image_create_info.extent.width = 32;
8126 image_create_info.extent.height = 32;
8127 image_create_info.extent.depth = 1;
8128 image_create_info.mipLevels = 1;
8129 image_create_info.arrayLayers = 1;
8130 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8131 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8132 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8133 image_create_info.flags = 0;
8134
8135 err =
8136 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
8137 ASSERT_VK_SUCCESS(err);
8138
8139 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8140 // Introduce failure by creating second image with a different-sized format.
8141 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
8142
8143 err =
8144 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
8145 ASSERT_VK_SUCCESS(err);
8146
8147 // Allocate memory
8148 VkMemoryAllocateInfo memAlloc = {};
8149 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8150 memAlloc.pNext = NULL;
8151 memAlloc.allocationSize = 0;
8152 memAlloc.memoryTypeIndex = 0;
8153
8154 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
8155 memAlloc.allocationSize = memReqs.size;
8156 pass =
8157 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
8158 ASSERT_TRUE(pass);
8159 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
8160 ASSERT_VK_SUCCESS(err);
8161
8162 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
8163 memAlloc.allocationSize = memReqs.size;
8164 pass =
8165 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
8166 ASSERT_TRUE(pass);
8167 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
8168 ASSERT_VK_SUCCESS(err);
8169
8170 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8171 ASSERT_VK_SUCCESS(err);
8172 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
8173 ASSERT_VK_SUCCESS(err);
8174
8175 BeginCommandBuffer();
8176 VkImageCopy copyRegion;
8177 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8178 copyRegion.srcSubresource.mipLevel = 0;
8179 copyRegion.srcSubresource.baseArrayLayer = 0;
8180 copyRegion.srcSubresource.layerCount = 0;
8181 copyRegion.srcOffset.x = 0;
8182 copyRegion.srcOffset.y = 0;
8183 copyRegion.srcOffset.z = 0;
8184 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8185 copyRegion.dstSubresource.mipLevel = 0;
8186 copyRegion.dstSubresource.baseArrayLayer = 0;
8187 copyRegion.dstSubresource.layerCount = 0;
8188 copyRegion.dstOffset.x = 0;
8189 copyRegion.dstOffset.y = 0;
8190 copyRegion.dstOffset.z = 0;
8191 copyRegion.extent.width = 1;
8192 copyRegion.extent.height = 1;
8193 copyRegion.extent.depth = 1;
8194 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8195 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
8196 EndCommandBuffer();
8197
8198 m_errorMonitor->VerifyFound();
8199
8200 vkDestroyImage(m_device->device(), srcImage, NULL);
8201 vkDestroyImage(m_device->device(), dstImage, NULL);
8202 vkFreeMemory(m_device->device(), srcMem, NULL);
8203 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008204}
8205
Karl Schultz6addd812016-02-02 17:17:23 -07008206TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
8207 VkResult err;
8208 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008209
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008210 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008211 m_errorMonitor->SetDesiredFailureMsg(
8212 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008213 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008214
Mike Stroyana3082432015-09-25 13:39:21 -06008215 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008216
8217 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008218 VkImage srcImage;
8219 VkImage dstImage;
8220 VkDeviceMemory srcMem;
8221 VkDeviceMemory destMem;
8222 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008223
8224 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008225 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8226 image_create_info.pNext = NULL;
8227 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8228 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8229 image_create_info.extent.width = 32;
8230 image_create_info.extent.height = 32;
8231 image_create_info.extent.depth = 1;
8232 image_create_info.mipLevels = 1;
8233 image_create_info.arrayLayers = 1;
8234 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8235 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8236 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8237 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008238
Karl Schultz6addd812016-02-02 17:17:23 -07008239 err =
8240 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008241 ASSERT_VK_SUCCESS(err);
8242
Karl Schultzbdb75952016-04-19 11:36:49 -06008243 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8244
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008245 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07008246 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008247 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8248 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008249
Karl Schultz6addd812016-02-02 17:17:23 -07008250 err =
8251 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008252 ASSERT_VK_SUCCESS(err);
8253
8254 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008255 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008256 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8257 memAlloc.pNext = NULL;
8258 memAlloc.allocationSize = 0;
8259 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008260
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008261 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008262 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008263 pass =
8264 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008265 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008266 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008267 ASSERT_VK_SUCCESS(err);
8268
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008269 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008270 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008271 pass =
8272 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008273 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008274 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008275 ASSERT_VK_SUCCESS(err);
8276
8277 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8278 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008279 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008280 ASSERT_VK_SUCCESS(err);
8281
8282 BeginCommandBuffer();
8283 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008284 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008285 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008286 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008287 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008288 copyRegion.srcOffset.x = 0;
8289 copyRegion.srcOffset.y = 0;
8290 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008291 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008292 copyRegion.dstSubresource.mipLevel = 0;
8293 copyRegion.dstSubresource.baseArrayLayer = 0;
8294 copyRegion.dstSubresource.layerCount = 0;
8295 copyRegion.dstOffset.x = 0;
8296 copyRegion.dstOffset.y = 0;
8297 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008298 copyRegion.extent.width = 1;
8299 copyRegion.extent.height = 1;
8300 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008301 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8302 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008303 EndCommandBuffer();
8304
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008305 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008306
Chia-I Wuf7458c52015-10-26 21:10:41 +08008307 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008308 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008309 vkFreeMemory(m_device->device(), srcMem, NULL);
8310 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008311}
8312
Karl Schultz6addd812016-02-02 17:17:23 -07008313TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
8314 VkResult err;
8315 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008316
Karl Schultz6addd812016-02-02 17:17:23 -07008317 m_errorMonitor->SetDesiredFailureMsg(
8318 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008319 "vkCmdResolveImage called with source sample count less than 2.");
8320
Mike Stroyana3082432015-09-25 13:39:21 -06008321 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008322
8323 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008324 VkImage srcImage;
8325 VkImage dstImage;
8326 VkDeviceMemory srcMem;
8327 VkDeviceMemory destMem;
8328 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008329
8330 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008331 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8332 image_create_info.pNext = NULL;
8333 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8334 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8335 image_create_info.extent.width = 32;
8336 image_create_info.extent.height = 1;
8337 image_create_info.extent.depth = 1;
8338 image_create_info.mipLevels = 1;
8339 image_create_info.arrayLayers = 1;
8340 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8341 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8342 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8343 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008344
Karl Schultz6addd812016-02-02 17:17:23 -07008345 err =
8346 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008347 ASSERT_VK_SUCCESS(err);
8348
Karl Schultz6addd812016-02-02 17:17:23 -07008349 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8350 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008351
Karl Schultz6addd812016-02-02 17:17:23 -07008352 err =
8353 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008354 ASSERT_VK_SUCCESS(err);
8355
8356 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008357 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008358 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8359 memAlloc.pNext = NULL;
8360 memAlloc.allocationSize = 0;
8361 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008362
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008363 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008364 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008365 pass =
8366 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008367 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008368 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008369 ASSERT_VK_SUCCESS(err);
8370
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008371 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008372 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008373 pass =
8374 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008375 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008376 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008377 ASSERT_VK_SUCCESS(err);
8378
8379 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8380 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008381 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008382 ASSERT_VK_SUCCESS(err);
8383
8384 BeginCommandBuffer();
8385 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008386 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8387 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008388 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008389 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008390 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008391 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008392 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008393 resolveRegion.srcOffset.x = 0;
8394 resolveRegion.srcOffset.y = 0;
8395 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008396 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008397 resolveRegion.dstSubresource.mipLevel = 0;
8398 resolveRegion.dstSubresource.baseArrayLayer = 0;
8399 resolveRegion.dstSubresource.layerCount = 0;
8400 resolveRegion.dstOffset.x = 0;
8401 resolveRegion.dstOffset.y = 0;
8402 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008403 resolveRegion.extent.width = 1;
8404 resolveRegion.extent.height = 1;
8405 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008406 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8407 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008408 EndCommandBuffer();
8409
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008410 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008411
Chia-I Wuf7458c52015-10-26 21:10:41 +08008412 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008413 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008414 vkFreeMemory(m_device->device(), srcMem, NULL);
8415 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008416}
8417
Karl Schultz6addd812016-02-02 17:17:23 -07008418TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
8419 VkResult err;
8420 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008421
Karl Schultz6addd812016-02-02 17:17:23 -07008422 m_errorMonitor->SetDesiredFailureMsg(
8423 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008424 "vkCmdResolveImage called with dest sample count greater than 1.");
8425
Mike Stroyana3082432015-09-25 13:39:21 -06008426 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008427
8428 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008429 VkImage srcImage;
8430 VkImage dstImage;
8431 VkDeviceMemory srcMem;
8432 VkDeviceMemory destMem;
8433 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008434
8435 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008436 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8437 image_create_info.pNext = NULL;
8438 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8439 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8440 image_create_info.extent.width = 32;
8441 image_create_info.extent.height = 1;
8442 image_create_info.extent.depth = 1;
8443 image_create_info.mipLevels = 1;
8444 image_create_info.arrayLayers = 1;
8445 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8446 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8447 // Note: Some implementations expect color attachment usage for any
8448 // multisample surface
8449 image_create_info.usage =
8450 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8451 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008452
Karl Schultz6addd812016-02-02 17:17:23 -07008453 err =
8454 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008455 ASSERT_VK_SUCCESS(err);
8456
Karl Schultz6addd812016-02-02 17:17:23 -07008457 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8458 // Note: Some implementations expect color attachment usage for any
8459 // multisample surface
8460 image_create_info.usage =
8461 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008462
Karl Schultz6addd812016-02-02 17:17:23 -07008463 err =
8464 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008465 ASSERT_VK_SUCCESS(err);
8466
8467 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008468 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008469 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8470 memAlloc.pNext = NULL;
8471 memAlloc.allocationSize = 0;
8472 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008473
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008474 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008475 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008476 pass =
8477 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008478 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008479 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008480 ASSERT_VK_SUCCESS(err);
8481
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008482 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008483 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008484 pass =
8485 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008486 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008487 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008488 ASSERT_VK_SUCCESS(err);
8489
8490 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8491 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008492 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008493 ASSERT_VK_SUCCESS(err);
8494
8495 BeginCommandBuffer();
8496 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008497 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8498 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008499 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008500 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008501 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008502 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008503 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008504 resolveRegion.srcOffset.x = 0;
8505 resolveRegion.srcOffset.y = 0;
8506 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008507 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008508 resolveRegion.dstSubresource.mipLevel = 0;
8509 resolveRegion.dstSubresource.baseArrayLayer = 0;
8510 resolveRegion.dstSubresource.layerCount = 0;
8511 resolveRegion.dstOffset.x = 0;
8512 resolveRegion.dstOffset.y = 0;
8513 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008514 resolveRegion.extent.width = 1;
8515 resolveRegion.extent.height = 1;
8516 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008517 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8518 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008519 EndCommandBuffer();
8520
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008521 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008522
Chia-I Wuf7458c52015-10-26 21:10:41 +08008523 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008524 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008525 vkFreeMemory(m_device->device(), srcMem, NULL);
8526 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008527}
8528
Karl Schultz6addd812016-02-02 17:17:23 -07008529TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
8530 VkResult err;
8531 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008532
Karl Schultz6addd812016-02-02 17:17:23 -07008533 m_errorMonitor->SetDesiredFailureMsg(
8534 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008535 "vkCmdResolveImage called with unmatched source and dest formats.");
8536
Mike Stroyana3082432015-09-25 13:39:21 -06008537 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008538
8539 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008540 VkImage srcImage;
8541 VkImage dstImage;
8542 VkDeviceMemory srcMem;
8543 VkDeviceMemory destMem;
8544 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008545
8546 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008547 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8548 image_create_info.pNext = NULL;
8549 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8550 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8551 image_create_info.extent.width = 32;
8552 image_create_info.extent.height = 1;
8553 image_create_info.extent.depth = 1;
8554 image_create_info.mipLevels = 1;
8555 image_create_info.arrayLayers = 1;
8556 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8557 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8558 // Note: Some implementations expect color attachment usage for any
8559 // multisample surface
8560 image_create_info.usage =
8561 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8562 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008563
Karl Schultz6addd812016-02-02 17:17:23 -07008564 err =
8565 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008566 ASSERT_VK_SUCCESS(err);
8567
Karl Schultz6addd812016-02-02 17:17:23 -07008568 // Set format to something other than source image
8569 image_create_info.format = VK_FORMAT_R32_SFLOAT;
8570 // Note: Some implementations expect color attachment usage for any
8571 // multisample surface
8572 image_create_info.usage =
8573 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8574 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008575
Karl Schultz6addd812016-02-02 17:17:23 -07008576 err =
8577 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008578 ASSERT_VK_SUCCESS(err);
8579
8580 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008581 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008582 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8583 memAlloc.pNext = NULL;
8584 memAlloc.allocationSize = 0;
8585 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008586
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008587 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008588 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008589 pass =
8590 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008591 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008592 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008593 ASSERT_VK_SUCCESS(err);
8594
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008595 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008596 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008597 pass =
8598 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008599 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008600 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008601 ASSERT_VK_SUCCESS(err);
8602
8603 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8604 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008605 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008606 ASSERT_VK_SUCCESS(err);
8607
8608 BeginCommandBuffer();
8609 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008610 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8611 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008612 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008613 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008614 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008615 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008616 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008617 resolveRegion.srcOffset.x = 0;
8618 resolveRegion.srcOffset.y = 0;
8619 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008620 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008621 resolveRegion.dstSubresource.mipLevel = 0;
8622 resolveRegion.dstSubresource.baseArrayLayer = 0;
8623 resolveRegion.dstSubresource.layerCount = 0;
8624 resolveRegion.dstOffset.x = 0;
8625 resolveRegion.dstOffset.y = 0;
8626 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008627 resolveRegion.extent.width = 1;
8628 resolveRegion.extent.height = 1;
8629 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008630 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8631 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008632 EndCommandBuffer();
8633
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008634 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008635
Chia-I Wuf7458c52015-10-26 21:10:41 +08008636 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008637 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008638 vkFreeMemory(m_device->device(), srcMem, NULL);
8639 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008640}
8641
Karl Schultz6addd812016-02-02 17:17:23 -07008642TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
8643 VkResult err;
8644 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008645
Karl Schultz6addd812016-02-02 17:17:23 -07008646 m_errorMonitor->SetDesiredFailureMsg(
8647 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008648 "vkCmdResolveImage called with unmatched source and dest image types.");
8649
Mike Stroyana3082432015-09-25 13:39:21 -06008650 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008651
8652 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008653 VkImage srcImage;
8654 VkImage dstImage;
8655 VkDeviceMemory srcMem;
8656 VkDeviceMemory destMem;
8657 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008658
8659 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008660 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8661 image_create_info.pNext = NULL;
8662 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8663 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8664 image_create_info.extent.width = 32;
8665 image_create_info.extent.height = 1;
8666 image_create_info.extent.depth = 1;
8667 image_create_info.mipLevels = 1;
8668 image_create_info.arrayLayers = 1;
8669 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8670 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8671 // Note: Some implementations expect color attachment usage for any
8672 // multisample surface
8673 image_create_info.usage =
8674 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8675 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008676
Karl Schultz6addd812016-02-02 17:17:23 -07008677 err =
8678 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008679 ASSERT_VK_SUCCESS(err);
8680
Karl Schultz6addd812016-02-02 17:17:23 -07008681 image_create_info.imageType = VK_IMAGE_TYPE_1D;
8682 // Note: Some implementations expect color attachment usage for any
8683 // multisample surface
8684 image_create_info.usage =
8685 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8686 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008687
Karl Schultz6addd812016-02-02 17:17:23 -07008688 err =
8689 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008690 ASSERT_VK_SUCCESS(err);
8691
8692 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008693 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008694 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8695 memAlloc.pNext = NULL;
8696 memAlloc.allocationSize = 0;
8697 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008698
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008699 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008700 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008701 pass =
8702 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008703 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008704 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008705 ASSERT_VK_SUCCESS(err);
8706
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008707 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008708 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008709 pass =
8710 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008711 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008712 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008713 ASSERT_VK_SUCCESS(err);
8714
8715 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8716 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008717 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008718 ASSERT_VK_SUCCESS(err);
8719
8720 BeginCommandBuffer();
8721 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008722 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8723 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008724 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008725 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008726 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008727 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008728 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008729 resolveRegion.srcOffset.x = 0;
8730 resolveRegion.srcOffset.y = 0;
8731 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008732 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008733 resolveRegion.dstSubresource.mipLevel = 0;
8734 resolveRegion.dstSubresource.baseArrayLayer = 0;
8735 resolveRegion.dstSubresource.layerCount = 0;
8736 resolveRegion.dstOffset.x = 0;
8737 resolveRegion.dstOffset.y = 0;
8738 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008739 resolveRegion.extent.width = 1;
8740 resolveRegion.extent.height = 1;
8741 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008742 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8743 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008744 EndCommandBuffer();
8745
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008746 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008747
Chia-I Wuf7458c52015-10-26 21:10:41 +08008748 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008749 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008750 vkFreeMemory(m_device->device(), srcMem, NULL);
8751 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008752}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008753
Karl Schultz6addd812016-02-02 17:17:23 -07008754TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008755 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07008756 // to using a DS format, then cause it to hit error due to COLOR_BIT not
8757 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008758 // The image format check comes 2nd in validation so we trigger it first,
8759 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07008760 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008761
Karl Schultz6addd812016-02-02 17:17:23 -07008762 m_errorMonitor->SetDesiredFailureMsg(
8763 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008764 "Combination depth/stencil image formats can have only the ");
8765
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008766 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008767
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008768 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008769 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8770 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008771
8772 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008773 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8774 ds_pool_ci.pNext = NULL;
8775 ds_pool_ci.maxSets = 1;
8776 ds_pool_ci.poolSizeCount = 1;
8777 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008778
8779 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008780 err =
8781 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008782 ASSERT_VK_SUCCESS(err);
8783
8784 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008785 dsl_binding.binding = 0;
8786 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8787 dsl_binding.descriptorCount = 1;
8788 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8789 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008790
8791 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008792 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8793 ds_layout_ci.pNext = NULL;
8794 ds_layout_ci.bindingCount = 1;
8795 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008796 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008797 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8798 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008799 ASSERT_VK_SUCCESS(err);
8800
8801 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008802 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008803 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008804 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008805 alloc_info.descriptorPool = ds_pool;
8806 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008807 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8808 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008809 ASSERT_VK_SUCCESS(err);
8810
Karl Schultz6addd812016-02-02 17:17:23 -07008811 VkImage image_bad;
8812 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008813 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07008814 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008815 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07008816 const int32_t tex_width = 32;
8817 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008818
8819 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008820 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8821 image_create_info.pNext = NULL;
8822 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8823 image_create_info.format = tex_format_bad;
8824 image_create_info.extent.width = tex_width;
8825 image_create_info.extent.height = tex_height;
8826 image_create_info.extent.depth = 1;
8827 image_create_info.mipLevels = 1;
8828 image_create_info.arrayLayers = 1;
8829 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8830 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8831 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
8832 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
8833 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008834
Karl Schultz6addd812016-02-02 17:17:23 -07008835 err =
8836 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008837 ASSERT_VK_SUCCESS(err);
8838 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07008839 image_create_info.usage =
8840 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8841 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
8842 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008843 ASSERT_VK_SUCCESS(err);
8844
8845 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008846 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8847 image_view_create_info.image = image_bad;
8848 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8849 image_view_create_info.format = tex_format_bad;
8850 image_view_create_info.subresourceRange.baseArrayLayer = 0;
8851 image_view_create_info.subresourceRange.baseMipLevel = 0;
8852 image_view_create_info.subresourceRange.layerCount = 1;
8853 image_view_create_info.subresourceRange.levelCount = 1;
8854 image_view_create_info.subresourceRange.aspectMask =
8855 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008856
8857 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008858 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8859 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008860
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008861 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008862
Chia-I Wuf7458c52015-10-26 21:10:41 +08008863 vkDestroyImage(m_device->device(), image_bad, NULL);
8864 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008865 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8866 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008867}
Tobin Ehliscde08892015-09-22 10:11:37 -06008868#endif // IMAGE_TESTS
8869
Tony Barbour300a6082015-04-07 13:44:53 -06008870int main(int argc, char **argv) {
8871 int result;
8872
Cody Northrop8e54a402016-03-08 22:25:52 -07008873#ifdef ANDROID
8874 int vulkanSupport = InitVulkan();
8875 if (vulkanSupport == 0)
8876 return 1;
8877#endif
8878
Tony Barbour300a6082015-04-07 13:44:53 -06008879 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06008880 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06008881
8882 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
8883
8884 result = RUN_ALL_TESTS();
8885
Tony Barbour6918cd52015-04-09 12:58:51 -06008886 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06008887 return result;
8888}