blob: a2bd301aedd558592bb562835fbed624a439c66f [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
Mark Lobodzinski2abefa92016-05-05 11:45:57 -0600670 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -0600671
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();
Tobin Ehlis41376e12015-07-03 08:45:14 -06001326}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001327#endif // MEM_TRACKER_TESTS
1328
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06001329#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06001330
1331TEST_F(VkLayerTest, LeakAnObject) {
1332 VkResult err;
1333
1334 TEST_DESCRIPTION(
1335 "Create a fence and destroy its device without first destroying the fence.");
1336
1337 // Note that we have to create a new device since destroying the
1338 // framework's device causes Teardown() to fail and just calling Teardown
1339 // will destroy the errorMonitor.
1340
1341 m_errorMonitor->SetDesiredFailureMsg(
1342 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1343 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
1344
1345 ASSERT_NO_FATAL_FAILURE(InitState());
1346
1347 const std::vector<VkQueueFamilyProperties> queue_props =
1348 m_device->queue_props;
1349 std::vector<VkDeviceQueueCreateInfo> queue_info;
1350 queue_info.reserve(queue_props.size());
1351 std::vector<std::vector<float>> queue_priorities;
1352 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
1353 VkDeviceQueueCreateInfo qi = {};
1354 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
1355 qi.pNext = NULL;
1356 qi.queueFamilyIndex = i;
1357 qi.queueCount = queue_props[i].queueCount;
1358 queue_priorities.emplace_back(qi.queueCount, 0.0f);
1359 qi.pQueuePriorities = queue_priorities[i].data();
1360 queue_info.push_back(qi);
1361 }
1362
1363 std::vector<const char *> device_layer_names;
1364 std::vector<const char *> device_extension_names;
1365 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
1366 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
1367 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
1368 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
1369 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
1370 device_layer_names.push_back("VK_LAYER_LUNARG_image");
1371 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
1372
1373 // The sacrificial device object
1374 VkDevice testDevice;
1375 VkDeviceCreateInfo device_create_info = {};
1376 auto features = m_device->phy().features();
1377 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
1378 device_create_info.pNext = NULL;
1379 device_create_info.queueCreateInfoCount = queue_info.size();
1380 device_create_info.pQueueCreateInfos = queue_info.data();
1381 device_create_info.enabledLayerCount = device_layer_names.size();
1382 device_create_info.ppEnabledLayerNames = device_layer_names.data();
1383 device_create_info.pEnabledFeatures = &features;
1384 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
1385 ASSERT_VK_SUCCESS(err);
1386
1387 VkFence fence;
1388 VkFenceCreateInfo fence_create_info = {};
1389 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1390 fence_create_info.pNext = NULL;
1391 fence_create_info.flags = 0;
1392 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
1393 ASSERT_VK_SUCCESS(err);
1394
1395 // Induce failure by not calling vkDestroyFence
1396 vkDestroyDevice(testDevice, NULL);
1397 m_errorMonitor->VerifyFound();
1398}
1399
1400TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
1401
1402 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
1403 "attempt to delete them from another.");
1404
1405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1406 "FreeCommandBuffers is attempting to free Command Buffer");
1407
1408 VkCommandPool command_pool_one;
1409 VkCommandPool command_pool_two;
1410
1411 VkCommandPoolCreateInfo pool_create_info{};
1412 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1413 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1414 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1415
1416 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1417 &command_pool_one);
1418
1419 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1420 &command_pool_two);
1421
1422 VkCommandBuffer command_buffer[9];
1423 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1424 command_buffer_allocate_info.sType =
1425 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1426 command_buffer_allocate_info.commandPool = command_pool_one;
1427 command_buffer_allocate_info.commandBufferCount = 9;
1428 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1429 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1430 command_buffer);
1431
1432 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
1433 &command_buffer[3]);
1434
1435 m_errorMonitor->VerifyFound();
1436
1437 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
1438 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
1439}
1440
1441TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
1442 VkResult err;
1443
1444 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
1445 "attempt to delete them from another.");
1446
1447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1448 "FreeDescriptorSets is attempting to free descriptorSet");
1449
1450 ASSERT_NO_FATAL_FAILURE(InitState());
1451 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1452
1453 VkDescriptorPoolSize ds_type_count = {};
1454 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
1455 ds_type_count.descriptorCount = 1;
1456
1457 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1458 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1459 ds_pool_ci.pNext = NULL;
1460 ds_pool_ci.flags = 0;
1461 ds_pool_ci.maxSets = 1;
1462 ds_pool_ci.poolSizeCount = 1;
1463 ds_pool_ci.pPoolSizes = &ds_type_count;
1464
1465 VkDescriptorPool ds_pool_one;
1466 err =
1467 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
1468 ASSERT_VK_SUCCESS(err);
1469
1470 // Create a second descriptor pool
1471 VkDescriptorPool ds_pool_two;
1472 err =
1473 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
1474 ASSERT_VK_SUCCESS(err);
1475
1476 VkDescriptorSetLayoutBinding dsl_binding = {};
1477 dsl_binding.binding = 0;
1478 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1479 dsl_binding.descriptorCount = 1;
1480 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1481 dsl_binding.pImmutableSamplers = NULL;
1482
1483 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1484 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1485 ds_layout_ci.pNext = NULL;
1486 ds_layout_ci.bindingCount = 1;
1487 ds_layout_ci.pBindings = &dsl_binding;
1488
1489 VkDescriptorSetLayout ds_layout;
1490 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1491 &ds_layout);
1492 ASSERT_VK_SUCCESS(err);
1493
1494 VkDescriptorSet descriptorSet;
1495 VkDescriptorSetAllocateInfo alloc_info = {};
1496 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1497 alloc_info.descriptorSetCount = 1;
1498 alloc_info.descriptorPool = ds_pool_one;
1499 alloc_info.pSetLayouts = &ds_layout;
1500 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1501 &descriptorSet);
1502 ASSERT_VK_SUCCESS(err);
1503
1504 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
1505
1506 m_errorMonitor->VerifyFound();
1507
1508 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1509 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
1510 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
1511}
1512
1513TEST_F(VkLayerTest, CreateUnknownObject) {
1514 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1515 "Invalid VkImage Object ");
1516
1517 TEST_DESCRIPTION(
1518 "Pass an invalid image object handle into a Vulkan API call.");
1519
1520 ASSERT_NO_FATAL_FAILURE(InitState());
1521
1522 // Pass bogus handle into GetImageMemoryRequirements
1523 VkMemoryRequirements mem_reqs;
1524 uint64_t fakeImageHandle = 0xCADECADE;
1525 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
1526
1527 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
1528
1529 m_errorMonitor->VerifyFound();
1530}
1531
Karl Schultz6addd812016-02-02 17:17:23 -07001532TEST_F(VkLayerTest, PipelineNotBound) {
1533 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001534
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06001535 TEST_DESCRIPTION(
1536 "Pass in an invalid pipeline object handle into a Vulkan API call.");
1537
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001538 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001539 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001540
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001541 ASSERT_NO_FATAL_FAILURE(InitState());
1542 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001543
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001544 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001545 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1546 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001547
1548 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001549 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1550 ds_pool_ci.pNext = NULL;
1551 ds_pool_ci.maxSets = 1;
1552 ds_pool_ci.poolSizeCount = 1;
1553 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001554
1555 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001556 err =
1557 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001558 ASSERT_VK_SUCCESS(err);
1559
1560 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001561 dsl_binding.binding = 0;
1562 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1563 dsl_binding.descriptorCount = 1;
1564 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1565 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001566
1567 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001568 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1569 ds_layout_ci.pNext = NULL;
1570 ds_layout_ci.bindingCount = 1;
1571 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001572
1573 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001574 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1575 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001576 ASSERT_VK_SUCCESS(err);
1577
1578 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001579 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001580 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001581 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001582 alloc_info.descriptorPool = ds_pool;
1583 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001584 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1585 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001586 ASSERT_VK_SUCCESS(err);
1587
1588 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001589 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1590 pipeline_layout_ci.pNext = NULL;
1591 pipeline_layout_ci.setLayoutCount = 1;
1592 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001593
1594 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001595 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1596 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001597 ASSERT_VK_SUCCESS(err);
1598
Mark Youngad779052016-01-06 14:26:04 -07001599 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001600
1601 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001602 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1603 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001604
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001605 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001606
Chia-I Wuf7458c52015-10-26 21:10:41 +08001607 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1608 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1609 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001610}
1611
Karl Schultz6addd812016-02-02 17:17:23 -07001612TEST_F(VkLayerTest, BindInvalidMemory) {
1613 VkResult err;
1614 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001615
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001617 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001618
Tobin Ehlisec598302015-09-15 15:02:17 -06001619 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001620
1621 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001622 VkImage image;
1623 VkDeviceMemory mem;
1624 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001625
Karl Schultz6addd812016-02-02 17:17:23 -07001626 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1627 const int32_t tex_width = 32;
1628 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001629
1630 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001631 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1632 image_create_info.pNext = NULL;
1633 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1634 image_create_info.format = tex_format;
1635 image_create_info.extent.width = tex_width;
1636 image_create_info.extent.height = tex_height;
1637 image_create_info.extent.depth = 1;
1638 image_create_info.mipLevels = 1;
1639 image_create_info.arrayLayers = 1;
1640 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1641 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1642 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1643 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001644
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001645 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001646 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1647 mem_alloc.pNext = NULL;
1648 mem_alloc.allocationSize = 0;
1649 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001650
Chia-I Wuf7458c52015-10-26 21:10:41 +08001651 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001652 ASSERT_VK_SUCCESS(err);
1653
Karl Schultz6addd812016-02-02 17:17:23 -07001654 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001655
1656 mem_alloc.allocationSize = mem_reqs.size;
1657
Karl Schultz6addd812016-02-02 17:17:23 -07001658 pass =
1659 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001660 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001661
1662 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001663 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001664 ASSERT_VK_SUCCESS(err);
1665
1666 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001667 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001668
1669 // Try to bind free memory that has been freed
1670 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1671 // This may very well return an error.
1672 (void)err;
1673
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001674 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001675
Chia-I Wuf7458c52015-10-26 21:10:41 +08001676 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001677}
1678
Karl Schultz6addd812016-02-02 17:17:23 -07001679TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1680 VkResult err;
1681 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001682
Karl Schultz6addd812016-02-02 17:17:23 -07001683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1684 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001685
Tobin Ehlisec598302015-09-15 15:02:17 -06001686 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001687
Karl Schultz6addd812016-02-02 17:17:23 -07001688 // Create an image object, allocate memory, destroy the object and then try
1689 // to bind it
1690 VkImage image;
1691 VkDeviceMemory mem;
1692 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001693
Karl Schultz6addd812016-02-02 17:17:23 -07001694 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1695 const int32_t tex_width = 32;
1696 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001697
1698 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001699 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1700 image_create_info.pNext = NULL;
1701 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1702 image_create_info.format = tex_format;
1703 image_create_info.extent.width = tex_width;
1704 image_create_info.extent.height = tex_height;
1705 image_create_info.extent.depth = 1;
1706 image_create_info.mipLevels = 1;
1707 image_create_info.arrayLayers = 1;
1708 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1709 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1710 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1711 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001712
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001713 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001714 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1715 mem_alloc.pNext = NULL;
1716 mem_alloc.allocationSize = 0;
1717 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001718
Chia-I Wuf7458c52015-10-26 21:10:41 +08001719 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001720 ASSERT_VK_SUCCESS(err);
1721
Karl Schultz6addd812016-02-02 17:17:23 -07001722 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001723
1724 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001725 pass =
1726 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001727 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001728
1729 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001730 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001731 ASSERT_VK_SUCCESS(err);
1732
1733 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001734 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001735 ASSERT_VK_SUCCESS(err);
1736
1737 // Now Try to bind memory to this destroyed object
1738 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1739 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001740 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001741
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001742 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001743
Chia-I Wuf7458c52015-10-26 21:10:41 +08001744 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001745}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001746
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001747#endif // OBJ_TRACKER_TESTS
1748
Tobin Ehlis0788f522015-05-26 16:11:58 -06001749#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001750
1751// This is a positive test. No errors should be generated.
1752TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
1753
1754 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1755 "submitted on separate queues followed by a QueueWaitIdle.");
1756
Dustin Graves48458142016-04-29 16:11:55 -06001757 if ((m_device->queue_props.empty()) ||
1758 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001759 return;
1760
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001761 m_errorMonitor->ExpectSuccess();
1762
1763 VkSemaphore semaphore;
1764 VkSemaphoreCreateInfo semaphore_create_info{};
1765 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1766 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1767 &semaphore);
1768
1769 VkCommandPool command_pool;
1770 VkCommandPoolCreateInfo pool_create_info{};
1771 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1772 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1773 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1774 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1775 &command_pool);
1776
1777 VkCommandBuffer command_buffer[2];
1778 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1779 command_buffer_allocate_info.sType =
1780 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1781 command_buffer_allocate_info.commandPool = command_pool;
1782 command_buffer_allocate_info.commandBufferCount = 2;
1783 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1784 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1785 command_buffer);
1786
1787 VkQueue queue = VK_NULL_HANDLE;
1788 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1789 1, &queue);
1790
1791 {
1792 VkCommandBufferBeginInfo begin_info{};
1793 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1794 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1795
1796 vkCmdPipelineBarrier(command_buffer[0],
1797 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1798 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1799 0, nullptr, 0, nullptr);
1800
1801 VkViewport viewport{};
1802 viewport.maxDepth = 1.0f;
1803 viewport.minDepth = 0.0f;
1804 viewport.width = 512;
1805 viewport.height = 512;
1806 viewport.x = 0;
1807 viewport.y = 0;
1808 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1809 vkEndCommandBuffer(command_buffer[0]);
1810 }
1811 {
1812 VkCommandBufferBeginInfo begin_info{};
1813 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1814 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1815
1816 VkViewport viewport{};
1817 viewport.maxDepth = 1.0f;
1818 viewport.minDepth = 0.0f;
1819 viewport.width = 512;
1820 viewport.height = 512;
1821 viewport.x = 0;
1822 viewport.y = 0;
1823 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1824 vkEndCommandBuffer(command_buffer[1]);
1825 }
1826 {
1827 VkSubmitInfo submit_info{};
1828 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1829 submit_info.commandBufferCount = 1;
1830 submit_info.pCommandBuffers = &command_buffer[0];
1831 submit_info.signalSemaphoreCount = 1;
1832 submit_info.pSignalSemaphores = &semaphore;
1833 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1834 }
1835 {
1836 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1837 VkSubmitInfo submit_info{};
1838 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1839 submit_info.commandBufferCount = 1;
1840 submit_info.pCommandBuffers = &command_buffer[1];
1841 submit_info.waitSemaphoreCount = 1;
1842 submit_info.pWaitSemaphores = &semaphore;
1843 submit_info.pWaitDstStageMask = flags;
1844 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1845 }
1846
1847 vkQueueWaitIdle(m_device->m_queue);
1848
1849 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1850 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1851 &command_buffer[0]);
1852 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1853
1854 m_errorMonitor->VerifyNotFound();
1855}
1856
1857// This is a positive test. No errors should be generated.
1858TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
1859
1860 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1861 "submitted on separate queues, the second having a fence"
1862 "followed by a QueueWaitIdle.");
1863
Dustin Graves48458142016-04-29 16:11:55 -06001864 if ((m_device->queue_props.empty()) ||
1865 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001866 return;
1867
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001868 m_errorMonitor->ExpectSuccess();
1869
1870 VkFence fence;
1871 VkFenceCreateInfo fence_create_info{};
1872 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1873 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1874
1875 VkSemaphore semaphore;
1876 VkSemaphoreCreateInfo semaphore_create_info{};
1877 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1878 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1879 &semaphore);
1880
1881 VkCommandPool command_pool;
1882 VkCommandPoolCreateInfo pool_create_info{};
1883 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1884 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1885 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1886 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1887 &command_pool);
1888
1889 VkCommandBuffer command_buffer[2];
1890 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1891 command_buffer_allocate_info.sType =
1892 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1893 command_buffer_allocate_info.commandPool = command_pool;
1894 command_buffer_allocate_info.commandBufferCount = 2;
1895 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1896 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1897 command_buffer);
1898
1899 VkQueue queue = VK_NULL_HANDLE;
1900 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1901 1, &queue);
1902
1903 {
1904 VkCommandBufferBeginInfo begin_info{};
1905 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1906 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1907
1908 vkCmdPipelineBarrier(command_buffer[0],
1909 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1910 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1911 0, nullptr, 0, nullptr);
1912
1913 VkViewport viewport{};
1914 viewport.maxDepth = 1.0f;
1915 viewport.minDepth = 0.0f;
1916 viewport.width = 512;
1917 viewport.height = 512;
1918 viewport.x = 0;
1919 viewport.y = 0;
1920 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1921 vkEndCommandBuffer(command_buffer[0]);
1922 }
1923 {
1924 VkCommandBufferBeginInfo begin_info{};
1925 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1926 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1927
1928 VkViewport viewport{};
1929 viewport.maxDepth = 1.0f;
1930 viewport.minDepth = 0.0f;
1931 viewport.width = 512;
1932 viewport.height = 512;
1933 viewport.x = 0;
1934 viewport.y = 0;
1935 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1936 vkEndCommandBuffer(command_buffer[1]);
1937 }
1938 {
1939 VkSubmitInfo submit_info{};
1940 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1941 submit_info.commandBufferCount = 1;
1942 submit_info.pCommandBuffers = &command_buffer[0];
1943 submit_info.signalSemaphoreCount = 1;
1944 submit_info.pSignalSemaphores = &semaphore;
1945 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1946 }
1947 {
1948 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1949 VkSubmitInfo submit_info{};
1950 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1951 submit_info.commandBufferCount = 1;
1952 submit_info.pCommandBuffers = &command_buffer[1];
1953 submit_info.waitSemaphoreCount = 1;
1954 submit_info.pWaitSemaphores = &semaphore;
1955 submit_info.pWaitDstStageMask = flags;
1956 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1957 }
1958
1959 vkQueueWaitIdle(m_device->m_queue);
1960
1961 vkDestroyFence(m_device->device(), fence, nullptr);
1962 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1963 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1964 &command_buffer[0]);
1965 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1966
1967 m_errorMonitor->VerifyNotFound();
1968}
1969
1970// This is a positive test. No errors should be generated.
1971TEST_F(VkLayerTest,
1972 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
1973
1974 TEST_DESCRIPTION(
1975 "Two command buffers, each in a separate QueueSubmit call "
1976 "submitted on separate queues, the second having a fence"
1977 "followed by two consecutive WaitForFences calls on the same fence.");
1978
Dustin Graves48458142016-04-29 16:11:55 -06001979 if ((m_device->queue_props.empty()) ||
1980 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06001981 return;
1982
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001983 m_errorMonitor->ExpectSuccess();
1984
1985 VkFence fence;
1986 VkFenceCreateInfo fence_create_info{};
1987 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1988 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1989
1990 VkSemaphore semaphore;
1991 VkSemaphoreCreateInfo semaphore_create_info{};
1992 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1993 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1994 &semaphore);
1995
1996 VkCommandPool command_pool;
1997 VkCommandPoolCreateInfo pool_create_info{};
1998 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1999 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2000 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2001 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2002 &command_pool);
2003
2004 VkCommandBuffer command_buffer[2];
2005 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2006 command_buffer_allocate_info.sType =
2007 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2008 command_buffer_allocate_info.commandPool = command_pool;
2009 command_buffer_allocate_info.commandBufferCount = 2;
2010 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2011 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2012 command_buffer);
2013
2014 VkQueue queue = VK_NULL_HANDLE;
2015 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2016 1, &queue);
2017
2018 {
2019 VkCommandBufferBeginInfo begin_info{};
2020 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2021 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2022
2023 vkCmdPipelineBarrier(command_buffer[0],
2024 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2025 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2026 0, nullptr, 0, nullptr);
2027
2028 VkViewport viewport{};
2029 viewport.maxDepth = 1.0f;
2030 viewport.minDepth = 0.0f;
2031 viewport.width = 512;
2032 viewport.height = 512;
2033 viewport.x = 0;
2034 viewport.y = 0;
2035 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2036 vkEndCommandBuffer(command_buffer[0]);
2037 }
2038 {
2039 VkCommandBufferBeginInfo begin_info{};
2040 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2041 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2042
2043 VkViewport viewport{};
2044 viewport.maxDepth = 1.0f;
2045 viewport.minDepth = 0.0f;
2046 viewport.width = 512;
2047 viewport.height = 512;
2048 viewport.x = 0;
2049 viewport.y = 0;
2050 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2051 vkEndCommandBuffer(command_buffer[1]);
2052 }
2053 {
2054 VkSubmitInfo submit_info{};
2055 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2056 submit_info.commandBufferCount = 1;
2057 submit_info.pCommandBuffers = &command_buffer[0];
2058 submit_info.signalSemaphoreCount = 1;
2059 submit_info.pSignalSemaphores = &semaphore;
2060 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2061 }
2062 {
2063 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2064 VkSubmitInfo submit_info{};
2065 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2066 submit_info.commandBufferCount = 1;
2067 submit_info.pCommandBuffers = &command_buffer[1];
2068 submit_info.waitSemaphoreCount = 1;
2069 submit_info.pWaitSemaphores = &semaphore;
2070 submit_info.pWaitDstStageMask = flags;
2071 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2072 }
2073
2074 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2075 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2076
2077 vkDestroyFence(m_device->device(), fence, nullptr);
2078 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2079 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2080 &command_buffer[0]);
2081 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2082
2083 m_errorMonitor->VerifyNotFound();
2084}
2085
2086// This is a positive test. No errors should be generated.
2087TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
2088
2089 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2090 "submitted on separate queues, the second having a fence, "
2091 "followed by a WaitForFences call.");
2092
Dustin Graves48458142016-04-29 16:11:55 -06002093 if ((m_device->queue_props.empty()) ||
2094 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06002095 return;
2096
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002097 m_errorMonitor->ExpectSuccess();
2098
2099 VkFence fence;
2100 VkFenceCreateInfo fence_create_info{};
2101 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2102 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2103
2104 VkSemaphore semaphore;
2105 VkSemaphoreCreateInfo semaphore_create_info{};
2106 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2107 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2108 &semaphore);
2109
2110 VkCommandPool command_pool;
2111 VkCommandPoolCreateInfo pool_create_info{};
2112 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2113 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2114 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2115 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2116 &command_pool);
2117
2118 VkCommandBuffer command_buffer[2];
2119 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2120 command_buffer_allocate_info.sType =
2121 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2122 command_buffer_allocate_info.commandPool = command_pool;
2123 command_buffer_allocate_info.commandBufferCount = 2;
2124 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2125 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2126 command_buffer);
2127
2128 VkQueue queue = VK_NULL_HANDLE;
2129 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
2130 1, &queue);
2131
2132
2133 {
2134 VkCommandBufferBeginInfo begin_info{};
2135 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2136 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2137
2138 vkCmdPipelineBarrier(command_buffer[0],
2139 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2140 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2141 0, nullptr, 0, nullptr);
2142
2143 VkViewport viewport{};
2144 viewport.maxDepth = 1.0f;
2145 viewport.minDepth = 0.0f;
2146 viewport.width = 512;
2147 viewport.height = 512;
2148 viewport.x = 0;
2149 viewport.y = 0;
2150 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2151 vkEndCommandBuffer(command_buffer[0]);
2152 }
2153 {
2154 VkCommandBufferBeginInfo begin_info{};
2155 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2156 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2157
2158 VkViewport viewport{};
2159 viewport.maxDepth = 1.0f;
2160 viewport.minDepth = 0.0f;
2161 viewport.width = 512;
2162 viewport.height = 512;
2163 viewport.x = 0;
2164 viewport.y = 0;
2165 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2166 vkEndCommandBuffer(command_buffer[1]);
2167 }
2168 {
2169 VkSubmitInfo submit_info{};
2170 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2171 submit_info.commandBufferCount = 1;
2172 submit_info.pCommandBuffers = &command_buffer[0];
2173 submit_info.signalSemaphoreCount = 1;
2174 submit_info.pSignalSemaphores = &semaphore;
2175 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2176 }
2177 {
2178 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2179 VkSubmitInfo submit_info{};
2180 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2181 submit_info.commandBufferCount = 1;
2182 submit_info.pCommandBuffers = &command_buffer[1];
2183 submit_info.waitSemaphoreCount = 1;
2184 submit_info.pWaitSemaphores = &semaphore;
2185 submit_info.pWaitDstStageMask = flags;
2186 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2187 }
2188
2189 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2190
2191 vkDestroyFence(m_device->device(), fence, nullptr);
2192 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2193 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2194 &command_buffer[0]);
2195 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2196
2197 m_errorMonitor->VerifyNotFound();
2198}
2199
2200// This is a positive test. No errors should be generated.
2201TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
2202
2203 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2204 "on the same queue, sharing a signal/wait semaphore, the "
2205 "second having a fence, "
2206 "followed by a WaitForFences call.");
2207
2208 m_errorMonitor->ExpectSuccess();
2209
2210 VkFence fence;
2211 VkFenceCreateInfo fence_create_info{};
2212 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2213 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2214
2215 VkSemaphore semaphore;
2216 VkSemaphoreCreateInfo semaphore_create_info{};
2217 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2218 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2219 &semaphore);
2220
2221 VkCommandPool command_pool;
2222 VkCommandPoolCreateInfo pool_create_info{};
2223 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2224 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2225 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2226 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2227 &command_pool);
2228
2229 VkCommandBuffer command_buffer[2];
2230 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2231 command_buffer_allocate_info.sType =
2232 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2233 command_buffer_allocate_info.commandPool = command_pool;
2234 command_buffer_allocate_info.commandBufferCount = 2;
2235 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2236 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2237 command_buffer);
2238
2239 {
2240 VkCommandBufferBeginInfo begin_info{};
2241 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2242 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2243
2244 vkCmdPipelineBarrier(command_buffer[0],
2245 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2246 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2247 0, nullptr, 0, nullptr);
2248
2249 VkViewport viewport{};
2250 viewport.maxDepth = 1.0f;
2251 viewport.minDepth = 0.0f;
2252 viewport.width = 512;
2253 viewport.height = 512;
2254 viewport.x = 0;
2255 viewport.y = 0;
2256 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2257 vkEndCommandBuffer(command_buffer[0]);
2258 }
2259 {
2260 VkCommandBufferBeginInfo begin_info{};
2261 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2262 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2263
2264 VkViewport viewport{};
2265 viewport.maxDepth = 1.0f;
2266 viewport.minDepth = 0.0f;
2267 viewport.width = 512;
2268 viewport.height = 512;
2269 viewport.x = 0;
2270 viewport.y = 0;
2271 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2272 vkEndCommandBuffer(command_buffer[1]);
2273 }
2274 {
2275 VkSubmitInfo submit_info{};
2276 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2277 submit_info.commandBufferCount = 1;
2278 submit_info.pCommandBuffers = &command_buffer[0];
2279 submit_info.signalSemaphoreCount = 1;
2280 submit_info.pSignalSemaphores = &semaphore;
2281 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2282 }
2283 {
2284 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2285 VkSubmitInfo submit_info{};
2286 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2287 submit_info.commandBufferCount = 1;
2288 submit_info.pCommandBuffers = &command_buffer[1];
2289 submit_info.waitSemaphoreCount = 1;
2290 submit_info.pWaitSemaphores = &semaphore;
2291 submit_info.pWaitDstStageMask = flags;
2292 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2293 }
2294
2295 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2296
2297 vkDestroyFence(m_device->device(), fence, nullptr);
2298 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2299 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2300 &command_buffer[0]);
2301 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2302
2303 m_errorMonitor->VerifyNotFound();
2304}
2305
2306// This is a positive test. No errors should be generated.
2307TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
2308
2309 TEST_DESCRIPTION(
2310 "Two command buffers, each in a separate QueueSubmit call "
2311 "on the same queue, no fences, followed by a third QueueSubmit with NO "
2312 "SubmitInfos but with a fence, followed by a WaitForFences call.");
2313
2314 m_errorMonitor->ExpectSuccess();
2315
2316 VkFence fence;
2317 VkFenceCreateInfo fence_create_info{};
2318 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2319 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2320
2321 VkCommandPool command_pool;
2322 VkCommandPoolCreateInfo pool_create_info{};
2323 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2324 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2325 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2326 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2327 &command_pool);
2328
2329 VkCommandBuffer command_buffer[2];
2330 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2331 command_buffer_allocate_info.sType =
2332 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2333 command_buffer_allocate_info.commandPool = command_pool;
2334 command_buffer_allocate_info.commandBufferCount = 2;
2335 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2336 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2337 command_buffer);
2338
2339 {
2340 VkCommandBufferBeginInfo begin_info{};
2341 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2342 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2343
2344 vkCmdPipelineBarrier(command_buffer[0],
2345 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2346 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2347 0, nullptr, 0, nullptr);
2348
2349 VkViewport viewport{};
2350 viewport.maxDepth = 1.0f;
2351 viewport.minDepth = 0.0f;
2352 viewport.width = 512;
2353 viewport.height = 512;
2354 viewport.x = 0;
2355 viewport.y = 0;
2356 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2357 vkEndCommandBuffer(command_buffer[0]);
2358 }
2359 {
2360 VkCommandBufferBeginInfo begin_info{};
2361 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2362 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2363
2364 VkViewport viewport{};
2365 viewport.maxDepth = 1.0f;
2366 viewport.minDepth = 0.0f;
2367 viewport.width = 512;
2368 viewport.height = 512;
2369 viewport.x = 0;
2370 viewport.y = 0;
2371 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2372 vkEndCommandBuffer(command_buffer[1]);
2373 }
2374 {
2375 VkSubmitInfo submit_info{};
2376 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2377 submit_info.commandBufferCount = 1;
2378 submit_info.pCommandBuffers = &command_buffer[0];
2379 submit_info.signalSemaphoreCount = 0;
2380 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2381 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2382 }
2383 {
2384 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2385 VkSubmitInfo submit_info{};
2386 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2387 submit_info.commandBufferCount = 1;
2388 submit_info.pCommandBuffers = &command_buffer[1];
2389 submit_info.waitSemaphoreCount = 0;
2390 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2391 submit_info.pWaitDstStageMask = flags;
2392 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2393 }
2394
2395 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
2396
2397 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2398
2399 vkDestroyFence(m_device->device(), fence, nullptr);
2400 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2401 &command_buffer[0]);
2402 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2403
2404 m_errorMonitor->VerifyNotFound();
2405}
2406
2407// This is a positive test. No errors should be generated.
2408TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
2409
2410 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
2411 "on the same queue, the second having a fence, followed "
2412 "by a WaitForFences call.");
2413
2414 m_errorMonitor->ExpectSuccess();
2415
2416 VkFence fence;
2417 VkFenceCreateInfo fence_create_info{};
2418 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2419 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2420
2421 VkCommandPool command_pool;
2422 VkCommandPoolCreateInfo pool_create_info{};
2423 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2424 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2425 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2426 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2427 &command_pool);
2428
2429 VkCommandBuffer command_buffer[2];
2430 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2431 command_buffer_allocate_info.sType =
2432 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2433 command_buffer_allocate_info.commandPool = command_pool;
2434 command_buffer_allocate_info.commandBufferCount = 2;
2435 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2436 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2437 command_buffer);
2438
2439 {
2440 VkCommandBufferBeginInfo begin_info{};
2441 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2442 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2443
2444 vkCmdPipelineBarrier(command_buffer[0],
2445 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2446 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2447 0, nullptr, 0, nullptr);
2448
2449 VkViewport viewport{};
2450 viewport.maxDepth = 1.0f;
2451 viewport.minDepth = 0.0f;
2452 viewport.width = 512;
2453 viewport.height = 512;
2454 viewport.x = 0;
2455 viewport.y = 0;
2456 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2457 vkEndCommandBuffer(command_buffer[0]);
2458 }
2459 {
2460 VkCommandBufferBeginInfo begin_info{};
2461 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2462 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2463
2464 VkViewport viewport{};
2465 viewport.maxDepth = 1.0f;
2466 viewport.minDepth = 0.0f;
2467 viewport.width = 512;
2468 viewport.height = 512;
2469 viewport.x = 0;
2470 viewport.y = 0;
2471 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2472 vkEndCommandBuffer(command_buffer[1]);
2473 }
2474 {
2475 VkSubmitInfo submit_info{};
2476 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2477 submit_info.commandBufferCount = 1;
2478 submit_info.pCommandBuffers = &command_buffer[0];
2479 submit_info.signalSemaphoreCount = 0;
2480 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
2481 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2482 }
2483 {
2484 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2485 VkSubmitInfo submit_info{};
2486 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2487 submit_info.commandBufferCount = 1;
2488 submit_info.pCommandBuffers = &command_buffer[1];
2489 submit_info.waitSemaphoreCount = 0;
2490 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
2491 submit_info.pWaitDstStageMask = flags;
2492 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
2493 }
2494
2495 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2496
2497 vkDestroyFence(m_device->device(), fence, nullptr);
2498 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2499 &command_buffer[0]);
2500 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2501
2502 m_errorMonitor->VerifyNotFound();
2503}
2504
2505// This is a positive test. No errors should be generated.
2506TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
2507
2508 TEST_DESCRIPTION(
2509 "Two command buffers each in a separate SubmitInfo sent in a single "
2510 "QueueSubmit call followed by a WaitForFences call.");
2511
2512 m_errorMonitor->ExpectSuccess();
2513
2514 VkFence fence;
2515 VkFenceCreateInfo fence_create_info{};
2516 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2517 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
2518
2519 VkSemaphore semaphore;
2520 VkSemaphoreCreateInfo semaphore_create_info{};
2521 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2522 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
2523 &semaphore);
2524
2525 VkCommandPool command_pool;
2526 VkCommandPoolCreateInfo pool_create_info{};
2527 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2528 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2529 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2530 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
2531 &command_pool);
2532
2533 VkCommandBuffer command_buffer[2];
2534 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2535 command_buffer_allocate_info.sType =
2536 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2537 command_buffer_allocate_info.commandPool = command_pool;
2538 command_buffer_allocate_info.commandBufferCount = 2;
2539 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2540 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
2541 command_buffer);
2542
2543 {
2544 VkCommandBufferBeginInfo begin_info{};
2545 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2546 vkBeginCommandBuffer(command_buffer[0], &begin_info);
2547
2548 vkCmdPipelineBarrier(command_buffer[0],
2549 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
2550 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
2551 0, nullptr, 0, nullptr);
2552
2553 VkViewport viewport{};
2554 viewport.maxDepth = 1.0f;
2555 viewport.minDepth = 0.0f;
2556 viewport.width = 512;
2557 viewport.height = 512;
2558 viewport.x = 0;
2559 viewport.y = 0;
2560 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
2561 vkEndCommandBuffer(command_buffer[0]);
2562 }
2563 {
2564 VkCommandBufferBeginInfo begin_info{};
2565 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2566 vkBeginCommandBuffer(command_buffer[1], &begin_info);
2567
2568 VkViewport viewport{};
2569 viewport.maxDepth = 1.0f;
2570 viewport.minDepth = 0.0f;
2571 viewport.width = 512;
2572 viewport.height = 512;
2573 viewport.x = 0;
2574 viewport.y = 0;
2575 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
2576 vkEndCommandBuffer(command_buffer[1]);
2577 }
2578 {
2579 VkSubmitInfo submit_info[2];
2580 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
2581
2582 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2583 submit_info[0].pNext = NULL;
2584 submit_info[0].commandBufferCount = 1;
2585 submit_info[0].pCommandBuffers = &command_buffer[0];
2586 submit_info[0].signalSemaphoreCount = 1;
2587 submit_info[0].pSignalSemaphores = &semaphore;
2588 submit_info[0].waitSemaphoreCount = 0;
2589 submit_info[0].pWaitSemaphores = NULL;
2590 submit_info[0].pWaitDstStageMask = 0;
2591
2592 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2593 submit_info[1].pNext = NULL;
2594 submit_info[1].commandBufferCount = 1;
2595 submit_info[1].pCommandBuffers = &command_buffer[1];
2596 submit_info[1].waitSemaphoreCount = 1;
2597 submit_info[1].pWaitSemaphores = &semaphore;
2598 submit_info[1].pWaitDstStageMask = flags;
2599 submit_info[1].signalSemaphoreCount = 0;
2600 submit_info[1].pSignalSemaphores = NULL;
2601 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
2602 }
2603
2604 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2605
2606 vkDestroyFence(m_device->device(), fence, nullptr);
2607 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
2608 &command_buffer[0]);
2609 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2610
2611 m_errorMonitor->VerifyNotFound();
2612}
2613
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002614TEST_F(VkLayerTest, DynamicStatesNotBound) {
2615 TEST_DESCRIPTION(
2616 "Run a series of simple draw calls to validate all the different "
2617 "failure cases that can occur when dynamic state is required but not "
2618 "correctly bound."
2619 "Here are the different dynamic state cases verified by this test:\n"
2620 "-Line Width\n-Depth Bias\n-Viewport State\n-Scissor State\n-Blend "
2621 "State\n-Depth Bounds\n-Stencil Read Mask\n-Stencil Write "
2622 "Mask\n-Stencil Reference");
2623
2624 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07002625 m_errorMonitor->SetDesiredFailureMsg(
2626 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002627 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002628 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2629 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002630 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002631 // Dynamic depth bias
Karl Schultz6addd812016-02-02 17:17:23 -07002632 m_errorMonitor->SetDesiredFailureMsg(
2633 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002634 "Dynamic depth bias state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002635 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2636 BsoFailDepthBias);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002637 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002638 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07002639 m_errorMonitor->SetDesiredFailureMsg(
2640 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002641 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002642 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2643 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002644 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002645 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07002646 m_errorMonitor->SetDesiredFailureMsg(
2647 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002648 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002649 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2650 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002651 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002652 // Dynamic blend state
Karl Schultz6addd812016-02-02 17:17:23 -07002653 m_errorMonitor->SetDesiredFailureMsg(
2654 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002655 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002656 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2657 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002658 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002659 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07002660 m_errorMonitor->SetDesiredFailureMsg(
2661 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002662 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002663 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2664 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002665 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002666 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07002667 m_errorMonitor->SetDesiredFailureMsg(
2668 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002669 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002670 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2671 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002672 m_errorMonitor->VerifyFound();
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06002673 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07002674 m_errorMonitor->SetDesiredFailureMsg(
2675 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002676 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07002677 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2678 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002679 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002680}
2681
Karl Schultz6addd812016-02-02 17:17:23 -07002682TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002683 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002684
Karl Schultz6addd812016-02-02 17:17:23 -07002685 m_errorMonitor->SetDesiredFailureMsg(
2686 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2687 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2688 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002689
2690 VkFenceCreateInfo fenceInfo = {};
2691 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2692 fenceInfo.pNext = NULL;
2693 fenceInfo.flags = 0;
2694
2695 ASSERT_NO_FATAL_FAILURE(InitState());
2696 ASSERT_NO_FATAL_FAILURE(InitViewport());
2697 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2698
Karl Schultz6addd812016-02-02 17:17:23 -07002699 // We luck out b/c by default the framework creates CB w/ the
2700 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002701 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002702 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2703 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002704 EndCommandBuffer();
2705
2706 testFence.init(*m_device, fenceInfo);
2707
2708 // Bypass framework since it does the waits automatically
2709 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002710 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002711 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2712 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002713 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002714 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002715 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002716 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002717 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002718 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002719 submit_info.pSignalSemaphores = NULL;
2720
Karl Schultz6addd812016-02-02 17:17:23 -07002721 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2722 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002723
Karl Schultz6addd812016-02-02 17:17:23 -07002724 // Cause validation error by re-submitting cmd buffer that should only be
2725 // submitted once
2726 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002727
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002728 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002729}
2730
Karl Schultz6addd812016-02-02 17:17:23 -07002731TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002732 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002733 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002734
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002736 "Unable to allocate 1 descriptors of "
2737 "type "
2738 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002739
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002740 ASSERT_NO_FATAL_FAILURE(InitState());
2741 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002742
Karl Schultz6addd812016-02-02 17:17:23 -07002743 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
2744 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002745 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002746 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2747 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002748
2749 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002750 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2751 ds_pool_ci.pNext = NULL;
2752 ds_pool_ci.flags = 0;
2753 ds_pool_ci.maxSets = 1;
2754 ds_pool_ci.poolSizeCount = 1;
2755 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002756
2757 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002758 err =
2759 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002760 ASSERT_VK_SUCCESS(err);
2761
2762 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002763 dsl_binding.binding = 0;
2764 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2765 dsl_binding.descriptorCount = 1;
2766 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2767 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002768
2769 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002770 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2771 ds_layout_ci.pNext = NULL;
2772 ds_layout_ci.bindingCount = 1;
2773 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002774
2775 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002776 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2777 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002778 ASSERT_VK_SUCCESS(err);
2779
2780 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002781 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002782 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002783 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002784 alloc_info.descriptorPool = ds_pool;
2785 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002786 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2787 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002788
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002789 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002790
Chia-I Wuf7458c52015-10-26 21:10:41 +08002791 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2792 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002793}
2794
Karl Schultz6addd812016-02-02 17:17:23 -07002795TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
2796 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06002797
Karl Schultz6addd812016-02-02 17:17:23 -07002798 m_errorMonitor->SetDesiredFailureMsg(
2799 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2800 "It is invalid to call vkFreeDescriptorSets() with a pool created "
2801 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002802
Tobin Ehlise735c692015-10-08 13:13:50 -06002803 ASSERT_NO_FATAL_FAILURE(InitState());
2804 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06002805
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002806 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002807 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2808 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06002809
2810 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002811 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2812 ds_pool_ci.pNext = NULL;
2813 ds_pool_ci.maxSets = 1;
2814 ds_pool_ci.poolSizeCount = 1;
2815 ds_pool_ci.flags = 0;
2816 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
2817 // app can only call vkResetDescriptorPool on this pool.;
2818 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06002819
2820 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002821 err =
2822 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06002823 ASSERT_VK_SUCCESS(err);
2824
2825 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002826 dsl_binding.binding = 0;
2827 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2828 dsl_binding.descriptorCount = 1;
2829 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2830 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06002831
2832 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002833 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2834 ds_layout_ci.pNext = NULL;
2835 ds_layout_ci.bindingCount = 1;
2836 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06002837
2838 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002839 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2840 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06002841 ASSERT_VK_SUCCESS(err);
2842
2843 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002844 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002845 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002846 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002847 alloc_info.descriptorPool = ds_pool;
2848 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002849 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2850 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06002851 ASSERT_VK_SUCCESS(err);
2852
2853 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002854 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06002855
Chia-I Wuf7458c52015-10-26 21:10:41 +08002856 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2857 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06002858}
2859
Karl Schultz6addd812016-02-02 17:17:23 -07002860TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002861 // Attempt to clear Descriptor Pool with bad object.
2862 // ObjectTracker should catch this.
2863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2864 "Invalid VkDescriptorPool Object 0xbaad6001");
2865 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
2866 vkResetDescriptorPool(device(), badPool, 0);
2867 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002868}
2869
Karl Schultz6addd812016-02-02 17:17:23 -07002870TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002871 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
2872 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002873 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06002874 // call vkCmdBindDescriptorSets w/ false Descriptor Set
2875 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
2876 VkResult err;
2877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2878 "Invalid VkDescriptorSet Object 0xbaad6001");
2879
2880 ASSERT_NO_FATAL_FAILURE(InitState());
2881
2882 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
2883 layout_bindings[0].binding = 0;
2884 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2885 layout_bindings[0].descriptorCount = 1;
2886 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2887 layout_bindings[0].pImmutableSamplers = NULL;
2888
2889 VkDescriptorSetLayout descriptor_set_layout;
2890 VkDescriptorSetLayoutCreateInfo dslci = {};
2891 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2892 dslci.pNext = NULL;
2893 dslci.bindingCount = 1;
2894 dslci.pBindings = layout_bindings;
2895 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002896 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002897
2898 VkPipelineLayout pipeline_layout;
2899 VkPipelineLayoutCreateInfo plci = {};
2900 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2901 plci.pNext = NULL;
2902 plci.setLayoutCount = 1;
2903 plci.pSetLayouts = &descriptor_set_layout;
2904 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06002905 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06002906
2907 BeginCommandBuffer();
2908 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2909 pipeline_layout, 0, 1, &badSet, 0, NULL);
2910 m_errorMonitor->VerifyFound();
2911 EndCommandBuffer();
2912 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
2913 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002914}
2915
Karl Schultz6addd812016-02-02 17:17:23 -07002916TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002917 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
2918 // ObjectTracker should catch this.
2919 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
2920 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2921 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
2922
2923 VkPipelineLayout pipeline_layout;
2924 VkPipelineLayoutCreateInfo plci = {};
2925 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2926 plci.pNext = NULL;
2927 plci.setLayoutCount = 1;
2928 plci.pSetLayouts = &bad_layout;
2929 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
2930
2931 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002932}
2933
Karl Schultz6addd812016-02-02 17:17:23 -07002934TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002935 // Attempt to bind an invalid Pipeline to a valid Command Buffer
2936 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002937 // Create a valid cmd buffer
2938 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06002939 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
2940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2941 "Invalid VkPipeline Object 0xbaad6001");
2942 ASSERT_NO_FATAL_FAILURE(InitState());
2943 BeginCommandBuffer();
2944 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2945 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
2946 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06002947
2948 // Now issue a draw call with no pipeline bound
2949 m_errorMonitor->SetDesiredFailureMsg(
2950 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2951 "At Draw/Dispatch time no valid VkPipeline is bound!");
2952 ASSERT_NO_FATAL_FAILURE(InitState());
2953 BeginCommandBuffer();
2954 Draw(1, 0, 0, 0);
2955 m_errorMonitor->VerifyFound();
2956 // Finally same check once more but with Dispatch/Compute
2957 m_errorMonitor->SetDesiredFailureMsg(
2958 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2959 "At Draw/Dispatch time no valid VkPipeline is bound!");
2960 ASSERT_NO_FATAL_FAILURE(InitState());
2961 BeginCommandBuffer();
2962 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
2963 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002964}
2965
Karl Schultz6addd812016-02-02 17:17:23 -07002966TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
2967 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
2968 // CommandBuffer
2969 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002970
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002972 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002973
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002974 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06002975 ASSERT_NO_FATAL_FAILURE(InitViewport());
2976 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002977 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002978 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2979 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002980
2981 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002982 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2983 ds_pool_ci.pNext = NULL;
2984 ds_pool_ci.maxSets = 1;
2985 ds_pool_ci.poolSizeCount = 1;
2986 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06002987
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002988 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002989 err =
2990 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002991 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002992
Tony Barboureb254902015-07-15 12:50:33 -06002993 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002994 dsl_binding.binding = 0;
2995 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2996 dsl_binding.descriptorCount = 1;
2997 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2998 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002999
Tony Barboureb254902015-07-15 12:50:33 -06003000 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003001 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3002 ds_layout_ci.pNext = NULL;
3003 ds_layout_ci.bindingCount = 1;
3004 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003005 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003006 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3007 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003008 ASSERT_VK_SUCCESS(err);
3009
3010 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003011 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003012 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003013 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003014 alloc_info.descriptorPool = ds_pool;
3015 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003016 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3017 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003018 ASSERT_VK_SUCCESS(err);
3019
Tony Barboureb254902015-07-15 12:50:33 -06003020 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003021 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3022 pipeline_layout_ci.pNext = NULL;
3023 pipeline_layout_ci.setLayoutCount = 1;
3024 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003025
3026 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003027 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3028 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003029 ASSERT_VK_SUCCESS(err);
3030
Karl Schultz6addd812016-02-02 17:17:23 -07003031 VkShaderObj vs(m_device, bindStateVertShaderText,
3032 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06003033 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07003034 // on more devices
3035 VkShaderObj fs(m_device, bindStateFragShaderText,
3036 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003037
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003038 VkPipelineObj pipe(m_device);
3039 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06003040 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06003041 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06003042 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06003043
3044 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003045 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3046 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3047 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3048 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3049 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003050
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003051 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003052
Chia-I Wuf7458c52015-10-26 21:10:41 +08003053 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3054 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3055 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003056}
3057
Karl Schultz6addd812016-02-02 17:17:23 -07003058TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003059 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07003060 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003061
Karl Schultz6addd812016-02-02 17:17:23 -07003062 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003063 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
3064 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003065
3066 ASSERT_NO_FATAL_FAILURE(InitState());
3067 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003068 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3069 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003070
3071 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003072 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3073 ds_pool_ci.pNext = NULL;
3074 ds_pool_ci.maxSets = 1;
3075 ds_pool_ci.poolSizeCount = 1;
3076 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003077
3078 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003079 err =
3080 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003081 ASSERT_VK_SUCCESS(err);
3082
3083 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003084 dsl_binding.binding = 0;
3085 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3086 dsl_binding.descriptorCount = 1;
3087 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3088 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003089
3090 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003091 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3092 ds_layout_ci.pNext = NULL;
3093 ds_layout_ci.bindingCount = 1;
3094 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003095 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003096 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3097 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003098 ASSERT_VK_SUCCESS(err);
3099
3100 VkDescriptorSet descriptorSet;
3101 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003102 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003103 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003104 alloc_info.descriptorPool = ds_pool;
3105 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003106 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3107 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003108 ASSERT_VK_SUCCESS(err);
3109
Karl Schultz6addd812016-02-02 17:17:23 -07003110 VkBufferView view =
3111 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003112 VkWriteDescriptorSet descriptor_write;
3113 memset(&descriptor_write, 0, sizeof(descriptor_write));
3114 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3115 descriptor_write.dstSet = descriptorSet;
3116 descriptor_write.dstBinding = 0;
3117 descriptor_write.descriptorCount = 1;
3118 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
3119 descriptor_write.pTexelBufferView = &view;
3120
3121 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3122
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003123 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07003124
3125 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3126 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3127}
3128
Karl Schultz6addd812016-02-02 17:17:23 -07003129TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
3130 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
3131 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07003132 // 1. No dynamicOffset supplied
3133 // 2. Too many dynamicOffsets supplied
3134 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07003135 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003137 " requires 1 dynamicOffsets, but only "
3138 "0 dynamicOffsets are left in "
3139 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003140
3141 ASSERT_NO_FATAL_FAILURE(InitState());
3142 ASSERT_NO_FATAL_FAILURE(InitViewport());
3143 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3144
3145 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003146 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3147 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003148
3149 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003150 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3151 ds_pool_ci.pNext = NULL;
3152 ds_pool_ci.maxSets = 1;
3153 ds_pool_ci.poolSizeCount = 1;
3154 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003155
3156 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003157 err =
3158 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003159 ASSERT_VK_SUCCESS(err);
3160
3161 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003162 dsl_binding.binding = 0;
3163 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3164 dsl_binding.descriptorCount = 1;
3165 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3166 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003167
3168 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003169 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3170 ds_layout_ci.pNext = NULL;
3171 ds_layout_ci.bindingCount = 1;
3172 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003173 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003174 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3175 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003176 ASSERT_VK_SUCCESS(err);
3177
3178 VkDescriptorSet descriptorSet;
3179 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003180 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003181 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003182 alloc_info.descriptorPool = ds_pool;
3183 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003184 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3185 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003186 ASSERT_VK_SUCCESS(err);
3187
3188 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003189 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3190 pipeline_layout_ci.pNext = NULL;
3191 pipeline_layout_ci.setLayoutCount = 1;
3192 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003193
3194 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003195 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3196 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003197 ASSERT_VK_SUCCESS(err);
3198
3199 // Create a buffer to update the descriptor with
3200 uint32_t qfi = 0;
3201 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003202 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3203 buffCI.size = 1024;
3204 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3205 buffCI.queueFamilyIndexCount = 1;
3206 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003207
3208 VkBuffer dyub;
3209 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3210 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003211 // Allocate memory and bind to buffer so we can make it to the appropriate
3212 // error
3213 VkMemoryAllocateInfo mem_alloc = {};
3214 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3215 mem_alloc.pNext = NULL;
3216 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12003217 mem_alloc.memoryTypeIndex = 0;
3218
3219 VkMemoryRequirements memReqs;
3220 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
3221 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
3222 0);
3223 if (!pass) {
3224 vkDestroyBuffer(m_device->device(), dyub, NULL);
3225 return;
3226 }
3227
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003228 VkDeviceMemory mem;
3229 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3230 ASSERT_VK_SUCCESS(err);
3231 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
3232 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003233 // Correctly update descriptor to avoid "NOT_UPDATED" error
3234 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003235 buffInfo.buffer = dyub;
3236 buffInfo.offset = 0;
3237 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003238
3239 VkWriteDescriptorSet descriptor_write;
3240 memset(&descriptor_write, 0, sizeof(descriptor_write));
3241 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3242 descriptor_write.dstSet = descriptorSet;
3243 descriptor_write.dstBinding = 0;
3244 descriptor_write.descriptorCount = 1;
3245 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
3246 descriptor_write.pBufferInfo = &buffInfo;
3247
3248 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3249
3250 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003251 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3252 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3253 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003254 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003255 uint32_t pDynOff[2] = {512, 756};
3256 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07003257 m_errorMonitor->SetDesiredFailureMsg(
3258 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07003259 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07003260 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3261 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3262 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12003263 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07003264 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3266 " dynamic offset 512 combined with "
3267 "offset 0 and range 1024 that "
3268 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07003269 // Create PSO to be used for draw-time errors below
3270 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003271 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003272 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003273 "out gl_PerVertex { \n"
3274 " vec4 gl_Position;\n"
3275 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003276 "void main(){\n"
3277 " gl_Position = vec4(1);\n"
3278 "}\n";
3279 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003280 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07003281 "\n"
3282 "layout(location=0) out vec4 x;\n"
3283 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3284 "void main(){\n"
3285 " x = vec4(bar.y);\n"
3286 "}\n";
3287 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3288 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3289 VkPipelineObj pipe(m_device);
3290 pipe.AddShader(&vs);
3291 pipe.AddShader(&fs);
3292 pipe.AddColorAttachment();
3293 pipe.CreateVKPipeline(pipeline_layout, renderPass());
3294
Karl Schultz6addd812016-02-02 17:17:23 -07003295 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3296 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3297 // This update should succeed, but offset size of 512 will overstep buffer
3298 // /w range 1024 & size 1024
3299 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3300 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3301 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07003302 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003303 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003304
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003305 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06003306 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06003307
Tobin Ehlis49f903e2015-11-04 13:30:34 -07003308 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3309 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3310}
3311
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003312TEST_F(VkLayerTest, InvalidPushConstants) {
3313 // Hit push constant error cases:
3314 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
3315 // 2. Incorrectly set push constant size to 0
3316 // 3. Incorrectly set push constant size to non-multiple of 4
3317 // 4. Attempt push constant update that exceeds maxPushConstantSize
3318 VkResult err;
3319 m_errorMonitor->SetDesiredFailureMsg(
3320 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3321 "vkCreatePipelineLayout() call has push constants with offset ");
3322
3323 ASSERT_NO_FATAL_FAILURE(InitState());
3324 ASSERT_NO_FATAL_FAILURE(InitViewport());
3325 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3326
3327 VkPushConstantRange pc_range = {};
3328 pc_range.size = 0xFFFFFFFFu;
3329 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3330 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3331 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3332 pipeline_layout_ci.pushConstantRangeCount = 1;
3333 pipeline_layout_ci.pPushConstantRanges = &pc_range;
3334
3335 VkPipelineLayout pipeline_layout;
3336 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3337 &pipeline_layout);
3338
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003339 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003340 // Now cause errors due to size 0 and non-4 byte aligned size
3341 pc_range.size = 0;
3342 m_errorMonitor->SetDesiredFailureMsg(
3343 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3344 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
3345 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3346 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003347 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003348 pc_range.size = 1;
3349 m_errorMonitor->SetDesiredFailureMsg(
3350 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3351 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
3352 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3353 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003354 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003355 // Cause error due to bad size in vkCmdPushConstants() call
3356 m_errorMonitor->SetDesiredFailureMsg(
3357 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3358 "vkCmdPushConstants() call has push constants with offset ");
3359 pipeline_layout_ci.pushConstantRangeCount = 0;
3360 pipeline_layout_ci.pPushConstantRanges = NULL;
3361 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3362 &pipeline_layout);
3363 ASSERT_VK_SUCCESS(err);
3364 BeginCommandBuffer();
3365 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
3366 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003367 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07003368 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3369}
3370
Karl Schultz6addd812016-02-02 17:17:23 -07003371TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003372 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07003373 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003374
3375 ASSERT_NO_FATAL_FAILURE(InitState());
3376 ASSERT_NO_FATAL_FAILURE(InitViewport());
3377 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3378
3379 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
3380 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003381 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3382 ds_type_count[0].descriptorCount = 10;
3383 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3384 ds_type_count[1].descriptorCount = 2;
3385 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3386 ds_type_count[2].descriptorCount = 2;
3387 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
3388 ds_type_count[3].descriptorCount = 5;
3389 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
3390 // type
3391 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3392 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
3393 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003394
3395 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003396 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3397 ds_pool_ci.pNext = NULL;
3398 ds_pool_ci.maxSets = 5;
3399 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
3400 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003401
3402 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003403 err =
3404 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003405 ASSERT_VK_SUCCESS(err);
3406
3407 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
3408 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003409 dsl_binding[0].binding = 0;
3410 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3411 dsl_binding[0].descriptorCount = 5;
3412 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3413 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003414
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003415 // Create layout identical to set0 layout but w/ different stageFlags
3416 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003417 dsl_fs_stage_only.binding = 0;
3418 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3419 dsl_fs_stage_only.descriptorCount = 5;
3420 dsl_fs_stage_only.stageFlags =
3421 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
3422 // bind time
3423 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003424 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003425 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3426 ds_layout_ci.pNext = NULL;
3427 ds_layout_ci.bindingCount = 1;
3428 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003429 static const uint32_t NUM_LAYOUTS = 4;
3430 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003431 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003432 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
3433 // layout for error case
3434 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3435 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003436 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003437 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003438 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3439 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003440 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003441 dsl_binding[0].binding = 0;
3442 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003443 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003444 dsl_binding[1].binding = 1;
3445 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
3446 dsl_binding[1].descriptorCount = 2;
3447 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
3448 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003449 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003450 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003451 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3452 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003453 ASSERT_VK_SUCCESS(err);
3454 dsl_binding[0].binding = 0;
3455 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003456 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003457 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07003458 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3459 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003460 ASSERT_VK_SUCCESS(err);
3461 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003462 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07003463 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3464 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003465 ASSERT_VK_SUCCESS(err);
3466
3467 static const uint32_t NUM_SETS = 4;
3468 VkDescriptorSet descriptorSet[NUM_SETS] = {};
3469 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003470 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003471 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003472 alloc_info.descriptorPool = ds_pool;
3473 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003474 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3475 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003476 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003477 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003478 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003479 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003480 err =
3481 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003482 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003483
3484 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003485 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3486 pipeline_layout_ci.pNext = NULL;
3487 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
3488 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003489
3490 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003491 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3492 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003493 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003494 // Create pipelineLayout with only one setLayout
3495 pipeline_layout_ci.setLayoutCount = 1;
3496 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003497 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3498 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003499 ASSERT_VK_SUCCESS(err);
3500 // Create pipelineLayout with 2 descriptor setLayout at index 0
3501 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
3502 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07003503 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3504 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003505 ASSERT_VK_SUCCESS(err);
3506 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
3507 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
3508 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07003509 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3510 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003511 ASSERT_VK_SUCCESS(err);
3512 // Create pipelineLayout with UB type, but stageFlags for FS only
3513 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
3514 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07003515 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3516 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003517 ASSERT_VK_SUCCESS(err);
3518 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
3519 VkDescriptorSetLayout pl_bad_s0[2] = {};
3520 pl_bad_s0[0] = ds_layout_fs_only;
3521 pl_bad_s0[1] = ds_layout[1];
3522 pipeline_layout_ci.setLayoutCount = 2;
3523 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
3524 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07003525 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3526 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003527 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003528
3529 // Create a buffer to update the descriptor with
3530 uint32_t qfi = 0;
3531 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003532 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3533 buffCI.size = 1024;
3534 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
3535 buffCI.queueFamilyIndexCount = 1;
3536 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003537
3538 VkBuffer dyub;
3539 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
3540 ASSERT_VK_SUCCESS(err);
3541 // Correctly update descriptor to avoid "NOT_UPDATED" error
3542 static const uint32_t NUM_BUFFS = 5;
3543 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003544 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07003545 buffInfo[i].buffer = dyub;
3546 buffInfo[i].offset = 0;
3547 buffInfo[i].range = 1024;
3548 }
Karl Schultz6addd812016-02-02 17:17:23 -07003549 VkImage image;
3550 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3551 const int32_t tex_width = 32;
3552 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003553 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003554 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3555 image_create_info.pNext = NULL;
3556 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3557 image_create_info.format = tex_format;
3558 image_create_info.extent.width = tex_width;
3559 image_create_info.extent.height = tex_height;
3560 image_create_info.extent.depth = 1;
3561 image_create_info.mipLevels = 1;
3562 image_create_info.arrayLayers = 1;
3563 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3564 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3565 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3566 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003567 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3568 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003569
Karl Schultz6addd812016-02-02 17:17:23 -07003570 VkMemoryRequirements memReqs;
3571 VkDeviceMemory imageMem;
3572 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003573 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003574 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3575 memAlloc.pNext = NULL;
3576 memAlloc.allocationSize = 0;
3577 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003578 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
3579 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003580 pass =
3581 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07003582 ASSERT_TRUE(pass);
3583 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
3584 ASSERT_VK_SUCCESS(err);
3585 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
3586 ASSERT_VK_SUCCESS(err);
3587
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003588 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003589 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3590 image_view_create_info.image = image;
3591 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
3592 image_view_create_info.format = tex_format;
3593 image_view_create_info.subresourceRange.layerCount = 1;
3594 image_view_create_info.subresourceRange.baseMipLevel = 0;
3595 image_view_create_info.subresourceRange.levelCount = 1;
3596 image_view_create_info.subresourceRange.aspectMask =
3597 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07003598
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003599 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07003600 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
3601 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003602 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003603 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003604 imageInfo[0].imageView = view;
3605 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3606 imageInfo[1].imageView = view;
3607 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003608 imageInfo[2].imageView = view;
3609 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3610 imageInfo[3].imageView = view;
3611 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003612
3613 static const uint32_t NUM_SET_UPDATES = 3;
3614 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
3615 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3616 descriptor_write[0].dstSet = descriptorSet[0];
3617 descriptor_write[0].dstBinding = 0;
3618 descriptor_write[0].descriptorCount = 5;
3619 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3620 descriptor_write[0].pBufferInfo = buffInfo;
3621 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3622 descriptor_write[1].dstSet = descriptorSet[1];
3623 descriptor_write[1].dstBinding = 0;
3624 descriptor_write[1].descriptorCount = 2;
3625 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
3626 descriptor_write[1].pImageInfo = imageInfo;
3627 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3628 descriptor_write[2].dstSet = descriptorSet[1];
3629 descriptor_write[2].dstBinding = 1;
3630 descriptor_write[2].descriptorCount = 2;
3631 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003632 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003633
3634 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003635
Tobin Ehlis88452832015-12-03 09:40:56 -07003636 // Create PSO to be used for draw-time errors below
3637 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003638 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003639 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07003640 "out gl_PerVertex {\n"
3641 " vec4 gl_Position;\n"
3642 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003643 "void main(){\n"
3644 " gl_Position = vec4(1);\n"
3645 "}\n";
3646 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12003647 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07003648 "\n"
3649 "layout(location=0) out vec4 x;\n"
3650 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
3651 "void main(){\n"
3652 " x = vec4(bar.y);\n"
3653 "}\n";
3654 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3655 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003656 VkPipelineObj pipe(m_device);
3657 pipe.AddShader(&vs);
3658 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07003659 pipe.AddColorAttachment();
3660 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003661
3662 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003663
Karl Schultz6addd812016-02-02 17:17:23 -07003664 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3665 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3666 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3667 // of PSO
3668 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3669 // cmd_pipeline.c
3670 // due to the fact that cmd_alloc_dset_data() has not been called in
3671 // cmd_bind_graphics_pipeline()
3672 // TODO : Want to cause various binding incompatibility issues here to test
3673 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003674 // First cause various verify_layout_compatibility() fails
3675 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003676 // verify_set_layout_compatibility fail cases:
3677 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3679 " due to: invalid VkPipelineLayout ");
3680 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3681 VK_PIPELINE_BIND_POINT_GRAPHICS,
3682 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3683 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003684 m_errorMonitor->VerifyFound();
3685
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003686 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3688 " attempting to bind set to index 1");
3689 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3690 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3691 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003692 m_errorMonitor->VerifyFound();
3693
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003694 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003695 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3696 // descriptors
3697 m_errorMonitor->SetDesiredFailureMsg(
3698 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003699 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003700 vkCmdBindDescriptorSets(
3701 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3702 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003703 m_errorMonitor->VerifyFound();
3704
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003705 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3706 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003707 m_errorMonitor->SetDesiredFailureMsg(
3708 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003709 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07003710 vkCmdBindDescriptorSets(
3711 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3712 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003713 m_errorMonitor->VerifyFound();
3714
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003715 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3716 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003717 m_errorMonitor->SetDesiredFailureMsg(
3718 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06003719 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07003720 vkCmdBindDescriptorSets(
3721 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3722 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003723 m_errorMonitor->VerifyFound();
3724
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003725 // Cause INFO messages due to disturbing previously bound Sets
3726 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003727 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3728 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3729 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003730 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07003731 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003732 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003733 " previously bound as set #0 was disturbed ");
3734 vkCmdBindDescriptorSets(
3735 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3736 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003737 m_errorMonitor->VerifyFound();
3738
Karl Schultz6addd812016-02-02 17:17:23 -07003739 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3740 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3741 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003742 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003744 " newly bound as set #0 so set #1 and "
3745 "any subsequent sets were disturbed ");
3746 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3747 VK_PIPELINE_BIND_POINT_GRAPHICS,
3748 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003749 m_errorMonitor->VerifyFound();
3750
Tobin Ehlis88452832015-12-03 09:40:56 -07003751 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07003752 // 1. Error due to not binding required set (we actually use same code as
3753 // above to disturb set0)
3754 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3755 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3756 2, &descriptorSet[0], 0, NULL);
3757 vkCmdBindDescriptorSets(
3758 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3759 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
3760 m_errorMonitor->SetDesiredFailureMsg(
3761 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3762 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07003763 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003764 m_errorMonitor->VerifyFound();
3765
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003766 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003767 // 2. Error due to bound set not being compatible with PSO's
3768 // VkPipelineLayout (diff stageFlags in this case)
3769 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3770 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3771 2, &descriptorSet[0], 0, NULL);
3772 m_errorMonitor->SetDesiredFailureMsg(
3773 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3774 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07003775 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003776 m_errorMonitor->VerifyFound();
3777
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003778 // Remaining clean-up
3779 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003780 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003781 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
3782 }
3783 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06003784 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
3785 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003786 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003787 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3788 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3789}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003790
Karl Schultz6addd812016-02-02 17:17:23 -07003791TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003792
Karl Schultz6addd812016-02-02 17:17:23 -07003793 m_errorMonitor->SetDesiredFailureMsg(
3794 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003795 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003796
3797 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003798 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003799 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003800 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003801
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003802 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003803}
3804
Karl Schultz6addd812016-02-02 17:17:23 -07003805TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3806 VkResult err;
3807 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003808
Karl Schultz6addd812016-02-02 17:17:23 -07003809 m_errorMonitor->SetDesiredFailureMsg(
3810 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003811 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003812
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003813 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003814
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003815 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003816 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003817 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003818 cmd.commandPool = m_commandPool;
3819 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003820 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003821
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003822 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003823 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003824
3825 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003826 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003827 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003828 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003829 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003830 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3831 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003832 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003833
3834 // The error should be caught by validation of the BeginCommandBuffer call
3835 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3836
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003837 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003838 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003839}
3840
Karl Schultz6addd812016-02-02 17:17:23 -07003841TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003842 // Cause error due to Begin while recording CB
3843 // Then cause 2 errors for attempting to reset CB w/o having
3844 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3845 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003847 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003848
3849 ASSERT_NO_FATAL_FAILURE(InitState());
3850
3851 // Calls AllocateCommandBuffers
3852 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3853
Karl Schultz6addd812016-02-02 17:17:23 -07003854 // Force the failure by setting the Renderpass and Framebuffer fields with
3855 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003856 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003857 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003858 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3859 cmd_buf_info.pNext = NULL;
3860 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003861 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003862
3863 // Begin CB to transition to recording state
3864 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3865 // Can't re-begin. This should trigger error
3866 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003867 m_errorMonitor->VerifyFound();
3868
Karl Schultz6addd812016-02-02 17:17:23 -07003869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3870 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003871 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3872 // Reset attempt will trigger error due to incorrect CommandPool state
3873 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003874 m_errorMonitor->VerifyFound();
3875
Karl Schultz6addd812016-02-02 17:17:23 -07003876 m_errorMonitor->SetDesiredFailureMsg(
3877 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3878 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003879 // Transition CB to RECORDED state
3880 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3881 // Now attempting to Begin will implicitly reset, which triggers error
3882 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003883 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003884}
3885
Karl Schultz6addd812016-02-02 17:17:23 -07003886TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003887 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003888 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003889
Karl Schultz6addd812016-02-02 17:17:23 -07003890 m_errorMonitor->SetDesiredFailureMsg(
3891 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003892 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3893
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003894 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003895 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003896
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003897 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003898 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3899 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003900
3901 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003902 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3903 ds_pool_ci.pNext = NULL;
3904 ds_pool_ci.maxSets = 1;
3905 ds_pool_ci.poolSizeCount = 1;
3906 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003907
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003908 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003909 err =
3910 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003911 ASSERT_VK_SUCCESS(err);
3912
Tony Barboureb254902015-07-15 12:50:33 -06003913 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003914 dsl_binding.binding = 0;
3915 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3916 dsl_binding.descriptorCount = 1;
3917 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3918 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003919
Tony Barboureb254902015-07-15 12:50:33 -06003920 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003921 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3922 ds_layout_ci.pNext = NULL;
3923 ds_layout_ci.bindingCount = 1;
3924 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003925
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003926 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003927 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3928 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003929 ASSERT_VK_SUCCESS(err);
3930
3931 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003932 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003933 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003934 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003935 alloc_info.descriptorPool = ds_pool;
3936 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003937 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3938 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003939 ASSERT_VK_SUCCESS(err);
3940
Tony Barboureb254902015-07-15 12:50:33 -06003941 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003942 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3943 pipeline_layout_ci.setLayoutCount = 1;
3944 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003945
3946 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003947 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3948 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003949 ASSERT_VK_SUCCESS(err);
3950
Tobin Ehlise68360f2015-10-01 11:15:13 -06003951 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07003952 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06003953
3954 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003955 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3956 vp_state_ci.scissorCount = 1;
3957 vp_state_ci.pScissors = &sc;
3958 vp_state_ci.viewportCount = 1;
3959 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003960
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003961 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3962 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3963 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3964 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3965 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3966 rs_state_ci.depthClampEnable = VK_FALSE;
3967 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3968 rs_state_ci.depthBiasEnable = VK_FALSE;
3969
Tony Barboureb254902015-07-15 12:50:33 -06003970 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003971 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3972 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003973 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003974 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3975 gp_ci.layout = pipeline_layout;
3976 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06003977
3978 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003979 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3980 pc_ci.initialDataSize = 0;
3981 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003982
3983 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003984 VkPipelineCache pipelineCache;
3985
Karl Schultz6addd812016-02-02 17:17:23 -07003986 err =
3987 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06003988 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003989 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3990 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003991
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003992 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003993
Chia-I Wuf7458c52015-10-26 21:10:41 +08003994 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3995 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3996 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3997 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003998}
Tobin Ehlis912df022015-09-17 08:46:18 -06003999/*// TODO : This test should be good, but needs Tess support in compiler to run
4000TEST_F(VkLayerTest, InvalidPatchControlPoints)
4001{
4002 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06004003 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004004
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004006 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
4007primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004008
Tobin Ehlis912df022015-09-17 08:46:18 -06004009 ASSERT_NO_FATAL_FAILURE(InitState());
4010 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06004011
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004012 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06004013 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004014 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004015
4016 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4017 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4018 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004019 ds_pool_ci.poolSizeCount = 1;
4020 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06004021
4022 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004023 err = vkCreateDescriptorPool(m_device->device(),
4024VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06004025 ASSERT_VK_SUCCESS(err);
4026
4027 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08004028 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06004029 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08004030 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004031 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4032 dsl_binding.pImmutableSamplers = NULL;
4033
4034 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004035 ds_layout_ci.sType =
4036VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004037 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004038 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004039 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06004040
4041 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004042 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4043&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004044 ASSERT_VK_SUCCESS(err);
4045
4046 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004047 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
4048VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06004049 ASSERT_VK_SUCCESS(err);
4050
4051 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004052 pipeline_layout_ci.sType =
4053VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06004054 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004055 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06004056 pipeline_layout_ci.pSetLayouts = &ds_layout;
4057
4058 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004059 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4060&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06004061 ASSERT_VK_SUCCESS(err);
4062
4063 VkPipelineShaderStageCreateInfo shaderStages[3];
4064 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
4065
Karl Schultz6addd812016-02-02 17:17:23 -07004066 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
4067this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004068 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07004069 VkShaderObj
4070tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
4071this);
4072 VkShaderObj
4073te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
4074this);
Tobin Ehlis912df022015-09-17 08:46:18 -06004075
Karl Schultz6addd812016-02-02 17:17:23 -07004076 shaderStages[0].sType =
4077VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004078 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004079 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004080 shaderStages[1].sType =
4081VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004082 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004083 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07004084 shaderStages[2].sType =
4085VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06004086 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06004087 shaderStages[2].shader = te.handle();
4088
4089 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004090 iaCI.sType =
4091VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08004092 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06004093
4094 VkPipelineTessellationStateCreateInfo tsCI = {};
4095 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
4096 tsCI.patchControlPoints = 0; // This will cause an error
4097
4098 VkGraphicsPipelineCreateInfo gp_ci = {};
4099 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4100 gp_ci.pNext = NULL;
4101 gp_ci.stageCount = 3;
4102 gp_ci.pStages = shaderStages;
4103 gp_ci.pVertexInputState = NULL;
4104 gp_ci.pInputAssemblyState = &iaCI;
4105 gp_ci.pTessellationState = &tsCI;
4106 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004107 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06004108 gp_ci.pMultisampleState = NULL;
4109 gp_ci.pDepthStencilState = NULL;
4110 gp_ci.pColorBlendState = NULL;
4111 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4112 gp_ci.layout = pipeline_layout;
4113 gp_ci.renderPass = renderPass();
4114
4115 VkPipelineCacheCreateInfo pc_ci = {};
4116 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4117 pc_ci.pNext = NULL;
4118 pc_ci.initialSize = 0;
4119 pc_ci.initialData = 0;
4120 pc_ci.maxSize = 0;
4121
4122 VkPipeline pipeline;
4123 VkPipelineCache pipelineCache;
4124
Karl Schultz6addd812016-02-02 17:17:23 -07004125 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
4126&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06004127 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004128 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4129&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06004130
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004131 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004132
Chia-I Wuf7458c52015-10-26 21:10:41 +08004133 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4134 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4135 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4136 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06004137}
4138*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06004139// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07004140TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07004141 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004142
Karl Schultz6addd812016-02-02 17:17:23 -07004143 m_errorMonitor->SetDesiredFailureMsg(
4144 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004145 "Gfx Pipeline viewport count (1) must match scissor count (0).");
4146
Tobin Ehlise68360f2015-10-01 11:15:13 -06004147 ASSERT_NO_FATAL_FAILURE(InitState());
4148 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004149
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004150 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004151 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4152 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004153
4154 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004155 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4156 ds_pool_ci.maxSets = 1;
4157 ds_pool_ci.poolSizeCount = 1;
4158 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004159
4160 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004161 err =
4162 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004163 ASSERT_VK_SUCCESS(err);
4164
4165 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004166 dsl_binding.binding = 0;
4167 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4168 dsl_binding.descriptorCount = 1;
4169 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004170
4171 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004172 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4173 ds_layout_ci.bindingCount = 1;
4174 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004175
4176 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004177 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4178 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004179 ASSERT_VK_SUCCESS(err);
4180
4181 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004182 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004183 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004184 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004185 alloc_info.descriptorPool = ds_pool;
4186 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004187 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4188 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004189 ASSERT_VK_SUCCESS(err);
4190
4191 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004192 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4193 pipeline_layout_ci.setLayoutCount = 1;
4194 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004195
4196 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004197 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4198 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004199 ASSERT_VK_SUCCESS(err);
4200
4201 VkViewport vp = {}; // Just need dummy vp to point to
4202
4203 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004204 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4205 vp_state_ci.scissorCount = 0;
4206 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
4207 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004208
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004209 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4210 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4211 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4212 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4213 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4214 rs_state_ci.depthClampEnable = VK_FALSE;
4215 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4216 rs_state_ci.depthBiasEnable = VK_FALSE;
4217
Cody Northropeb3a6c12015-10-05 14:44:45 -06004218 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004219 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004220
Karl Schultz6addd812016-02-02 17:17:23 -07004221 VkShaderObj vs(m_device, bindStateVertShaderText,
4222 VK_SHADER_STAGE_VERTEX_BIT, this);
4223 VkShaderObj fs(m_device, bindStateFragShaderText,
4224 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004225 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004226 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004227 shaderStages[0] = vs.GetStageCreateInfo();
4228 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004229
4230 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004231 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4232 gp_ci.stageCount = 2;
4233 gp_ci.pStages = shaderStages;
4234 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004235 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004236 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4237 gp_ci.layout = pipeline_layout;
4238 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004239
4240 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004241 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004242
4243 VkPipeline pipeline;
4244 VkPipelineCache pipelineCache;
4245
Karl Schultz6addd812016-02-02 17:17:23 -07004246 err =
4247 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004248 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004249 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4250 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004251
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004252 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004253
Chia-I Wuf7458c52015-10-26 21:10:41 +08004254 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4255 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4256 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4257 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004258}
Karl Schultz6addd812016-02-02 17:17:23 -07004259// Don't set viewport state in PSO. This is an error b/c we always need this
4260// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06004261// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07004262TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06004263 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07004264 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004265
Karl Schultz6addd812016-02-02 17:17:23 -07004266 m_errorMonitor->SetDesiredFailureMsg(
4267 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004268 "Gfx Pipeline pViewportState is null. Even if ");
4269
Tobin Ehlise68360f2015-10-01 11:15:13 -06004270 ASSERT_NO_FATAL_FAILURE(InitState());
4271 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004272
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004273 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004274 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4275 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004276
4277 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004278 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4279 ds_pool_ci.maxSets = 1;
4280 ds_pool_ci.poolSizeCount = 1;
4281 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004282
4283 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004284 err =
4285 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004286 ASSERT_VK_SUCCESS(err);
4287
4288 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004289 dsl_binding.binding = 0;
4290 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4291 dsl_binding.descriptorCount = 1;
4292 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004293
4294 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004295 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4296 ds_layout_ci.bindingCount = 1;
4297 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004298
4299 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004300 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4301 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004302 ASSERT_VK_SUCCESS(err);
4303
4304 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004305 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004306 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004307 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004308 alloc_info.descriptorPool = ds_pool;
4309 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004310 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4311 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004312 ASSERT_VK_SUCCESS(err);
4313
4314 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004315 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4316 pipeline_layout_ci.setLayoutCount = 1;
4317 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004318
4319 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004320 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4321 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004322 ASSERT_VK_SUCCESS(err);
4323
4324 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4325 // Set scissor as dynamic to avoid second error
4326 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004327 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4328 dyn_state_ci.dynamicStateCount = 1;
4329 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004330
Cody Northropeb3a6c12015-10-05 14:44:45 -06004331 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004332 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004333
Karl Schultz6addd812016-02-02 17:17:23 -07004334 VkShaderObj vs(m_device, bindStateVertShaderText,
4335 VK_SHADER_STAGE_VERTEX_BIT, this);
4336 VkShaderObj fs(m_device, bindStateFragShaderText,
4337 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004338 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004339 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004340 shaderStages[0] = vs.GetStageCreateInfo();
4341 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004342
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004343
4344 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
4345 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4346 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
4347 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
4348 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
4349 rs_state_ci.depthClampEnable = VK_FALSE;
4350 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
4351 rs_state_ci.depthBiasEnable = VK_FALSE;
4352
Tobin Ehlise68360f2015-10-01 11:15:13 -06004353 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004354 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4355 gp_ci.stageCount = 2;
4356 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07004357 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07004358 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
4359 // should cause validation error
4360 gp_ci.pDynamicState = &dyn_state_ci;
4361 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4362 gp_ci.layout = pipeline_layout;
4363 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004364
4365 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004366 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004367
4368 VkPipeline pipeline;
4369 VkPipelineCache pipelineCache;
4370
Karl Schultz6addd812016-02-02 17:17:23 -07004371 err =
4372 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004373 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004374 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4375 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004376
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004377 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004378
Chia-I Wuf7458c52015-10-26 21:10:41 +08004379 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4380 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4381 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4382 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004383}
4384// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07004385// Then run second test where dynamic scissor count doesn't match PSO scissor
4386// count
4387TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
4388 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004389
Karl Schultz6addd812016-02-02 17:17:23 -07004390 m_errorMonitor->SetDesiredFailureMsg(
4391 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004392 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
4393
Tobin Ehlise68360f2015-10-01 11:15:13 -06004394 ASSERT_NO_FATAL_FAILURE(InitState());
4395 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06004396
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004397 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004398 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4399 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004400
4401 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004402 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4403 ds_pool_ci.maxSets = 1;
4404 ds_pool_ci.poolSizeCount = 1;
4405 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004406
4407 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004408 err =
4409 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004410 ASSERT_VK_SUCCESS(err);
4411
4412 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004413 dsl_binding.binding = 0;
4414 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4415 dsl_binding.descriptorCount = 1;
4416 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004417
4418 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004419 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4420 ds_layout_ci.bindingCount = 1;
4421 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004422
4423 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004424 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4425 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004426 ASSERT_VK_SUCCESS(err);
4427
4428 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004429 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004430 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004431 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004432 alloc_info.descriptorPool = ds_pool;
4433 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004434 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4435 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004436 ASSERT_VK_SUCCESS(err);
4437
4438 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004439 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4440 pipeline_layout_ci.setLayoutCount = 1;
4441 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004442
4443 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004444 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4445 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004446 ASSERT_VK_SUCCESS(err);
4447
4448 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004449 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4450 vp_state_ci.viewportCount = 1;
4451 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
4452 vp_state_ci.scissorCount = 1;
4453 vp_state_ci.pScissors =
4454 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06004455
4456 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
4457 // Set scissor as dynamic to avoid that error
4458 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004459 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4460 dyn_state_ci.dynamicStateCount = 1;
4461 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004462
Cody Northropeb3a6c12015-10-05 14:44:45 -06004463 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07004464 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06004465
Karl Schultz6addd812016-02-02 17:17:23 -07004466 VkShaderObj vs(m_device, bindStateVertShaderText,
4467 VK_SHADER_STAGE_VERTEX_BIT, this);
4468 VkShaderObj fs(m_device, bindStateFragShaderText,
4469 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004470 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004471 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08004472 shaderStages[0] = vs.GetStageCreateInfo();
4473 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004474
Cody Northropf6622dc2015-10-06 10:33:21 -06004475 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4476 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4477 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004478 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004479 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004480 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06004481 vi_ci.pVertexAttributeDescriptions = nullptr;
4482
4483 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4484 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4485 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4486
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004487 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004488 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06004489 rs_ci.pNext = nullptr;
4490
Mark Youngc89c6312016-03-31 16:03:20 -06004491 VkPipelineColorBlendAttachmentState att = {};
4492 att.blendEnable = VK_FALSE;
4493 att.colorWriteMask = 0xf;
4494
Cody Northropf6622dc2015-10-06 10:33:21 -06004495 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4496 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4497 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004498 cb_ci.attachmentCount = 1;
4499 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06004500
Tobin Ehlise68360f2015-10-01 11:15:13 -06004501 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004502 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4503 gp_ci.stageCount = 2;
4504 gp_ci.pStages = shaderStages;
4505 gp_ci.pVertexInputState = &vi_ci;
4506 gp_ci.pInputAssemblyState = &ia_ci;
4507 gp_ci.pViewportState = &vp_state_ci;
4508 gp_ci.pRasterizationState = &rs_ci;
4509 gp_ci.pColorBlendState = &cb_ci;
4510 gp_ci.pDynamicState = &dyn_state_ci;
4511 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4512 gp_ci.layout = pipeline_layout;
4513 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004514
4515 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004516 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06004517
4518 VkPipeline pipeline;
4519 VkPipelineCache pipelineCache;
4520
Karl Schultz6addd812016-02-02 17:17:23 -07004521 err =
4522 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004523 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004524 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4525 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004526
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004527 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004528
Tobin Ehlisd332f282015-10-02 11:00:56 -06004529 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07004530 // First need to successfully create the PSO from above by setting
4531 // pViewports
4532 m_errorMonitor->SetDesiredFailureMsg(
4533 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4534 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
4535 "scissorCount is 1. These counts must match.");
4536
4537 VkViewport vp = {}; // Just need dummy vp to point to
4538 vp_state_ci.pViewports = &vp;
4539 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4540 &gp_ci, NULL, &pipeline);
4541 ASSERT_VK_SUCCESS(err);
4542 BeginCommandBuffer();
4543 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4544 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4545 VkRect2D scissors[2] = {}; // don't care about data
4546 // Count of 2 doesn't match PSO count of 1
4547 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
4548 Draw(1, 0, 0, 0);
4549
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004550 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004551
4552 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4553 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4554 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4555 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4556}
4557// Create PSO w/o non-zero scissorCount but no scissor data
4558// Then run second test where dynamic viewportCount doesn't match PSO
4559// viewportCount
4560TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
4561 VkResult err;
4562
4563 m_errorMonitor->SetDesiredFailureMsg(
4564 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4565 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
4566
4567 ASSERT_NO_FATAL_FAILURE(InitState());
4568 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4569
4570 VkDescriptorPoolSize ds_type_count = {};
4571 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4572 ds_type_count.descriptorCount = 1;
4573
4574 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4575 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4576 ds_pool_ci.maxSets = 1;
4577 ds_pool_ci.poolSizeCount = 1;
4578 ds_pool_ci.pPoolSizes = &ds_type_count;
4579
4580 VkDescriptorPool ds_pool;
4581 err =
4582 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4583 ASSERT_VK_SUCCESS(err);
4584
4585 VkDescriptorSetLayoutBinding dsl_binding = {};
4586 dsl_binding.binding = 0;
4587 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4588 dsl_binding.descriptorCount = 1;
4589 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4590
4591 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4592 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4593 ds_layout_ci.bindingCount = 1;
4594 ds_layout_ci.pBindings = &dsl_binding;
4595
4596 VkDescriptorSetLayout ds_layout;
4597 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4598 &ds_layout);
4599 ASSERT_VK_SUCCESS(err);
4600
4601 VkDescriptorSet descriptorSet;
4602 VkDescriptorSetAllocateInfo alloc_info = {};
4603 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4604 alloc_info.descriptorSetCount = 1;
4605 alloc_info.descriptorPool = ds_pool;
4606 alloc_info.pSetLayouts = &ds_layout;
4607 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4608 &descriptorSet);
4609 ASSERT_VK_SUCCESS(err);
4610
4611 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4612 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4613 pipeline_layout_ci.setLayoutCount = 1;
4614 pipeline_layout_ci.pSetLayouts = &ds_layout;
4615
4616 VkPipelineLayout pipeline_layout;
4617 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4618 &pipeline_layout);
4619 ASSERT_VK_SUCCESS(err);
4620
4621 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4622 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4623 vp_state_ci.scissorCount = 1;
4624 vp_state_ci.pScissors =
4625 NULL; // Null scissor w/ count of 1 should cause error
4626 vp_state_ci.viewportCount = 1;
4627 vp_state_ci.pViewports =
4628 NULL; // vp is dynamic (below) so this won't cause error
4629
4630 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
4631 // Set scissor as dynamic to avoid that error
4632 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4633 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4634 dyn_state_ci.dynamicStateCount = 1;
4635 dyn_state_ci.pDynamicStates = &vp_state;
4636
4637 VkPipelineShaderStageCreateInfo shaderStages[2];
4638 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4639
4640 VkShaderObj vs(m_device, bindStateVertShaderText,
4641 VK_SHADER_STAGE_VERTEX_BIT, this);
4642 VkShaderObj fs(m_device, bindStateFragShaderText,
4643 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06004644 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07004645 // but add it to be able to run on more devices
4646 shaderStages[0] = vs.GetStageCreateInfo();
4647 shaderStages[1] = fs.GetStageCreateInfo();
4648
4649 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4650 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4651 vi_ci.pNext = nullptr;
4652 vi_ci.vertexBindingDescriptionCount = 0;
4653 vi_ci.pVertexBindingDescriptions = nullptr;
4654 vi_ci.vertexAttributeDescriptionCount = 0;
4655 vi_ci.pVertexAttributeDescriptions = nullptr;
4656
4657 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4658 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4659 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4660
4661 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4662 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4663 rs_ci.pNext = nullptr;
4664
Mark Youngc89c6312016-03-31 16:03:20 -06004665 VkPipelineColorBlendAttachmentState att = {};
4666 att.blendEnable = VK_FALSE;
4667 att.colorWriteMask = 0xf;
4668
Karl Schultz6addd812016-02-02 17:17:23 -07004669 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4670 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4671 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004672 cb_ci.attachmentCount = 1;
4673 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004674
4675 VkGraphicsPipelineCreateInfo gp_ci = {};
4676 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4677 gp_ci.stageCount = 2;
4678 gp_ci.pStages = shaderStages;
4679 gp_ci.pVertexInputState = &vi_ci;
4680 gp_ci.pInputAssemblyState = &ia_ci;
4681 gp_ci.pViewportState = &vp_state_ci;
4682 gp_ci.pRasterizationState = &rs_ci;
4683 gp_ci.pColorBlendState = &cb_ci;
4684 gp_ci.pDynamicState = &dyn_state_ci;
4685 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4686 gp_ci.layout = pipeline_layout;
4687 gp_ci.renderPass = renderPass();
4688
4689 VkPipelineCacheCreateInfo pc_ci = {};
4690 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4691
4692 VkPipeline pipeline;
4693 VkPipelineCache pipelineCache;
4694
4695 err =
4696 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4697 ASSERT_VK_SUCCESS(err);
4698 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4699 &gp_ci, NULL, &pipeline);
4700
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004701 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004702
4703 // Now hit second fail case where we set scissor w/ different count than PSO
4704 // First need to successfully create the PSO from above by setting
4705 // pViewports
4706 m_errorMonitor->SetDesiredFailureMsg(
4707 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4708 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4709 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004710
Tobin Ehlisd332f282015-10-02 11:00:56 -06004711 VkRect2D sc = {}; // Just need dummy vp to point to
4712 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004713 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4714 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004715 ASSERT_VK_SUCCESS(err);
4716 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004717 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4718 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004719 VkViewport viewports[2] = {}; // don't care about data
4720 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004721 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004722 Draw(1, 0, 0, 0);
4723
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004724 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004725
Chia-I Wuf7458c52015-10-26 21:10:41 +08004726 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4727 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4728 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4729 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004730}
4731
Mark Young7394fdd2016-03-31 14:56:43 -06004732TEST_F(VkLayerTest, PSOLineWidthInvalid) {
4733 VkResult err;
4734
4735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004736 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004737
4738 ASSERT_NO_FATAL_FAILURE(InitState());
4739 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4740
4741 VkDescriptorPoolSize ds_type_count = {};
4742 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4743 ds_type_count.descriptorCount = 1;
4744
4745 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4746 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4747 ds_pool_ci.maxSets = 1;
4748 ds_pool_ci.poolSizeCount = 1;
4749 ds_pool_ci.pPoolSizes = &ds_type_count;
4750
4751 VkDescriptorPool ds_pool;
4752 err =
4753 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4754 ASSERT_VK_SUCCESS(err);
4755
4756 VkDescriptorSetLayoutBinding dsl_binding = {};
4757 dsl_binding.binding = 0;
4758 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4759 dsl_binding.descriptorCount = 1;
4760 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4761
4762 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4763 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4764 ds_layout_ci.bindingCount = 1;
4765 ds_layout_ci.pBindings = &dsl_binding;
4766
4767 VkDescriptorSetLayout ds_layout;
4768 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4769 &ds_layout);
4770 ASSERT_VK_SUCCESS(err);
4771
4772 VkDescriptorSet descriptorSet;
4773 VkDescriptorSetAllocateInfo alloc_info = {};
4774 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4775 alloc_info.descriptorSetCount = 1;
4776 alloc_info.descriptorPool = ds_pool;
4777 alloc_info.pSetLayouts = &ds_layout;
4778 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4779 &descriptorSet);
4780 ASSERT_VK_SUCCESS(err);
4781
4782 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4783 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4784 pipeline_layout_ci.setLayoutCount = 1;
4785 pipeline_layout_ci.pSetLayouts = &ds_layout;
4786
4787 VkPipelineLayout pipeline_layout;
4788 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4789 &pipeline_layout);
4790 ASSERT_VK_SUCCESS(err);
4791
4792 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4793 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4794 vp_state_ci.scissorCount = 1;
4795 vp_state_ci.pScissors = NULL;
4796 vp_state_ci.viewportCount = 1;
4797 vp_state_ci.pViewports = NULL;
4798
4799 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
4800 VK_DYNAMIC_STATE_SCISSOR,
4801 VK_DYNAMIC_STATE_LINE_WIDTH};
4802 // Set scissor as dynamic to avoid that error
4803 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
4804 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
4805 dyn_state_ci.dynamicStateCount = 2;
4806 dyn_state_ci.pDynamicStates = dynamic_states;
4807
4808 VkPipelineShaderStageCreateInfo shaderStages[2];
4809 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4810
4811 VkShaderObj vs(m_device, bindStateVertShaderText,
4812 VK_SHADER_STAGE_VERTEX_BIT, this);
4813 VkShaderObj fs(m_device, bindStateFragShaderText,
4814 VK_SHADER_STAGE_FRAGMENT_BIT,
4815 this); // TODO - We shouldn't need a fragment shader
4816 // but add it to be able to run on more devices
4817 shaderStages[0] = vs.GetStageCreateInfo();
4818 shaderStages[1] = fs.GetStageCreateInfo();
4819
4820 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4821 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4822 vi_ci.pNext = nullptr;
4823 vi_ci.vertexBindingDescriptionCount = 0;
4824 vi_ci.pVertexBindingDescriptions = nullptr;
4825 vi_ci.vertexAttributeDescriptionCount = 0;
4826 vi_ci.pVertexAttributeDescriptions = nullptr;
4827
4828 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4829 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4830 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4831
4832 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4833 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4834 rs_ci.pNext = nullptr;
4835
Mark Young47107952016-05-02 15:59:55 -06004836 // Check too low (line width of -1.0f).
4837 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06004838
4839 VkPipelineColorBlendAttachmentState att = {};
4840 att.blendEnable = VK_FALSE;
4841 att.colorWriteMask = 0xf;
4842
4843 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4844 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4845 cb_ci.pNext = nullptr;
4846 cb_ci.attachmentCount = 1;
4847 cb_ci.pAttachments = &att;
4848
4849 VkGraphicsPipelineCreateInfo gp_ci = {};
4850 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4851 gp_ci.stageCount = 2;
4852 gp_ci.pStages = shaderStages;
4853 gp_ci.pVertexInputState = &vi_ci;
4854 gp_ci.pInputAssemblyState = &ia_ci;
4855 gp_ci.pViewportState = &vp_state_ci;
4856 gp_ci.pRasterizationState = &rs_ci;
4857 gp_ci.pColorBlendState = &cb_ci;
4858 gp_ci.pDynamicState = &dyn_state_ci;
4859 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4860 gp_ci.layout = pipeline_layout;
4861 gp_ci.renderPass = renderPass();
4862
4863 VkPipelineCacheCreateInfo pc_ci = {};
4864 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4865
4866 VkPipeline pipeline;
4867 VkPipelineCache pipelineCache;
4868
4869 err =
4870 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4871 ASSERT_VK_SUCCESS(err);
4872 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4873 &gp_ci, NULL, &pipeline);
4874
4875 m_errorMonitor->VerifyFound();
4876
4877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4878 "Attempt to set lineWidth to 65536");
4879
4880 // Check too high (line width of 65536.0f).
4881 rs_ci.lineWidth = 65536.0f;
4882
4883 err =
4884 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4885 ASSERT_VK_SUCCESS(err);
4886 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4887 &gp_ci, NULL, &pipeline);
4888
4889 m_errorMonitor->VerifyFound();
4890
4891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06004892 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06004893
4894 dyn_state_ci.dynamicStateCount = 3;
4895
4896 rs_ci.lineWidth = 1.0f;
4897
4898 err =
4899 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4900 ASSERT_VK_SUCCESS(err);
4901 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4902 &gp_ci, NULL, &pipeline);
4903 BeginCommandBuffer();
4904 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4905 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4906
4907 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06004908 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06004909 m_errorMonitor->VerifyFound();
4910
4911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4912 "Attempt to set lineWidth to 65536");
4913
4914 // Check too high with dynamic setting.
4915 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
4916 m_errorMonitor->VerifyFound();
4917 EndCommandBuffer();
4918
4919 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4920 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4921 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4922 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4923}
4924
Karl Schultz6addd812016-02-02 17:17:23 -07004925TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004926 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004927 m_errorMonitor->SetDesiredFailureMsg(
4928 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004929 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004930
4931 ASSERT_NO_FATAL_FAILURE(InitState());
4932 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004933
Tony Barbourfe3351b2015-07-28 10:17:20 -06004934 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004935 // Don't care about RenderPass handle b/c error should be flagged before
4936 // that
4937 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
4938 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004939
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004940 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004941}
4942
Karl Schultz6addd812016-02-02 17:17:23 -07004943TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004944 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004945 m_errorMonitor->SetDesiredFailureMsg(
4946 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004947 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004948
4949 ASSERT_NO_FATAL_FAILURE(InitState());
4950 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004951
Tony Barbourfe3351b2015-07-28 10:17:20 -06004952 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004953 // Just create a dummy Renderpass that's non-NULL so we can get to the
4954 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06004955 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004956 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4957 rp_begin.pNext = NULL;
4958 rp_begin.renderPass = renderPass();
4959 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004960
Karl Schultz6addd812016-02-02 17:17:23 -07004961 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
4962 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004963
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004964 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004965}
4966
Karl Schultz6addd812016-02-02 17:17:23 -07004967TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004968 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004969 m_errorMonitor->SetDesiredFailureMsg(
4970 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004971 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004972
4973 ASSERT_NO_FATAL_FAILURE(InitState());
4974 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004975
4976 // Renderpass is started here
4977 BeginCommandBuffer();
4978
4979 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004980 vk_testing::Buffer dstBuffer;
4981 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004982
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004983 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004984
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004985 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004986}
4987
Karl Schultz6addd812016-02-02 17:17:23 -07004988TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004989 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004990 m_errorMonitor->SetDesiredFailureMsg(
4991 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004992 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004993
4994 ASSERT_NO_FATAL_FAILURE(InitState());
4995 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004996
4997 // Renderpass is started here
4998 BeginCommandBuffer();
4999
5000 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005001 vk_testing::Buffer dstBuffer;
5002 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005003
Karl Schultz6addd812016-02-02 17:17:23 -07005004 VkDeviceSize dstOffset = 0;
5005 VkDeviceSize dataSize = 1024;
5006 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005007
Karl Schultz6addd812016-02-02 17:17:23 -07005008 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
5009 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005010
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005011 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005012}
5013
Karl Schultz6addd812016-02-02 17:17:23 -07005014TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005015 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005016 m_errorMonitor->SetDesiredFailureMsg(
5017 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005018 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005019
5020 ASSERT_NO_FATAL_FAILURE(InitState());
5021 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005022
5023 // Renderpass is started here
5024 BeginCommandBuffer();
5025
Michael Lentine0a369f62016-02-03 16:51:46 -06005026 VkClearColorValue clear_color;
5027 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07005028 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
5029 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5030 const int32_t tex_width = 32;
5031 const int32_t tex_height = 32;
5032 VkImageCreateInfo image_create_info = {};
5033 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5034 image_create_info.pNext = NULL;
5035 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5036 image_create_info.format = tex_format;
5037 image_create_info.extent.width = tex_width;
5038 image_create_info.extent.height = tex_height;
5039 image_create_info.extent.depth = 1;
5040 image_create_info.mipLevels = 1;
5041 image_create_info.arrayLayers = 1;
5042 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5043 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
5044 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005045
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005046 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005047 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5048 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005049
Karl Schultz6addd812016-02-02 17:17:23 -07005050 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5051 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005052
Karl Schultz6addd812016-02-02 17:17:23 -07005053 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5054 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005055
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005056 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005057}
5058
Karl Schultz6addd812016-02-02 17:17:23 -07005059TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005060 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005061 m_errorMonitor->SetDesiredFailureMsg(
5062 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005063 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005064
5065 ASSERT_NO_FATAL_FAILURE(InitState());
5066 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005067
5068 // Renderpass is started here
5069 BeginCommandBuffer();
5070
5071 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07005072 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005073 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
5074 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5075 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
5076 image_create_info.extent.width = 64;
5077 image_create_info.extent.height = 64;
5078 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5079 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005080
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005081 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07005082 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
5083 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005084
Karl Schultz6addd812016-02-02 17:17:23 -07005085 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
5086 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005087
Karl Schultz6addd812016-02-02 17:17:23 -07005088 vkCmdClearDepthStencilImage(
5089 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
5090 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
5091 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005092
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005093 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005094}
5095
Karl Schultz6addd812016-02-02 17:17:23 -07005096TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005097 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005098 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005099
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005101 "vkCmdClearAttachments: This call "
5102 "must be issued inside an active "
5103 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005104
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005105 ASSERT_NO_FATAL_FAILURE(InitState());
5106 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005107
5108 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005109 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005110 ASSERT_VK_SUCCESS(err);
5111
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005112 VkClearAttachment color_attachment;
5113 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5114 color_attachment.clearValue.color.float32[0] = 0;
5115 color_attachment.clearValue.color.float32[1] = 0;
5116 color_attachment.clearValue.color.float32[2] = 0;
5117 color_attachment.clearValue.color.float32[3] = 0;
5118 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005119 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
5120 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5121 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005122
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005123 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06005124}
5125
Karl Schultz9e66a292016-04-21 15:57:51 -06005126TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
5127 // Try to add a buffer memory barrier with no buffer.
5128 m_errorMonitor->SetDesiredFailureMsg(
5129 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5130 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
5131
5132 ASSERT_NO_FATAL_FAILURE(InitState());
5133 BeginCommandBuffer();
5134
5135 VkBufferMemoryBarrier buf_barrier = {};
5136 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5137 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5138 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5139 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5140 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5141 buf_barrier.buffer = VK_NULL_HANDLE;
5142 buf_barrier.offset = 0;
5143 buf_barrier.size = VK_WHOLE_SIZE;
5144 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5145 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
5146 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
5147
5148 m_errorMonitor->VerifyFound();
5149}
5150
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06005151TEST_F(VkLayerTest, InvalidBarriers) {
5152 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
5153
5154 m_errorMonitor->SetDesiredFailureMsg(
5155 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
5156
5157 ASSERT_NO_FATAL_FAILURE(InitState());
5158 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5159
5160 VkMemoryBarrier mem_barrier = {};
5161 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
5162 mem_barrier.pNext = NULL;
5163 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5164 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5165 BeginCommandBuffer();
5166 // BeginCommandBuffer() starts a render pass
5167 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5168 VK_PIPELINE_STAGE_HOST_BIT,
5169 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
5170 &mem_barrier, 0, nullptr, 0, nullptr);
5171 m_errorMonitor->VerifyFound();
5172
5173 m_errorMonitor->SetDesiredFailureMsg(
5174 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5175 "Image Layout cannot be transitioned to UNDEFINED");
5176 VkImageObj image(m_device);
5177 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
5178 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5179 ASSERT_TRUE(image.initialized());
5180 VkImageMemoryBarrier img_barrier = {};
5181 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
5182 img_barrier.pNext = NULL;
5183 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5184 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5185 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5186 // New layout can't be UNDEFINED
5187 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5188 img_barrier.image = image.handle();
5189 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5190 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5191 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5192 img_barrier.subresourceRange.baseArrayLayer = 0;
5193 img_barrier.subresourceRange.baseMipLevel = 0;
5194 img_barrier.subresourceRange.layerCount = 1;
5195 img_barrier.subresourceRange.levelCount = 1;
5196 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5197 VK_PIPELINE_STAGE_HOST_BIT,
5198 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5199 nullptr, 1, &img_barrier);
5200 m_errorMonitor->VerifyFound();
5201 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5202
5203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5204 "Subresource must have the sum of the "
5205 "baseArrayLayer");
5206 // baseArrayLayer + layerCount must be <= image's arrayLayers
5207 img_barrier.subresourceRange.baseArrayLayer = 1;
5208 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5209 VK_PIPELINE_STAGE_HOST_BIT,
5210 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5211 nullptr, 1, &img_barrier);
5212 m_errorMonitor->VerifyFound();
5213 img_barrier.subresourceRange.baseArrayLayer = 0;
5214
5215 m_errorMonitor->SetDesiredFailureMsg(
5216 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5217 "Subresource must have the sum of the baseMipLevel");
5218 // baseMipLevel + levelCount must be <= image's mipLevels
5219 img_barrier.subresourceRange.baseMipLevel = 1;
5220 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5221 VK_PIPELINE_STAGE_HOST_BIT,
5222 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5223 nullptr, 1, &img_barrier);
5224 m_errorMonitor->VerifyFound();
5225 img_barrier.subresourceRange.baseMipLevel = 0;
5226
5227 m_errorMonitor->SetDesiredFailureMsg(
5228 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5229 "Buffer Barriers cannot be used during a render pass");
5230 vk_testing::Buffer buffer;
5231 buffer.init(*m_device, 256);
5232 VkBufferMemoryBarrier buf_barrier = {};
5233 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
5234 buf_barrier.pNext = NULL;
5235 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
5236 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
5237 buf_barrier.buffer = buffer.handle();
5238 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5239 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
5240 buf_barrier.offset = 0;
5241 buf_barrier.size = VK_WHOLE_SIZE;
5242 // Can't send buffer barrier during a render pass
5243 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5244 VK_PIPELINE_STAGE_HOST_BIT,
5245 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5246 &buf_barrier, 0, nullptr);
5247 m_errorMonitor->VerifyFound();
5248 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
5249
5250 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5251 "which is not less than total size");
5252 buf_barrier.offset = 257;
5253 // Offset greater than total size
5254 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5255 VK_PIPELINE_STAGE_HOST_BIT,
5256 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5257 &buf_barrier, 0, nullptr);
5258 m_errorMonitor->VerifyFound();
5259 buf_barrier.offset = 0;
5260
5261 m_errorMonitor->SetDesiredFailureMsg(
5262 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
5263 buf_barrier.size = 257;
5264 // Size greater than total size
5265 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5266 VK_PIPELINE_STAGE_HOST_BIT,
5267 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
5268 &buf_barrier, 0, nullptr);
5269 m_errorMonitor->VerifyFound();
5270 buf_barrier.size = VK_WHOLE_SIZE;
5271
5272 m_errorMonitor->SetDesiredFailureMsg(
5273 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5274 "Image is a depth and stencil format and thus must "
5275 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
5276 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
5277 VkDepthStencilObj ds_image(m_device);
5278 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
5279 ASSERT_TRUE(ds_image.initialized());
5280 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
5281 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
5282 img_barrier.image = ds_image.handle();
5283 // Leave aspectMask at COLOR on purpose
5284 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
5285 VK_PIPELINE_STAGE_HOST_BIT,
5286 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
5287 nullptr, 1, &img_barrier);
5288 m_errorMonitor->VerifyFound();
5289}
5290
Karl Schultz6addd812016-02-02 17:17:23 -07005291TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005292 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07005293 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005294
Karl Schultz6addd812016-02-02 17:17:23 -07005295 m_errorMonitor->SetDesiredFailureMsg(
5296 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005297 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
5298
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005299 ASSERT_NO_FATAL_FAILURE(InitState());
5300 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005301 uint32_t qfi = 0;
5302 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005303 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5304 buffCI.size = 1024;
5305 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5306 buffCI.queueFamilyIndexCount = 1;
5307 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005308
5309 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005310 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005311 ASSERT_VK_SUCCESS(err);
5312
5313 BeginCommandBuffer();
5314 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07005315 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5316 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005317 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07005318 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
5319 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005320
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005321 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005322
Chia-I Wuf7458c52015-10-26 21:10:41 +08005323 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06005324}
5325
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005326TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
5327 // Create an out-of-range queueFamilyIndex
5328 m_errorMonitor->SetDesiredFailureMsg(
5329 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06005330 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005331
5332 ASSERT_NO_FATAL_FAILURE(InitState());
5333 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5334 VkBufferCreateInfo buffCI = {};
5335 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5336 buffCI.size = 1024;
5337 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
5338 buffCI.queueFamilyIndexCount = 1;
5339 // Introduce failure by specifying invalid queue_family_index
5340 uint32_t qfi = 777;
5341 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06005342 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005343
5344 VkBuffer ib;
5345 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
5346
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005347 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07005348}
5349
Karl Schultz6addd812016-02-02 17:17:23 -07005350TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
5351 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
5352 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005353
Karl Schultz6addd812016-02-02 17:17:23 -07005354 m_errorMonitor->SetDesiredFailureMsg(
5355 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005356 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005357
5358 ASSERT_NO_FATAL_FAILURE(InitState());
5359 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005360
5361 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005362 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005363 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
5364 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005365
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005366 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06005367}
5368
Karl Schultz6addd812016-02-02 17:17:23 -07005369TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005370 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07005371 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005372
Karl Schultz6addd812016-02-02 17:17:23 -07005373 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005374 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5375 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
5376 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005377
Tobin Ehlis3b780662015-05-28 12:11:26 -06005378 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005379 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005380 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005381 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5382 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005383
5384 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005385 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5386 ds_pool_ci.pNext = NULL;
5387 ds_pool_ci.maxSets = 1;
5388 ds_pool_ci.poolSizeCount = 1;
5389 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005390
Tobin Ehlis3b780662015-05-28 12:11:26 -06005391 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005392 err =
5393 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005394 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005395 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005396 dsl_binding.binding = 0;
5397 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5398 dsl_binding.descriptorCount = 1;
5399 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5400 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005401
Tony Barboureb254902015-07-15 12:50:33 -06005402 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005403 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5404 ds_layout_ci.pNext = NULL;
5405 ds_layout_ci.bindingCount = 1;
5406 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005407
Tobin Ehlis3b780662015-05-28 12:11:26 -06005408 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005409 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5410 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005411 ASSERT_VK_SUCCESS(err);
5412
5413 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005414 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005415 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005416 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005417 alloc_info.descriptorPool = ds_pool;
5418 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005419 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5420 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005421 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005422
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005423 VkSamplerCreateInfo sampler_ci = {};
5424 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5425 sampler_ci.pNext = NULL;
5426 sampler_ci.magFilter = VK_FILTER_NEAREST;
5427 sampler_ci.minFilter = VK_FILTER_NEAREST;
5428 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5429 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5430 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5431 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5432 sampler_ci.mipLodBias = 1.0;
5433 sampler_ci.anisotropyEnable = VK_FALSE;
5434 sampler_ci.maxAnisotropy = 1;
5435 sampler_ci.compareEnable = VK_FALSE;
5436 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5437 sampler_ci.minLod = 1.0;
5438 sampler_ci.maxLod = 1.0;
5439 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5440 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5441 VkSampler sampler;
5442 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5443 ASSERT_VK_SUCCESS(err);
5444
5445 VkDescriptorImageInfo info = {};
5446 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005447
5448 VkWriteDescriptorSet descriptor_write;
5449 memset(&descriptor_write, 0, sizeof(descriptor_write));
5450 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005451 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005452 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005453 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005454 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005455 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005456
5457 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5458
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005459 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005460
Chia-I Wuf7458c52015-10-26 21:10:41 +08005461 vkDestroySampler(m_device->device(), sampler, NULL);
5462 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5463 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005464}
5465
Karl Schultz6addd812016-02-02 17:17:23 -07005466TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005467 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07005468 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005469
Karl Schultz6addd812016-02-02 17:17:23 -07005470 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005471 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5472 " binding #0 with 1 total descriptors but update of 1 descriptors "
5473 "starting at binding offset of 0 combined with update array element "
5474 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005475
Tobin Ehlis3b780662015-05-28 12:11:26 -06005476 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005477 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005478 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005479 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5480 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005481
5482 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005483 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5484 ds_pool_ci.pNext = NULL;
5485 ds_pool_ci.maxSets = 1;
5486 ds_pool_ci.poolSizeCount = 1;
5487 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005488
Tobin Ehlis3b780662015-05-28 12:11:26 -06005489 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005490 err =
5491 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005492 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005493
Tony Barboureb254902015-07-15 12:50:33 -06005494 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005495 dsl_binding.binding = 0;
5496 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5497 dsl_binding.descriptorCount = 1;
5498 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5499 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005500
5501 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005502 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5503 ds_layout_ci.pNext = NULL;
5504 ds_layout_ci.bindingCount = 1;
5505 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005506
Tobin Ehlis3b780662015-05-28 12:11:26 -06005507 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005508 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5509 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005510 ASSERT_VK_SUCCESS(err);
5511
5512 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005513 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005514 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005515 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005516 alloc_info.descriptorPool = ds_pool;
5517 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005518 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5519 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005520 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005521
Tobin Ehlis30db8f82016-05-05 08:19:48 -06005522 // Correctly update descriptor to avoid "NOT_UPDATED" error
5523 VkDescriptorBufferInfo buff_info = {};
5524 buff_info.buffer =
5525 VkBuffer(0); // Don't care about buffer handle for this test
5526 buff_info.offset = 0;
5527 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005528
5529 VkWriteDescriptorSet descriptor_write;
5530 memset(&descriptor_write, 0, sizeof(descriptor_write));
5531 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005532 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005533 descriptor_write.dstArrayElement =
5534 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08005535 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005536 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5537 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005538
5539 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5540
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005541 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005542
Chia-I Wuf7458c52015-10-26 21:10:41 +08005543 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5544 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005545}
5546
Karl Schultz6addd812016-02-02 17:17:23 -07005547TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
5548 // Create layout w/ count of 1 and attempt update to that layout w/ binding
5549 // index 2
5550 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005551
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5553 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005554
Tobin Ehlis3b780662015-05-28 12:11:26 -06005555 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005556 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005557 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005558 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5559 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005560
5561 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005562 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5563 ds_pool_ci.pNext = NULL;
5564 ds_pool_ci.maxSets = 1;
5565 ds_pool_ci.poolSizeCount = 1;
5566 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005567
Tobin Ehlis3b780662015-05-28 12:11:26 -06005568 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005569 err =
5570 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005571 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005572
Tony Barboureb254902015-07-15 12:50:33 -06005573 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005574 dsl_binding.binding = 0;
5575 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5576 dsl_binding.descriptorCount = 1;
5577 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5578 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06005579
5580 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005581 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5582 ds_layout_ci.pNext = NULL;
5583 ds_layout_ci.bindingCount = 1;
5584 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005585 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005586 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5587 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005588 ASSERT_VK_SUCCESS(err);
5589
5590 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005591 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005592 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005593 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005594 alloc_info.descriptorPool = ds_pool;
5595 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005596 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5597 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005598 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005599
Tony Barboureb254902015-07-15 12:50:33 -06005600 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005601 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5602 sampler_ci.pNext = NULL;
5603 sampler_ci.magFilter = VK_FILTER_NEAREST;
5604 sampler_ci.minFilter = VK_FILTER_NEAREST;
5605 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5606 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5607 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5608 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5609 sampler_ci.mipLodBias = 1.0;
5610 sampler_ci.anisotropyEnable = VK_FALSE;
5611 sampler_ci.maxAnisotropy = 1;
5612 sampler_ci.compareEnable = VK_FALSE;
5613 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5614 sampler_ci.minLod = 1.0;
5615 sampler_ci.maxLod = 1.0;
5616 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5617 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06005618
Tobin Ehlis3b780662015-05-28 12:11:26 -06005619 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005620 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005621 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005622
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005623 VkDescriptorImageInfo info = {};
5624 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005625
5626 VkWriteDescriptorSet descriptor_write;
5627 memset(&descriptor_write, 0, sizeof(descriptor_write));
5628 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005629 descriptor_write.dstSet = descriptorSet;
5630 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005631 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005632 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005633 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005634 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005635
5636 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5637
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005638 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005639
Chia-I Wuf7458c52015-10-26 21:10:41 +08005640 vkDestroySampler(m_device->device(), sampler, NULL);
5641 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5642 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005643}
5644
Karl Schultz6addd812016-02-02 17:17:23 -07005645TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
5646 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
5647 // types
5648 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005649
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005651 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005652
Tobin Ehlis3b780662015-05-28 12:11:26 -06005653 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005654
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005655 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005656 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5657 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005658
5659 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005660 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5661 ds_pool_ci.pNext = NULL;
5662 ds_pool_ci.maxSets = 1;
5663 ds_pool_ci.poolSizeCount = 1;
5664 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005665
Tobin Ehlis3b780662015-05-28 12:11:26 -06005666 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005667 err =
5668 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005669 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06005670 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005671 dsl_binding.binding = 0;
5672 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5673 dsl_binding.descriptorCount = 1;
5674 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5675 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005676
Tony Barboureb254902015-07-15 12:50:33 -06005677 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005678 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5679 ds_layout_ci.pNext = NULL;
5680 ds_layout_ci.bindingCount = 1;
5681 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005682
Tobin Ehlis3b780662015-05-28 12:11:26 -06005683 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005684 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5685 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005686 ASSERT_VK_SUCCESS(err);
5687
5688 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005689 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005690 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005691 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005692 alloc_info.descriptorPool = ds_pool;
5693 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005694 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5695 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005696 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005697
Tony Barboureb254902015-07-15 12:50:33 -06005698 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005699 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5700 sampler_ci.pNext = NULL;
5701 sampler_ci.magFilter = VK_FILTER_NEAREST;
5702 sampler_ci.minFilter = VK_FILTER_NEAREST;
5703 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5704 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5705 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5706 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5707 sampler_ci.mipLodBias = 1.0;
5708 sampler_ci.anisotropyEnable = VK_FALSE;
5709 sampler_ci.maxAnisotropy = 1;
5710 sampler_ci.compareEnable = VK_FALSE;
5711 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5712 sampler_ci.minLod = 1.0;
5713 sampler_ci.maxLod = 1.0;
5714 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5715 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005716 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005717 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005718 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005719
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005720 VkDescriptorImageInfo info = {};
5721 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005722
5723 VkWriteDescriptorSet descriptor_write;
5724 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07005725 descriptor_write.sType =
5726 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005727 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005728 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005729 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005730 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06005731 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08005732
5733 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5734
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005735 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005736
Chia-I Wuf7458c52015-10-26 21:10:41 +08005737 vkDestroySampler(m_device->device(), sampler, NULL);
5738 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5739 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005740}
5741
Karl Schultz6addd812016-02-02 17:17:23 -07005742TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005743 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07005744 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005745
Karl Schultz6addd812016-02-02 17:17:23 -07005746 m_errorMonitor->SetDesiredFailureMsg(
5747 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005748 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005749
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005750 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005751 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
5752 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005753 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005754 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
5755 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005756
5757 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005758 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5759 ds_pool_ci.pNext = NULL;
5760 ds_pool_ci.maxSets = 1;
5761 ds_pool_ci.poolSizeCount = 1;
5762 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005763
5764 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005765 err =
5766 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005767 ASSERT_VK_SUCCESS(err);
5768
5769 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005770 dsl_binding.binding = 0;
5771 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5772 dsl_binding.descriptorCount = 1;
5773 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5774 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005775
5776 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005777 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5778 ds_layout_ci.pNext = NULL;
5779 ds_layout_ci.bindingCount = 1;
5780 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005781 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005782 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5783 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005784 ASSERT_VK_SUCCESS(err);
5785
5786 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005787 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005788 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005789 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005790 alloc_info.descriptorPool = ds_pool;
5791 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005792 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5793 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005794 ASSERT_VK_SUCCESS(err);
5795
Karl Schultz6addd812016-02-02 17:17:23 -07005796 VkSampler sampler =
5797 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005798
5799 VkDescriptorImageInfo descriptor_info;
5800 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5801 descriptor_info.sampler = sampler;
5802
5803 VkWriteDescriptorSet descriptor_write;
5804 memset(&descriptor_write, 0, sizeof(descriptor_write));
5805 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005806 descriptor_write.dstSet = descriptorSet;
5807 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005808 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005809 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5810 descriptor_write.pImageInfo = &descriptor_info;
5811
5812 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5813
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005814 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005815
Chia-I Wuf7458c52015-10-26 21:10:41 +08005816 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5817 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005818}
5819
Karl Schultz6addd812016-02-02 17:17:23 -07005820TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
5821 // Create a single combined Image/Sampler descriptor and send it an invalid
5822 // imageView
5823 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005824
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5826 "Attempted write update to combined "
5827 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -06005828 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005829
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005830 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005831 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005832 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5833 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005834
5835 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005836 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5837 ds_pool_ci.pNext = NULL;
5838 ds_pool_ci.maxSets = 1;
5839 ds_pool_ci.poolSizeCount = 1;
5840 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005841
5842 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005843 err =
5844 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005845 ASSERT_VK_SUCCESS(err);
5846
5847 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005848 dsl_binding.binding = 0;
5849 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5850 dsl_binding.descriptorCount = 1;
5851 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5852 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005853
5854 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005855 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5856 ds_layout_ci.pNext = NULL;
5857 ds_layout_ci.bindingCount = 1;
5858 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005859 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005860 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5861 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005862 ASSERT_VK_SUCCESS(err);
5863
5864 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005865 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005866 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005867 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005868 alloc_info.descriptorPool = ds_pool;
5869 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005870 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5871 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005872 ASSERT_VK_SUCCESS(err);
5873
5874 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005875 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5876 sampler_ci.pNext = NULL;
5877 sampler_ci.magFilter = VK_FILTER_NEAREST;
5878 sampler_ci.minFilter = VK_FILTER_NEAREST;
5879 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5880 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5881 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5882 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5883 sampler_ci.mipLodBias = 1.0;
5884 sampler_ci.anisotropyEnable = VK_FALSE;
5885 sampler_ci.maxAnisotropy = 1;
5886 sampler_ci.compareEnable = VK_FALSE;
5887 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5888 sampler_ci.minLod = 1.0;
5889 sampler_ci.maxLod = 1.0;
5890 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5891 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005892
5893 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005894 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005895 ASSERT_VK_SUCCESS(err);
5896
Karl Schultz6addd812016-02-02 17:17:23 -07005897 VkImageView view =
5898 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005899
5900 VkDescriptorImageInfo descriptor_info;
5901 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
5902 descriptor_info.sampler = sampler;
5903 descriptor_info.imageView = view;
5904
5905 VkWriteDescriptorSet descriptor_write;
5906 memset(&descriptor_write, 0, sizeof(descriptor_write));
5907 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005908 descriptor_write.dstSet = descriptorSet;
5909 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005910 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005911 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5912 descriptor_write.pImageInfo = &descriptor_info;
5913
5914 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5915
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005916 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005917
Chia-I Wuf7458c52015-10-26 21:10:41 +08005918 vkDestroySampler(m_device->device(), sampler, NULL);
5919 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5920 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06005921}
5922
Karl Schultz6addd812016-02-02 17:17:23 -07005923TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
5924 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
5925 // into the other
5926 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005927
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5929 " binding #1 with type "
5930 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
5931 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005932
Tobin Ehlis04356f92015-10-27 16:35:27 -06005933 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07005934 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005935 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005936 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5937 ds_type_count[0].descriptorCount = 1;
5938 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
5939 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005940
5941 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005942 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5943 ds_pool_ci.pNext = NULL;
5944 ds_pool_ci.maxSets = 1;
5945 ds_pool_ci.poolSizeCount = 2;
5946 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005947
5948 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005949 err =
5950 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005951 ASSERT_VK_SUCCESS(err);
5952 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005953 dsl_binding[0].binding = 0;
5954 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5955 dsl_binding[0].descriptorCount = 1;
5956 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
5957 dsl_binding[0].pImmutableSamplers = NULL;
5958 dsl_binding[1].binding = 1;
5959 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5960 dsl_binding[1].descriptorCount = 1;
5961 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
5962 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005963
5964 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005965 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5966 ds_layout_ci.pNext = NULL;
5967 ds_layout_ci.bindingCount = 2;
5968 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005969
5970 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005971 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5972 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005973 ASSERT_VK_SUCCESS(err);
5974
5975 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005976 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005977 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005978 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005979 alloc_info.descriptorPool = ds_pool;
5980 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005981 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5982 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005983 ASSERT_VK_SUCCESS(err);
5984
5985 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005986 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5987 sampler_ci.pNext = NULL;
5988 sampler_ci.magFilter = VK_FILTER_NEAREST;
5989 sampler_ci.minFilter = VK_FILTER_NEAREST;
5990 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5991 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5992 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5993 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5994 sampler_ci.mipLodBias = 1.0;
5995 sampler_ci.anisotropyEnable = VK_FALSE;
5996 sampler_ci.maxAnisotropy = 1;
5997 sampler_ci.compareEnable = VK_FALSE;
5998 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5999 sampler_ci.minLod = 1.0;
6000 sampler_ci.maxLod = 1.0;
6001 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6002 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006003
6004 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006005 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006006 ASSERT_VK_SUCCESS(err);
6007
6008 VkDescriptorImageInfo info = {};
6009 info.sampler = sampler;
6010
6011 VkWriteDescriptorSet descriptor_write;
6012 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
6013 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006014 descriptor_write.dstSet = descriptorSet;
6015 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08006016 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06006017 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6018 descriptor_write.pImageInfo = &info;
6019 // This write update should succeed
6020 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6021 // Now perform a copy update that fails due to type mismatch
6022 VkCopyDescriptorSet copy_ds_update;
6023 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6024 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6025 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06006026 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006027 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006028 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08006029 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006030 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6031
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006032 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006033 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006034 m_errorMonitor->SetDesiredFailureMsg(
6035 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006036 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06006037 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6038 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6039 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006040 copy_ds_update.srcBinding =
6041 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006042 copy_ds_update.dstSet = descriptorSet;
6043 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06006044 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06006045 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6046
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006047 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006048
Tobin Ehlis04356f92015-10-27 16:35:27 -06006049 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006050 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006051 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
6052 "update array offset of 0 and update of "
6053 "5 descriptors oversteps total number "
6054 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006055
Tobin Ehlis04356f92015-10-27 16:35:27 -06006056 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
6057 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
6058 copy_ds_update.srcSet = descriptorSet;
6059 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006060 copy_ds_update.dstSet = descriptorSet;
6061 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006062 copy_ds_update.descriptorCount =
6063 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06006064 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
6065
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006066 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06006067
Chia-I Wuf7458c52015-10-26 21:10:41 +08006068 vkDestroySampler(m_device->device(), sampler, NULL);
6069 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6070 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06006071}
6072
Karl Schultz6addd812016-02-02 17:17:23 -07006073TEST_F(VkLayerTest, NumSamplesMismatch) {
6074 // Create CommandBuffer where MSAA samples doesn't match RenderPass
6075 // sampleCount
6076 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006077
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006078 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006079 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006080
Tobin Ehlis3b780662015-05-28 12:11:26 -06006081 ASSERT_NO_FATAL_FAILURE(InitState());
6082 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006083 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06006084 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006085 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006086
6087 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006088 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6089 ds_pool_ci.pNext = NULL;
6090 ds_pool_ci.maxSets = 1;
6091 ds_pool_ci.poolSizeCount = 1;
6092 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006093
Tobin Ehlis3b780662015-05-28 12:11:26 -06006094 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006095 err =
6096 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006097 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006098
Tony Barboureb254902015-07-15 12:50:33 -06006099 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08006100 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06006101 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08006102 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006103 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6104 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006105
Tony Barboureb254902015-07-15 12:50:33 -06006106 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6107 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6108 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006109 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006110 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006111
Tobin Ehlis3b780662015-05-28 12:11:26 -06006112 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006113 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6114 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006115 ASSERT_VK_SUCCESS(err);
6116
6117 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006118 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006119 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006120 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006121 alloc_info.descriptorPool = ds_pool;
6122 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006123 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6124 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006125 ASSERT_VK_SUCCESS(err);
6126
Tony Barboureb254902015-07-15 12:50:33 -06006127 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006128 pipe_ms_state_ci.sType =
6129 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6130 pipe_ms_state_ci.pNext = NULL;
6131 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6132 pipe_ms_state_ci.sampleShadingEnable = 0;
6133 pipe_ms_state_ci.minSampleShading = 1.0;
6134 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006135
Tony Barboureb254902015-07-15 12:50:33 -06006136 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006137 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6138 pipeline_layout_ci.pNext = NULL;
6139 pipeline_layout_ci.setLayoutCount = 1;
6140 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06006141
6142 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006143 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6144 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06006145 ASSERT_VK_SUCCESS(err);
6146
Karl Schultz6addd812016-02-02 17:17:23 -07006147 VkShaderObj vs(m_device, bindStateVertShaderText,
6148 VK_SHADER_STAGE_VERTEX_BIT, this);
6149 VkShaderObj fs(m_device, bindStateFragShaderText,
6150 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006151 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006152 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006153 VkPipelineObj pipe(m_device);
6154 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006155 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006156 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006157 pipe.SetMSAA(&pipe_ms_state_ci);
6158 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006159
Tony Barbourfe3351b2015-07-28 10:17:20 -06006160 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006161 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6162 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06006163
Mark Young29927482016-05-04 14:38:51 -06006164 // Render triangle (the error should trigger on the attempt to draw).
6165 Draw(3, 1, 0, 0);
6166
6167 // Finalize recording of the command buffer
6168 EndCommandBuffer();
6169
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006170 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006171
Chia-I Wuf7458c52015-10-26 21:10:41 +08006172 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6173 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6174 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006175}
Mark Young29927482016-05-04 14:38:51 -06006176
Mark Youngc89c6312016-03-31 16:03:20 -06006177TEST_F(VkLayerTest, NumBlendAttachMismatch) {
6178 // Create Pipeline where the number of blend attachments doesn't match the
6179 // number of color attachments. In this case, we don't add any color
6180 // blend attachments even though we have a color attachment.
6181 VkResult err;
6182
6183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -06006184 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06006185
6186 ASSERT_NO_FATAL_FAILURE(InitState());
6187 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6188 VkDescriptorPoolSize ds_type_count = {};
6189 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6190 ds_type_count.descriptorCount = 1;
6191
6192 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6193 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6194 ds_pool_ci.pNext = NULL;
6195 ds_pool_ci.maxSets = 1;
6196 ds_pool_ci.poolSizeCount = 1;
6197 ds_pool_ci.pPoolSizes = &ds_type_count;
6198
6199 VkDescriptorPool ds_pool;
6200 err =
6201 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6202 ASSERT_VK_SUCCESS(err);
6203
6204 VkDescriptorSetLayoutBinding dsl_binding = {};
6205 dsl_binding.binding = 0;
6206 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6207 dsl_binding.descriptorCount = 1;
6208 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6209 dsl_binding.pImmutableSamplers = NULL;
6210
6211 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6212 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6213 ds_layout_ci.pNext = NULL;
6214 ds_layout_ci.bindingCount = 1;
6215 ds_layout_ci.pBindings = &dsl_binding;
6216
6217 VkDescriptorSetLayout ds_layout;
6218 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6219 &ds_layout);
6220 ASSERT_VK_SUCCESS(err);
6221
6222 VkDescriptorSet descriptorSet;
6223 VkDescriptorSetAllocateInfo alloc_info = {};
6224 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6225 alloc_info.descriptorSetCount = 1;
6226 alloc_info.descriptorPool = ds_pool;
6227 alloc_info.pSetLayouts = &ds_layout;
6228 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6229 &descriptorSet);
6230 ASSERT_VK_SUCCESS(err);
6231
6232 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
6233 pipe_ms_state_ci.sType =
6234 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6235 pipe_ms_state_ci.pNext = NULL;
6236 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6237 pipe_ms_state_ci.sampleShadingEnable = 0;
6238 pipe_ms_state_ci.minSampleShading = 1.0;
6239 pipe_ms_state_ci.pSampleMask = NULL;
6240
6241 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6242 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6243 pipeline_layout_ci.pNext = NULL;
6244 pipeline_layout_ci.setLayoutCount = 1;
6245 pipeline_layout_ci.pSetLayouts = &ds_layout;
6246
6247 VkPipelineLayout pipeline_layout;
6248 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6249 &pipeline_layout);
6250 ASSERT_VK_SUCCESS(err);
6251
6252 VkShaderObj vs(m_device, bindStateVertShaderText,
6253 VK_SHADER_STAGE_VERTEX_BIT, this);
6254 VkShaderObj fs(m_device, bindStateFragShaderText,
6255 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006256 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06006257 // but add it to be able to run on more devices
6258 VkPipelineObj pipe(m_device);
6259 pipe.AddShader(&vs);
6260 pipe.AddShader(&fs);
6261 pipe.SetMSAA(&pipe_ms_state_ci);
6262 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6263
6264 BeginCommandBuffer();
6265 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6266 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6267
Mark Young29927482016-05-04 14:38:51 -06006268 // Render triangle (the error should trigger on the attempt to draw).
6269 Draw(3, 1, 0, 0);
6270
6271 // Finalize recording of the command buffer
6272 EndCommandBuffer();
6273
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006274 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06006275
6276 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6277 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6278 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6279}
Mark Young29927482016-05-04 14:38:51 -06006280
Karl Schultz6addd812016-02-02 17:17:23 -07006281TEST_F(VkLayerTest, ClearCmdNoDraw) {
6282 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
6283 // to issuing a Draw
6284 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006285
Karl Schultz6addd812016-02-02 17:17:23 -07006286 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07006287 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006288 "vkCmdClearAttachments() issued on CB object ");
6289
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006290 ASSERT_NO_FATAL_FAILURE(InitState());
6291 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006292
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006293 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006294 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6295 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006296
6297 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006298 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6299 ds_pool_ci.pNext = NULL;
6300 ds_pool_ci.maxSets = 1;
6301 ds_pool_ci.poolSizeCount = 1;
6302 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006303
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006304 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006305 err =
6306 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006307 ASSERT_VK_SUCCESS(err);
6308
Tony Barboureb254902015-07-15 12:50:33 -06006309 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006310 dsl_binding.binding = 0;
6311 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6312 dsl_binding.descriptorCount = 1;
6313 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6314 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006315
Tony Barboureb254902015-07-15 12:50:33 -06006316 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006317 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6318 ds_layout_ci.pNext = NULL;
6319 ds_layout_ci.bindingCount = 1;
6320 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006321
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006322 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006323 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6324 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006325 ASSERT_VK_SUCCESS(err);
6326
6327 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006328 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006329 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006330 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006331 alloc_info.descriptorPool = ds_pool;
6332 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006333 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6334 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006335 ASSERT_VK_SUCCESS(err);
6336
Tony Barboureb254902015-07-15 12:50:33 -06006337 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006338 pipe_ms_state_ci.sType =
6339 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6340 pipe_ms_state_ci.pNext = NULL;
6341 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
6342 pipe_ms_state_ci.sampleShadingEnable = 0;
6343 pipe_ms_state_ci.minSampleShading = 1.0;
6344 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006345
Tony Barboureb254902015-07-15 12:50:33 -06006346 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006347 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6348 pipeline_layout_ci.pNext = NULL;
6349 pipeline_layout_ci.setLayoutCount = 1;
6350 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006351
6352 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006353 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6354 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006355 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006356
Karl Schultz6addd812016-02-02 17:17:23 -07006357 VkShaderObj vs(m_device, bindStateVertShaderText,
6358 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006359 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006360 // on more devices
6361 VkShaderObj fs(m_device, bindStateFragShaderText,
6362 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006363
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006364 VkPipelineObj pipe(m_device);
6365 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006366 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006367 pipe.SetMSAA(&pipe_ms_state_ci);
6368 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006369
6370 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006371
Karl Schultz6addd812016-02-02 17:17:23 -07006372 // Main thing we care about for this test is that the VkImage obj we're
6373 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006374 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006375 VkClearAttachment color_attachment;
6376 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6377 color_attachment.clearValue.color.float32[0] = 1.0;
6378 color_attachment.clearValue.color.float32[1] = 1.0;
6379 color_attachment.clearValue.color.float32[2] = 1.0;
6380 color_attachment.clearValue.color.float32[3] = 1.0;
6381 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07006382 VkClearRect clear_rect = {
6383 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006384
Karl Schultz6addd812016-02-02 17:17:23 -07006385 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
6386 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006387
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006388 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006389
Chia-I Wuf7458c52015-10-26 21:10:41 +08006390 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6391 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6392 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06006393}
6394
Karl Schultz6addd812016-02-02 17:17:23 -07006395TEST_F(VkLayerTest, VtxBufferBadIndex) {
6396 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006397
Karl Schultz6addd812016-02-02 17:17:23 -07006398 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006399 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07006400 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006401
Tobin Ehlis502480b2015-06-24 15:53:07 -06006402 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06006403 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06006404 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06006405
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006406 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006407 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6408 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006409
6410 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006411 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6412 ds_pool_ci.pNext = NULL;
6413 ds_pool_ci.maxSets = 1;
6414 ds_pool_ci.poolSizeCount = 1;
6415 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06006416
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06006417 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006418 err =
6419 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006420 ASSERT_VK_SUCCESS(err);
6421
Tony Barboureb254902015-07-15 12:50:33 -06006422 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006423 dsl_binding.binding = 0;
6424 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6425 dsl_binding.descriptorCount = 1;
6426 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6427 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006428
Tony Barboureb254902015-07-15 12:50:33 -06006429 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006430 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6431 ds_layout_ci.pNext = NULL;
6432 ds_layout_ci.bindingCount = 1;
6433 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006434
Tobin Ehlis502480b2015-06-24 15:53:07 -06006435 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006436 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6437 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006438 ASSERT_VK_SUCCESS(err);
6439
6440 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006441 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006442 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006443 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006444 alloc_info.descriptorPool = ds_pool;
6445 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006446 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6447 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006448 ASSERT_VK_SUCCESS(err);
6449
Tony Barboureb254902015-07-15 12:50:33 -06006450 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006451 pipe_ms_state_ci.sType =
6452 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
6453 pipe_ms_state_ci.pNext = NULL;
6454 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
6455 pipe_ms_state_ci.sampleShadingEnable = 0;
6456 pipe_ms_state_ci.minSampleShading = 1.0;
6457 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006458
Tony Barboureb254902015-07-15 12:50:33 -06006459 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006460 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6461 pipeline_layout_ci.pNext = NULL;
6462 pipeline_layout_ci.setLayoutCount = 1;
6463 pipeline_layout_ci.pSetLayouts = &ds_layout;
6464 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06006465
Karl Schultz6addd812016-02-02 17:17:23 -07006466 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6467 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006468 ASSERT_VK_SUCCESS(err);
6469
Karl Schultz6addd812016-02-02 17:17:23 -07006470 VkShaderObj vs(m_device, bindStateVertShaderText,
6471 VK_SHADER_STAGE_VERTEX_BIT, this);
6472 VkShaderObj fs(m_device, bindStateFragShaderText,
6473 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06006474 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07006475 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006476 VkPipelineObj pipe(m_device);
6477 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006478 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006479 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006480 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06006481 pipe.SetViewport(m_viewports);
6482 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06006483 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006484
6485 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006486 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6487 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006488 // Don't care about actual data, just need to get to draw to flag error
6489 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07006490 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
6491 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06006492 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06006493 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006494
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006495 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006496
Chia-I Wuf7458c52015-10-26 21:10:41 +08006497 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6498 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6499 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06006500}
Tobin Ehlisc555a3c2016-05-04 14:08:34 -06006501// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
6502TEST_F(VkLayerTest, InvalidImageLayout) {
6503 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
6504 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
6505 "images in the wrong layout when they're copied or transitioned.");
6506 // 3 in ValidateCmdBufImageLayouts
6507 // * -1 Attempt to submit cmd buf w/ deleted image
6508 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
6509 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
6510 m_errorMonitor->SetDesiredFailureMsg(
6511 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6512 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
6513
6514 ASSERT_NO_FATAL_FAILURE(InitState());
6515 // Create src & dst images to use for copy operations
6516 VkImage src_image;
6517 VkImage dst_image;
6518
6519 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6520 const int32_t tex_width = 32;
6521 const int32_t tex_height = 32;
6522
6523 VkImageCreateInfo image_create_info = {};
6524 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6525 image_create_info.pNext = NULL;
6526 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6527 image_create_info.format = tex_format;
6528 image_create_info.extent.width = tex_width;
6529 image_create_info.extent.height = tex_height;
6530 image_create_info.extent.depth = 1;
6531 image_create_info.mipLevels = 1;
6532 image_create_info.arrayLayers = 4;
6533 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6534 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6535 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6536 image_create_info.flags = 0;
6537
6538 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
6539 ASSERT_VK_SUCCESS(err);
6540 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
6541 ASSERT_VK_SUCCESS(err);
6542
6543 BeginCommandBuffer();
6544 VkImageCopy copyRegion;
6545 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6546 copyRegion.srcSubresource.mipLevel = 0;
6547 copyRegion.srcSubresource.baseArrayLayer = 0;
6548 copyRegion.srcSubresource.layerCount = 1;
6549 copyRegion.srcOffset.x = 0;
6550 copyRegion.srcOffset.y = 0;
6551 copyRegion.srcOffset.z = 0;
6552 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6553 copyRegion.dstSubresource.mipLevel = 0;
6554 copyRegion.dstSubresource.baseArrayLayer = 0;
6555 copyRegion.dstSubresource.layerCount = 1;
6556 copyRegion.dstOffset.x = 0;
6557 copyRegion.dstOffset.y = 0;
6558 copyRegion.dstOffset.z = 0;
6559 copyRegion.extent.width = 1;
6560 copyRegion.extent.height = 1;
6561 copyRegion.extent.depth = 1;
6562 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6563 m_errorMonitor->VerifyFound();
6564 // Now cause error due to src image layout changing
6565 m_errorMonitor->SetDesiredFailureMsg(
6566 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6567 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
6568 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6569 m_errorMonitor->VerifyFound();
6570 // Final src error is due to bad layout type
6571 m_errorMonitor->SetDesiredFailureMsg(
6572 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6573 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
6574 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6575 m_errorMonitor->VerifyFound();
6576 // Now verify same checks for dst
6577 m_errorMonitor->SetDesiredFailureMsg(
6578 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6579 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
6580 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
6581 m_errorMonitor->VerifyFound();
6582 // Now cause error due to src image layout changing
6583 m_errorMonitor->SetDesiredFailureMsg(
6584 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6585 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
6586 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
6587 m_errorMonitor->VerifyFound();
6588 m_errorMonitor->SetDesiredFailureMsg(
6589 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6590 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
6591 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
6592 m_errorMonitor->VerifyFound();
6593 // Now cause error due to bad image layout transition in PipelineBarrier
6594 VkImageMemoryBarrier image_barrier[1] = {};
6595 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
6596 image_barrier[0].image = src_image;
6597 image_barrier[0].subresourceRange.layerCount = 2;
6598 image_barrier[0].subresourceRange.levelCount = 2;
6599 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6600 m_errorMonitor->SetDesiredFailureMsg(
6601 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6602 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
6603 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
6604 m_errorMonitor->VerifyFound();
6605
6606 // Finally some layout errors at RenderPass create time
6607 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
6608 VkAttachmentReference attach = {};
6609 // perf warning for GENERAL layout w/ non-DS input attachment
6610 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
6611 VkSubpassDescription subpass = {};
6612 subpass.inputAttachmentCount = 1;
6613 subpass.pInputAttachments = &attach;
6614 VkRenderPassCreateInfo rpci = {};
6615 rpci.subpassCount = 1;
6616 rpci.pSubpasses = &subpass;
6617 rpci.attachmentCount = 1;
6618 VkAttachmentDescription attach_desc = {};
6619 attach_desc.format = VK_FORMAT_UNDEFINED;
6620 rpci.pAttachments = &attach_desc;
6621 VkRenderPass rp;
6622 m_errorMonitor->SetDesiredFailureMsg(
6623 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6624 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
6625 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6626 m_errorMonitor->VerifyFound();
6627 // error w/ non-general layout
6628 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
6629
6630 m_errorMonitor->SetDesiredFailureMsg(
6631 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6632 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
6633 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6634 m_errorMonitor->VerifyFound();
6635 subpass.inputAttachmentCount = 0;
6636 subpass.colorAttachmentCount = 1;
6637 subpass.pColorAttachments = &attach;
6638 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
6639 // perf warning for GENERAL layout on color attachment
6640 m_errorMonitor->SetDesiredFailureMsg(
6641 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6642 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
6643 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6644 m_errorMonitor->VerifyFound();
6645 // error w/ non-color opt or GENERAL layout for color attachment
6646 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
6647 m_errorMonitor->SetDesiredFailureMsg(
6648 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6649 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
6650 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6651 m_errorMonitor->VerifyFound();
6652 subpass.colorAttachmentCount = 0;
6653 subpass.pDepthStencilAttachment = &attach;
6654 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
6655 // perf warning for GENERAL layout on DS attachment
6656 m_errorMonitor->SetDesiredFailureMsg(
6657 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
6658 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
6659 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6660 m_errorMonitor->VerifyFound();
6661 // error w/ non-ds opt or GENERAL layout for color attachment
6662 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
6663 m_errorMonitor->SetDesiredFailureMsg(
6664 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6665 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
6666 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
6667 m_errorMonitor->VerifyFound();
6668
6669 vkDestroyImage(m_device->device(), src_image, NULL);
6670 vkDestroyImage(m_device->device(), dst_image, NULL);
6671}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006672#endif // DRAW_STATE_TESTS
6673
Tobin Ehlis0788f522015-05-26 16:11:58 -06006674#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06006675#if GTEST_IS_THREADSAFE
6676struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006677 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006678 VkEvent event;
6679 bool bailout;
6680};
6681
Karl Schultz6addd812016-02-02 17:17:23 -07006682extern "C" void *AddToCommandBuffer(void *arg) {
6683 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006684
Karl Schultz6addd812016-02-02 17:17:23 -07006685 for (int i = 0; i < 10000; i++) {
6686 vkCmdSetEvent(data->commandBuffer, data->event,
6687 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006688 if (data->bailout) {
6689 break;
6690 }
6691 }
6692 return NULL;
6693}
6694
Karl Schultz6addd812016-02-02 17:17:23 -07006695TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006696 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006697
Karl Schultz6addd812016-02-02 17:17:23 -07006698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6699 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006700
Mike Stroyanaccf7692015-05-12 16:00:45 -06006701 ASSERT_NO_FATAL_FAILURE(InitState());
6702 ASSERT_NO_FATAL_FAILURE(InitViewport());
6703 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6704
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006705 // Calls AllocateCommandBuffers
6706 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006707
6708 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006709 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006710
6711 VkEventCreateInfo event_info;
6712 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06006713 VkResult err;
6714
6715 memset(&event_info, 0, sizeof(event_info));
6716 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6717
Chia-I Wuf7458c52015-10-26 21:10:41 +08006718 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006719 ASSERT_VK_SUCCESS(err);
6720
Mike Stroyanaccf7692015-05-12 16:00:45 -06006721 err = vkResetEvent(device(), event);
6722 ASSERT_VK_SUCCESS(err);
6723
6724 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006725 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006726 data.event = event;
6727 data.bailout = false;
6728 m_errorMonitor->SetBailout(&data.bailout);
6729 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006730 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006731 // Add many entries to command buffer from this thread at the same time.
6732 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06006733
Mike Stroyan4268d1f2015-07-13 14:45:35 -06006734 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006735 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006736
Mike Stroyan10b8cb72016-01-22 15:22:03 -07006737 m_errorMonitor->SetBailout(NULL);
6738
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006739 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06006740
Chia-I Wuf7458c52015-10-26 21:10:41 +08006741 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06006742}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006743#endif // GTEST_IS_THREADSAFE
6744#endif // THREADING_TESTS
6745
Chris Forbes9f7ff632015-05-25 11:13:08 +12006746#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006747TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006749 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006750
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006751 ASSERT_NO_FATAL_FAILURE(InitState());
6752 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6753
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006754 VkShaderModule module;
6755 VkShaderModuleCreateInfo moduleCreateInfo;
6756 struct icd_spv_header spv;
6757
6758 spv.magic = ICD_SPV_MAGIC;
6759 spv.version = ICD_SPV_VERSION;
6760 spv.gen_magic = 0;
6761
6762 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6763 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006764 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006765 moduleCreateInfo.codeSize = 4;
6766 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006767 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006768
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006769 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006770}
6771
Karl Schultz6addd812016-02-02 17:17:23 -07006772TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006774 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006775
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006776 ASSERT_NO_FATAL_FAILURE(InitState());
6777 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6778
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006779 VkShaderModule module;
6780 VkShaderModuleCreateInfo moduleCreateInfo;
6781 struct icd_spv_header spv;
6782
6783 spv.magic = ~ICD_SPV_MAGIC;
6784 spv.version = ICD_SPV_VERSION;
6785 spv.gen_magic = 0;
6786
6787 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6788 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07006789 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006790 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6791 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006792 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006793
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006794 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006795}
6796
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006797#if 0
6798// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -07006799TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006801 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006802
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006803 ASSERT_NO_FATAL_FAILURE(InitState());
6804 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6805
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006806 VkShaderModule module;
6807 VkShaderModuleCreateInfo moduleCreateInfo;
6808 struct icd_spv_header spv;
6809
6810 spv.magic = ICD_SPV_MAGIC;
6811 spv.version = ~ICD_SPV_VERSION;
6812 spv.gen_magic = 0;
6813
6814 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
6815 moduleCreateInfo.pNext = NULL;
6816
Karl Schultz6addd812016-02-02 17:17:23 -07006817 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006818 moduleCreateInfo.codeSize = sizeof(spv) + 10;
6819 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006820 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006821
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006822 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006823}
Chris Forbesb4afd0f2016-04-04 10:48:35 +12006824#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06006825
Karl Schultz6addd812016-02-02 17:17:23 -07006826TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006828 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006829
Chris Forbes9f7ff632015-05-25 11:13:08 +12006830 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006831 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006832
6833 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006834 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006835 "\n"
6836 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006837 "out gl_PerVertex {\n"
6838 " vec4 gl_Position;\n"
6839 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006840 "void main(){\n"
6841 " gl_Position = vec4(1);\n"
6842 " x = 0;\n"
6843 "}\n";
6844 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006845 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12006846 "\n"
6847 "layout(location=0) out vec4 color;\n"
6848 "void main(){\n"
6849 " color = vec4(1);\n"
6850 "}\n";
6851
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006852 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6853 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006854
6855 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006856 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006857 pipe.AddShader(&vs);
6858 pipe.AddShader(&fs);
6859
Chris Forbes9f7ff632015-05-25 11:13:08 +12006860 VkDescriptorSetObj descriptorSet(m_device);
6861 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006862 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12006863
Tony Barbour5781e8f2015-08-04 16:23:11 -06006864 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12006865
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006866 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12006867}
Chris Forbes9f7ff632015-05-25 11:13:08 +12006868
Karl Schultz6addd812016-02-02 17:17:23 -07006869TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006870 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006871 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006872
Chris Forbes59cb88d2015-05-25 11:13:13 +12006873 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006874 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006875
6876 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006877 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006878 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006879 "out gl_PerVertex {\n"
6880 " vec4 gl_Position;\n"
6881 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006882 "void main(){\n"
6883 " gl_Position = vec4(1);\n"
6884 "}\n";
6885 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006886 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12006887 "\n"
6888 "layout(location=0) in float x;\n"
6889 "layout(location=0) out vec4 color;\n"
6890 "void main(){\n"
6891 " color = vec4(x);\n"
6892 "}\n";
6893
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006894 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6895 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006896
6897 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006898 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006899 pipe.AddShader(&vs);
6900 pipe.AddShader(&fs);
6901
Chris Forbes59cb88d2015-05-25 11:13:13 +12006902 VkDescriptorSetObj descriptorSet(m_device);
6903 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006904 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12006905
Tony Barbour5781e8f2015-08-04 16:23:11 -06006906 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12006907
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006908 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12006909}
6910
Karl Schultz6addd812016-02-02 17:17:23 -07006911TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13006912 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006913 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13006914
6915 ASSERT_NO_FATAL_FAILURE(InitState());
6916 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6917
6918 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006919 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006920 "\n"
6921 "out gl_PerVertex {\n"
6922 " vec4 gl_Position;\n"
6923 "};\n"
6924 "void main(){\n"
6925 " gl_Position = vec4(1);\n"
6926 "}\n";
6927 char const *fsSource =
6928 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13006929 "\n"
6930 "in block { layout(location=0) float x; } ins;\n"
6931 "layout(location=0) out vec4 color;\n"
6932 "void main(){\n"
6933 " color = vec4(ins.x);\n"
6934 "}\n";
6935
6936 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6937 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6938
6939 VkPipelineObj pipe(m_device);
6940 pipe.AddColorAttachment();
6941 pipe.AddShader(&vs);
6942 pipe.AddShader(&fs);
6943
6944 VkDescriptorSetObj descriptorSet(m_device);
6945 descriptorSet.AppendDummy();
6946 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6947
6948 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6949
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006950 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13006951}
6952
Karl Schultz6addd812016-02-02 17:17:23 -07006953TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13006954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13006955 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07006956 "output arr[2] of float32' vs 'ptr to "
6957 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13006958
6959 ASSERT_NO_FATAL_FAILURE(InitState());
6960 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6961
6962 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006963 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006964 "\n"
6965 "layout(location=0) out float x[2];\n"
6966 "out gl_PerVertex {\n"
6967 " vec4 gl_Position;\n"
6968 "};\n"
6969 "void main(){\n"
6970 " x[0] = 0; x[1] = 0;\n"
6971 " gl_Position = vec4(1);\n"
6972 "}\n";
6973 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006974 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13006975 "\n"
6976 "layout(location=0) in float x[3];\n"
6977 "layout(location=0) out vec4 color;\n"
6978 "void main(){\n"
6979 " color = vec4(x[0] + x[1] + x[2]);\n"
6980 "}\n";
6981
6982 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6983 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6984
6985 VkPipelineObj pipe(m_device);
6986 pipe.AddColorAttachment();
6987 pipe.AddShader(&vs);
6988 pipe.AddShader(&fs);
6989
6990 VkDescriptorSetObj descriptorSet(m_device);
6991 descriptorSet.AppendDummy();
6992 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6993
6994 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6995
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006996 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13006997}
6998
Karl Schultz6addd812016-02-02 17:17:23 -07006999TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007001 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007002
Chris Forbesb56af562015-05-25 11:13:17 +12007003 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007004 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12007005
7006 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007007 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007008 "\n"
7009 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007010 "out gl_PerVertex {\n"
7011 " vec4 gl_Position;\n"
7012 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007013 "void main(){\n"
7014 " x = 0;\n"
7015 " gl_Position = vec4(1);\n"
7016 "}\n";
7017 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007018 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12007019 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007020 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12007021 "layout(location=0) out vec4 color;\n"
7022 "void main(){\n"
7023 " color = vec4(x);\n"
7024 "}\n";
7025
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007026 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7027 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12007028
7029 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007030 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12007031 pipe.AddShader(&vs);
7032 pipe.AddShader(&fs);
7033
Chris Forbesb56af562015-05-25 11:13:17 +12007034 VkDescriptorSetObj descriptorSet(m_device);
7035 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007036 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12007037
Tony Barbour5781e8f2015-08-04 16:23:11 -06007038 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12007039
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007040 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12007041}
7042
Karl Schultz6addd812016-02-02 17:17:23 -07007043TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13007044 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007045 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13007046
7047 ASSERT_NO_FATAL_FAILURE(InitState());
7048 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7049
7050 char const *vsSource =
7051 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007052 "\n"
7053 "out block { layout(location=0) int x; } outs;\n"
7054 "out gl_PerVertex {\n"
7055 " vec4 gl_Position;\n"
7056 "};\n"
7057 "void main(){\n"
7058 " outs.x = 0;\n"
7059 " gl_Position = vec4(1);\n"
7060 "}\n";
7061 char const *fsSource =
7062 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13007063 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007064 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13007065 "layout(location=0) out vec4 color;\n"
7066 "void main(){\n"
7067 " color = vec4(ins.x);\n"
7068 "}\n";
7069
7070 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7071 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7072
7073 VkPipelineObj pipe(m_device);
7074 pipe.AddColorAttachment();
7075 pipe.AddShader(&vs);
7076 pipe.AddShader(&fs);
7077
7078 VkDescriptorSetObj descriptorSet(m_device);
7079 descriptorSet.AppendDummy();
7080 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7081
7082 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7083
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007084 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007085}
7086
7087TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
7088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7089 "location 0.0 which is not written by vertex shader");
7090
7091 ASSERT_NO_FATAL_FAILURE(InitState());
7092 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7093
7094 char const *vsSource =
7095 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007096 "\n"
7097 "out block { layout(location=1) float x; } outs;\n"
7098 "out gl_PerVertex {\n"
7099 " vec4 gl_Position;\n"
7100 "};\n"
7101 "void main(){\n"
7102 " outs.x = 0;\n"
7103 " gl_Position = vec4(1);\n"
7104 "}\n";
7105 char const *fsSource =
7106 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007107 "\n"
7108 "in block { layout(location=0) float x; } ins;\n"
7109 "layout(location=0) out vec4 color;\n"
7110 "void main(){\n"
7111 " color = vec4(ins.x);\n"
7112 "}\n";
7113
7114 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7115 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7116
7117 VkPipelineObj pipe(m_device);
7118 pipe.AddColorAttachment();
7119 pipe.AddShader(&vs);
7120 pipe.AddShader(&fs);
7121
7122 VkDescriptorSetObj descriptorSet(m_device);
7123 descriptorSet.AppendDummy();
7124 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7125
7126 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7127
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007128 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13007129}
7130
7131TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
7132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7133 "location 0.1 which is not written by vertex shader");
7134
7135 ASSERT_NO_FATAL_FAILURE(InitState());
7136 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7137
7138 char const *vsSource =
7139 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007140 "\n"
7141 "out block { layout(location=0, component=0) float x; } outs;\n"
7142 "out gl_PerVertex {\n"
7143 " vec4 gl_Position;\n"
7144 "};\n"
7145 "void main(){\n"
7146 " outs.x = 0;\n"
7147 " gl_Position = vec4(1);\n"
7148 "}\n";
7149 char const *fsSource =
7150 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13007151 "\n"
7152 "in block { layout(location=0, component=1) float x; } ins;\n"
7153 "layout(location=0) out vec4 color;\n"
7154 "void main(){\n"
7155 " color = vec4(ins.x);\n"
7156 "}\n";
7157
7158 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7159 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7160
7161 VkPipelineObj pipe(m_device);
7162 pipe.AddColorAttachment();
7163 pipe.AddShader(&vs);
7164 pipe.AddShader(&fs);
7165
7166 VkDescriptorSetObj descriptorSet(m_device);
7167 descriptorSet.AppendDummy();
7168 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7169
7170 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7171
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007172 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13007173}
7174
Karl Schultz6addd812016-02-02 17:17:23 -07007175TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007177 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007178
Chris Forbesde136e02015-05-25 11:13:28 +12007179 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007180 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12007181
7182 VkVertexInputBindingDescription input_binding;
7183 memset(&input_binding, 0, sizeof(input_binding));
7184
7185 VkVertexInputAttributeDescription input_attrib;
7186 memset(&input_attrib, 0, sizeof(input_attrib));
7187 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7188
7189 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007190 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007191 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007192 "out gl_PerVertex {\n"
7193 " vec4 gl_Position;\n"
7194 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007195 "void main(){\n"
7196 " gl_Position = vec4(1);\n"
7197 "}\n";
7198 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007199 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12007200 "\n"
7201 "layout(location=0) out vec4 color;\n"
7202 "void main(){\n"
7203 " color = vec4(1);\n"
7204 "}\n";
7205
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007206 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7207 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12007208
7209 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007210 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12007211 pipe.AddShader(&vs);
7212 pipe.AddShader(&fs);
7213
7214 pipe.AddVertexInputBindings(&input_binding, 1);
7215 pipe.AddVertexInputAttribs(&input_attrib, 1);
7216
Chris Forbesde136e02015-05-25 11:13:28 +12007217 VkDescriptorSetObj descriptorSet(m_device);
7218 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007219 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12007220
Tony Barbour5781e8f2015-08-04 16:23:11 -06007221 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12007222
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007223 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12007224}
7225
Karl Schultz6addd812016-02-02 17:17:23 -07007226TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007228 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13007229
7230 ASSERT_NO_FATAL_FAILURE(InitState());
7231 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7232
7233 VkVertexInputBindingDescription input_binding;
7234 memset(&input_binding, 0, sizeof(input_binding));
7235
7236 VkVertexInputAttributeDescription input_attrib;
7237 memset(&input_attrib, 0, sizeof(input_attrib));
7238 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7239
7240 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007241 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007242 "\n"
7243 "layout(location=1) in float x;\n"
7244 "out gl_PerVertex {\n"
7245 " vec4 gl_Position;\n"
7246 "};\n"
7247 "void main(){\n"
7248 " gl_Position = vec4(x);\n"
7249 "}\n";
7250 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007251 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13007252 "\n"
7253 "layout(location=0) out vec4 color;\n"
7254 "void main(){\n"
7255 " color = vec4(1);\n"
7256 "}\n";
7257
7258 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7259 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7260
7261 VkPipelineObj pipe(m_device);
7262 pipe.AddColorAttachment();
7263 pipe.AddShader(&vs);
7264 pipe.AddShader(&fs);
7265
7266 pipe.AddVertexInputBindings(&input_binding, 1);
7267 pipe.AddVertexInputAttribs(&input_attrib, 1);
7268
7269 VkDescriptorSetObj descriptorSet(m_device);
7270 descriptorSet.AppendDummy();
7271 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7272
7273 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7274
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007275 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13007276}
7277
Karl Schultz6addd812016-02-02 17:17:23 -07007278TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
7279 m_errorMonitor->SetDesiredFailureMsg(
7280 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007281 "VS consumes input at location 0 but not provided");
7282
Chris Forbes62e8e502015-05-25 11:13:29 +12007283 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007284 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12007285
7286 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007287 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007288 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007289 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07007290 "out gl_PerVertex {\n"
7291 " vec4 gl_Position;\n"
7292 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007293 "void main(){\n"
7294 " gl_Position = x;\n"
7295 "}\n";
7296 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007297 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12007298 "\n"
7299 "layout(location=0) out vec4 color;\n"
7300 "void main(){\n"
7301 " color = vec4(1);\n"
7302 "}\n";
7303
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007304 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7305 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12007306
7307 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007308 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12007309 pipe.AddShader(&vs);
7310 pipe.AddShader(&fs);
7311
Chris Forbes62e8e502015-05-25 11:13:29 +12007312 VkDescriptorSetObj descriptorSet(m_device);
7313 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007314 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12007315
Tony Barbour5781e8f2015-08-04 16:23:11 -06007316 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12007317
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007318 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12007319}
7320
Karl Schultz6addd812016-02-02 17:17:23 -07007321TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
7322 m_errorMonitor->SetDesiredFailureMsg(
7323 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007324 "location 0 does not match VS input type");
7325
Chris Forbesc97d98e2015-05-25 11:13:31 +12007326 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007327 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007328
7329 VkVertexInputBindingDescription input_binding;
7330 memset(&input_binding, 0, sizeof(input_binding));
7331
7332 VkVertexInputAttributeDescription input_attrib;
7333 memset(&input_attrib, 0, sizeof(input_attrib));
7334 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7335
7336 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007337 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007338 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007339 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007340 "out gl_PerVertex {\n"
7341 " vec4 gl_Position;\n"
7342 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007343 "void main(){\n"
7344 " gl_Position = vec4(x);\n"
7345 "}\n";
7346 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007347 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12007348 "\n"
7349 "layout(location=0) out vec4 color;\n"
7350 "void main(){\n"
7351 " color = vec4(1);\n"
7352 "}\n";
7353
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007354 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7355 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007356
7357 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007358 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007359 pipe.AddShader(&vs);
7360 pipe.AddShader(&fs);
7361
7362 pipe.AddVertexInputBindings(&input_binding, 1);
7363 pipe.AddVertexInputAttribs(&input_attrib, 1);
7364
Chris Forbesc97d98e2015-05-25 11:13:31 +12007365 VkDescriptorSetObj descriptorSet(m_device);
7366 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007367 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12007368
Tony Barbour5781e8f2015-08-04 16:23:11 -06007369 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12007370
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007371 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12007372}
7373
Chris Forbesc68b43c2016-04-06 11:18:47 +12007374TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
7375 m_errorMonitor->SetDesiredFailureMsg(
7376 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7377 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
7378
7379 ASSERT_NO_FATAL_FAILURE(InitState());
7380 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7381
7382 char const *vsSource =
7383 "#version 450\n"
7384 "\n"
7385 "out gl_PerVertex {\n"
7386 " vec4 gl_Position;\n"
7387 "};\n"
7388 "void main(){\n"
7389 " gl_Position = vec4(1);\n"
7390 "}\n";
7391 char const *fsSource =
7392 "#version 450\n"
7393 "\n"
7394 "layout(location=0) out vec4 color;\n"
7395 "void main(){\n"
7396 " color = vec4(1);\n"
7397 "}\n";
7398
7399 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7400 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7401
7402 VkPipelineObj pipe(m_device);
7403 pipe.AddColorAttachment();
7404 pipe.AddShader(&vs);
7405 pipe.AddShader(&vs);
7406 pipe.AddShader(&fs);
7407
7408 VkDescriptorSetObj descriptorSet(m_device);
7409 descriptorSet.AppendDummy();
7410 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7411
7412 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7413
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007414 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12007415}
7416
Karl Schultz6addd812016-02-02 17:17:23 -07007417TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007418 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007419
7420 ASSERT_NO_FATAL_FAILURE(InitState());
7421 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7422
7423 VkVertexInputBindingDescription input_binding;
7424 memset(&input_binding, 0, sizeof(input_binding));
7425
7426 VkVertexInputAttributeDescription input_attribs[2];
7427 memset(input_attribs, 0, sizeof(input_attribs));
7428
7429 for (int i = 0; i < 2; i++) {
7430 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7431 input_attribs[i].location = i;
7432 }
7433
7434 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007435 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007436 "\n"
7437 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07007438 "out gl_PerVertex {\n"
7439 " vec4 gl_Position;\n"
7440 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007441 "void main(){\n"
7442 " gl_Position = x[0] + x[1];\n"
7443 "}\n";
7444 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007445 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007446 "\n"
7447 "layout(location=0) out vec4 color;\n"
7448 "void main(){\n"
7449 " color = vec4(1);\n"
7450 "}\n";
7451
7452 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7453 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7454
7455 VkPipelineObj pipe(m_device);
7456 pipe.AddColorAttachment();
7457 pipe.AddShader(&vs);
7458 pipe.AddShader(&fs);
7459
7460 pipe.AddVertexInputBindings(&input_binding, 1);
7461 pipe.AddVertexInputAttribs(input_attribs, 2);
7462
7463 VkDescriptorSetObj descriptorSet(m_device);
7464 descriptorSet.AppendDummy();
7465 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7466
7467 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7468
7469 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007470 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007471}
7472
Chris Forbes2682b242015-11-24 11:13:14 +13007473TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
7474{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007475 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13007476
7477 ASSERT_NO_FATAL_FAILURE(InitState());
7478 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7479
7480 VkVertexInputBindingDescription input_binding;
7481 memset(&input_binding, 0, sizeof(input_binding));
7482
7483 VkVertexInputAttributeDescription input_attribs[2];
7484 memset(input_attribs, 0, sizeof(input_attribs));
7485
7486 for (int i = 0; i < 2; i++) {
7487 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
7488 input_attribs[i].location = i;
7489 }
7490
7491 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007492 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007493 "\n"
7494 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07007495 "out gl_PerVertex {\n"
7496 " vec4 gl_Position;\n"
7497 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007498 "void main(){\n"
7499 " gl_Position = x[0] + x[1];\n"
7500 "}\n";
7501 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007502 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13007503 "\n"
7504 "layout(location=0) out vec4 color;\n"
7505 "void main(){\n"
7506 " color = vec4(1);\n"
7507 "}\n";
7508
7509 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7510 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7511
7512 VkPipelineObj pipe(m_device);
7513 pipe.AddColorAttachment();
7514 pipe.AddShader(&vs);
7515 pipe.AddShader(&fs);
7516
7517 pipe.AddVertexInputBindings(&input_binding, 1);
7518 pipe.AddVertexInputAttribs(input_attribs, 2);
7519
7520 VkDescriptorSetObj descriptorSet(m_device);
7521 descriptorSet.AppendDummy();
7522 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7523
7524 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7525
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007526 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13007527}
Chris Forbes2682b242015-11-24 11:13:14 +13007528
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007529TEST_F(VkLayerTest, CreatePipelineSimplePositive)
7530{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007531 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007532
7533 ASSERT_NO_FATAL_FAILURE(InitState());
7534 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7535
7536 char const *vsSource =
7537 "#version 450\n"
7538 "out gl_PerVertex {\n"
7539 " vec4 gl_Position;\n"
7540 "};\n"
7541 "void main(){\n"
7542 " gl_Position = vec4(0);\n"
7543 "}\n";
7544 char const *fsSource =
7545 "#version 450\n"
7546 "\n"
7547 "layout(location=0) out vec4 color;\n"
7548 "void main(){\n"
7549 " color = vec4(1);\n"
7550 "}\n";
7551
7552 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7553 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7554
7555 VkPipelineObj pipe(m_device);
7556 pipe.AddColorAttachment();
7557 pipe.AddShader(&vs);
7558 pipe.AddShader(&fs);
7559
7560 VkDescriptorSetObj descriptorSet(m_device);
7561 descriptorSet.AppendDummy();
7562 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7563
7564 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7565
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007566 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007567}
7568
Chris Forbes912c9192016-04-05 17:50:35 +12007569TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
7570{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007571 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12007572
7573 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
7574
7575 ASSERT_NO_FATAL_FAILURE(InitState());
7576 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7577
7578 char const *vsSource =
7579 "#version 450\n"
7580 "out gl_PerVertex {\n"
7581 " vec4 gl_Position;\n"
7582 "};\n"
7583 "layout(location=0) out vec3 x;\n"
7584 "layout(location=1) out ivec3 y;\n"
7585 "layout(location=2) out vec3 z;\n"
7586 "void main(){\n"
7587 " gl_Position = vec4(0);\n"
7588 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
7589 "}\n";
7590 char const *fsSource =
7591 "#version 450\n"
7592 "\n"
7593 "layout(location=0) out vec4 color;\n"
7594 "layout(location=0) in float x;\n"
7595 "layout(location=1) flat in int y;\n"
7596 "layout(location=2) in vec2 z;\n"
7597 "void main(){\n"
7598 " color = vec4(1 + x + y + z.x);\n"
7599 "}\n";
7600
7601 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7602 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7603
7604 VkPipelineObj pipe(m_device);
7605 pipe.AddColorAttachment();
7606 pipe.AddShader(&vs);
7607 pipe.AddShader(&fs);
7608
7609 VkDescriptorSetObj descriptorSet(m_device);
7610 descriptorSet.AppendDummy();
7611 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7612
7613 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7614
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007615 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12007616}
7617
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007618TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
7619{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007620 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007621
7622 ASSERT_NO_FATAL_FAILURE(InitState());
7623 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7624
Chris Forbesc1e852d2016-04-04 19:26:42 +12007625 if (!m_device->phy().features().tessellationShader) {
7626 printf("Device does not support tessellation shaders; skipped.\n");
7627 return;
7628 }
7629
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007630 char const *vsSource =
7631 "#version 450\n"
7632 "void main(){}\n";
7633 char const *tcsSource =
7634 "#version 450\n"
7635 "layout(location=0) out int x[];\n"
7636 "layout(vertices=3) out;\n"
7637 "void main(){\n"
7638 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7639 " gl_TessLevelInner[0] = 1;\n"
7640 " x[gl_InvocationID] = gl_InvocationID;\n"
7641 "}\n";
7642 char const *tesSource =
7643 "#version 450\n"
7644 "layout(triangles, equal_spacing, cw) in;\n"
7645 "layout(location=0) in int x[];\n"
7646 "out gl_PerVertex { vec4 gl_Position; };\n"
7647 "void main(){\n"
7648 " gl_Position.xyz = gl_TessCoord;\n"
7649 " gl_Position.w = x[0] + x[1] + x[2];\n"
7650 "}\n";
7651 char const *fsSource =
7652 "#version 450\n"
7653 "layout(location=0) out vec4 color;\n"
7654 "void main(){\n"
7655 " color = vec4(1);\n"
7656 "}\n";
7657
7658 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7659 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7660 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7661 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7662
7663 VkPipelineInputAssemblyStateCreateInfo iasci{
7664 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7665 nullptr,
7666 0,
7667 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7668 VK_FALSE};
7669
Chris Forbesb4cacb62016-04-04 19:15:00 +12007670 VkPipelineTessellationStateCreateInfo tsci{
7671 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7672 nullptr,
7673 0,
7674 3};
7675
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007676 VkPipelineObj pipe(m_device);
7677 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12007678 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007679 pipe.AddColorAttachment();
7680 pipe.AddShader(&vs);
7681 pipe.AddShader(&tcs);
7682 pipe.AddShader(&tes);
7683 pipe.AddShader(&fs);
7684
7685 VkDescriptorSetObj descriptorSet(m_device);
7686 descriptorSet.AppendDummy();
7687 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7688
7689 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7690
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007691 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12007692}
7693
Chris Forbesa0ab8152016-04-20 13:34:27 +12007694TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
7695{
7696 m_errorMonitor->ExpectSuccess();
7697
7698 ASSERT_NO_FATAL_FAILURE(InitState());
7699 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7700
7701 if (!m_device->phy().features().geometryShader) {
7702 printf("Device does not support geometry shaders; skipped.\n");
7703 return;
7704 }
7705
7706 char const *vsSource =
7707 "#version 450\n"
7708 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
7709 "void main(){\n"
7710 " vs_out.x = vec4(1);\n"
7711 "}\n";
7712 char const *gsSource =
7713 "#version 450\n"
7714 "layout(triangles) in;\n"
7715 "layout(triangle_strip, max_vertices=3) out;\n"
7716 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
7717 "out gl_PerVertex { vec4 gl_Position; };\n"
7718 "void main() {\n"
7719 " gl_Position = gs_in[0].x;\n"
7720 " EmitVertex();\n"
7721 "}\n";
7722 char const *fsSource =
7723 "#version 450\n"
7724 "layout(location=0) out vec4 color;\n"
7725 "void main(){\n"
7726 " color = vec4(1);\n"
7727 "}\n";
7728
7729 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7730 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
7731 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7732
7733 VkPipelineObj pipe(m_device);
7734 pipe.AddColorAttachment();
7735 pipe.AddShader(&vs);
7736 pipe.AddShader(&gs);
7737 pipe.AddShader(&fs);
7738
7739 VkDescriptorSetObj descriptorSet(m_device);
7740 descriptorSet.AppendDummy();
7741 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7742
7743 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7744
7745 m_errorMonitor->VerifyNotFound();
7746}
7747
Chris Forbesa0193bc2016-04-04 19:19:47 +12007748TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
7749{
7750 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7751 "is per-vertex in tessellation control shader stage "
7752 "but per-patch in tessellation evaluation shader stage");
7753
7754 ASSERT_NO_FATAL_FAILURE(InitState());
7755 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7756
Chris Forbesc1e852d2016-04-04 19:26:42 +12007757 if (!m_device->phy().features().tessellationShader) {
7758 printf("Device does not support tessellation shaders; skipped.\n");
7759 return;
7760 }
7761
Chris Forbesa0193bc2016-04-04 19:19:47 +12007762 char const *vsSource =
7763 "#version 450\n"
7764 "void main(){}\n";
7765 char const *tcsSource =
7766 "#version 450\n"
7767 "layout(location=0) out int x[];\n"
7768 "layout(vertices=3) out;\n"
7769 "void main(){\n"
7770 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
7771 " gl_TessLevelInner[0] = 1;\n"
7772 " x[gl_InvocationID] = gl_InvocationID;\n"
7773 "}\n";
7774 char const *tesSource =
7775 "#version 450\n"
7776 "layout(triangles, equal_spacing, cw) in;\n"
7777 "layout(location=0) patch in int x;\n"
7778 "out gl_PerVertex { vec4 gl_Position; };\n"
7779 "void main(){\n"
7780 " gl_Position.xyz = gl_TessCoord;\n"
7781 " gl_Position.w = x;\n"
7782 "}\n";
7783 char const *fsSource =
7784 "#version 450\n"
7785 "layout(location=0) out vec4 color;\n"
7786 "void main(){\n"
7787 " color = vec4(1);\n"
7788 "}\n";
7789
7790 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7791 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
7792 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
7793 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7794
7795 VkPipelineInputAssemblyStateCreateInfo iasci{
7796 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
7797 nullptr,
7798 0,
7799 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
7800 VK_FALSE};
7801
7802 VkPipelineTessellationStateCreateInfo tsci{
7803 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
7804 nullptr,
7805 0,
7806 3};
7807
7808 VkPipelineObj pipe(m_device);
7809 pipe.SetInputAssembly(&iasci);
7810 pipe.SetTessellation(&tsci);
7811 pipe.AddColorAttachment();
7812 pipe.AddShader(&vs);
7813 pipe.AddShader(&tcs);
7814 pipe.AddShader(&tes);
7815 pipe.AddShader(&fs);
7816
7817 VkDescriptorSetObj descriptorSet(m_device);
7818 descriptorSet.AppendDummy();
7819 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7820
7821 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7822
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007823 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12007824}
7825
Karl Schultz6addd812016-02-02 17:17:23 -07007826TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
7827 m_errorMonitor->SetDesiredFailureMsg(
7828 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007829 "Duplicate vertex input binding descriptions for binding 0");
7830
Chris Forbes280ba2c2015-06-12 11:16:41 +12007831 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007832 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007833
7834 /* Two binding descriptions for binding 0 */
7835 VkVertexInputBindingDescription input_bindings[2];
7836 memset(input_bindings, 0, sizeof(input_bindings));
7837
7838 VkVertexInputAttributeDescription input_attrib;
7839 memset(&input_attrib, 0, sizeof(input_attrib));
7840 input_attrib.format = VK_FORMAT_R32_SFLOAT;
7841
7842 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007843 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007844 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07007845 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07007846 "out gl_PerVertex {\n"
7847 " vec4 gl_Position;\n"
7848 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007849 "void main(){\n"
7850 " gl_Position = vec4(x);\n"
7851 "}\n";
7852 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007853 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12007854 "\n"
7855 "layout(location=0) out vec4 color;\n"
7856 "void main(){\n"
7857 " color = vec4(1);\n"
7858 "}\n";
7859
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007860 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7861 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007862
7863 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08007864 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007865 pipe.AddShader(&vs);
7866 pipe.AddShader(&fs);
7867
7868 pipe.AddVertexInputBindings(input_bindings, 2);
7869 pipe.AddVertexInputAttribs(&input_attrib, 1);
7870
Chris Forbes280ba2c2015-06-12 11:16:41 +12007871 VkDescriptorSetObj descriptorSet(m_device);
7872 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007873 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12007874
Tony Barbour5781e8f2015-08-04 16:23:11 -06007875 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12007876
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007877 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12007878}
Chris Forbes8f68b562015-05-25 11:13:32 +12007879
Chris Forbes35efec72016-04-21 14:32:08 +12007880TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
7881 m_errorMonitor->ExpectSuccess();
7882
7883 ASSERT_NO_FATAL_FAILURE(InitState());
7884 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7885
7886 if (!m_device->phy().features().tessellationShader) {
7887 printf("Device does not support 64bit vertex attributes; skipped.\n");
7888 return;
7889 }
7890
7891 VkVertexInputBindingDescription input_bindings[1];
7892 memset(input_bindings, 0, sizeof(input_bindings));
7893
7894 VkVertexInputAttributeDescription input_attribs[4];
7895 memset(input_attribs, 0, sizeof(input_attribs));
7896 input_attribs[0].location = 0;
7897 input_attribs[0].offset = 0;
7898 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7899 input_attribs[1].location = 2;
7900 input_attribs[1].offset = 32;
7901 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7902 input_attribs[2].location = 4;
7903 input_attribs[2].offset = 64;
7904 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7905 input_attribs[3].location = 6;
7906 input_attribs[3].offset = 96;
7907 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
7908
7909 char const *vsSource =
7910 "#version 450\n"
7911 "\n"
7912 "layout(location=0) in dmat4 x;\n"
7913 "out gl_PerVertex {\n"
7914 " vec4 gl_Position;\n"
7915 "};\n"
7916 "void main(){\n"
7917 " gl_Position = vec4(x[0][0]);\n"
7918 "}\n";
7919 char const *fsSource =
7920 "#version 450\n"
7921 "\n"
7922 "layout(location=0) out vec4 color;\n"
7923 "void main(){\n"
7924 " color = vec4(1);\n"
7925 "}\n";
7926
7927 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7928 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7929
7930 VkPipelineObj pipe(m_device);
7931 pipe.AddColorAttachment();
7932 pipe.AddShader(&vs);
7933 pipe.AddShader(&fs);
7934
7935 pipe.AddVertexInputBindings(input_bindings, 1);
7936 pipe.AddVertexInputAttribs(input_attribs, 4);
7937
7938 VkDescriptorSetObj descriptorSet(m_device);
7939 descriptorSet.AppendDummy();
7940 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
7941
7942 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
7943
7944 m_errorMonitor->VerifyNotFound();
7945}
7946
Karl Schultz6addd812016-02-02 17:17:23 -07007947TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007948 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007949 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007950
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007951 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007952
7953 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007954 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007955 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007956 "out gl_PerVertex {\n"
7957 " vec4 gl_Position;\n"
7958 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007959 "void main(){\n"
7960 " gl_Position = vec4(1);\n"
7961 "}\n";
7962 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007963 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007964 "\n"
7965 "void main(){\n"
7966 "}\n";
7967
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007968 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7969 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007970
7971 VkPipelineObj pipe(m_device);
7972 pipe.AddShader(&vs);
7973 pipe.AddShader(&fs);
7974
Chia-I Wu08accc62015-07-07 11:50:03 +08007975 /* set up CB 0, not written */
7976 pipe.AddColorAttachment();
7977 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007978
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007979 VkDescriptorSetObj descriptorSet(m_device);
7980 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007981 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007982
Tony Barbour5781e8f2015-08-04 16:23:11 -06007983 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007984
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007985 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12007986}
7987
Karl Schultz6addd812016-02-02 17:17:23 -07007988TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07007989 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007990 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007991 "FS writes to output location 1 with no matching attachment");
7992
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007993 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007994
7995 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12007996 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12007997 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007998 "out gl_PerVertex {\n"
7999 " vec4 gl_Position;\n"
8000 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008001 "void main(){\n"
8002 " gl_Position = vec4(1);\n"
8003 "}\n";
8004 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008005 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008006 "\n"
8007 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008008 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008009 "void main(){\n"
8010 " x = vec4(1);\n"
8011 " y = vec4(1);\n"
8012 "}\n";
8013
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008014 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8015 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008016
8017 VkPipelineObj pipe(m_device);
8018 pipe.AddShader(&vs);
8019 pipe.AddShader(&fs);
8020
Chia-I Wu08accc62015-07-07 11:50:03 +08008021 /* set up CB 0, not written */
8022 pipe.AddColorAttachment();
8023 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008024 /* FS writes CB 1, but we don't configure it */
8025
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008026 VkDescriptorSetObj descriptorSet(m_device);
8027 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008028 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008029
Tony Barbour5781e8f2015-08-04 16:23:11 -06008030 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008031
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008032 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12008033}
8034
Karl Schultz6addd812016-02-02 17:17:23 -07008035TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008037 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008038
Chris Forbesa36d69e2015-05-25 11:13:44 +12008039 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008040
8041 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008042 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008043 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008044 "out gl_PerVertex {\n"
8045 " vec4 gl_Position;\n"
8046 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008047 "void main(){\n"
8048 " gl_Position = vec4(1);\n"
8049 "}\n";
8050 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008051 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12008052 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07008053 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12008054 "void main(){\n"
8055 " x = ivec4(1);\n"
8056 "}\n";
8057
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008058 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8059 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008060
8061 VkPipelineObj pipe(m_device);
8062 pipe.AddShader(&vs);
8063 pipe.AddShader(&fs);
8064
Chia-I Wu08accc62015-07-07 11:50:03 +08008065 /* set up CB 0; type is UNORM by default */
8066 pipe.AddColorAttachment();
8067 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008068
Chris Forbesa36d69e2015-05-25 11:13:44 +12008069 VkDescriptorSetObj descriptorSet(m_device);
8070 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008071 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12008072
Tony Barbour5781e8f2015-08-04 16:23:11 -06008073 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12008074
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008075 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12008076}
Chris Forbes7b1b8932015-06-05 14:43:36 +12008077
Karl Schultz6addd812016-02-02 17:17:23 -07008078TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008079 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008080 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008081
Chris Forbes556c76c2015-08-14 12:04:59 +12008082 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12008083
8084 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008085 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008086 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008087 "out gl_PerVertex {\n"
8088 " vec4 gl_Position;\n"
8089 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008090 "void main(){\n"
8091 " gl_Position = vec4(1);\n"
8092 "}\n";
8093 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12008094 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12008095 "\n"
8096 "layout(location=0) out vec4 x;\n"
8097 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8098 "void main(){\n"
8099 " x = vec4(bar.y);\n"
8100 "}\n";
8101
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008102 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8103 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12008104
Chris Forbes556c76c2015-08-14 12:04:59 +12008105 VkPipelineObj pipe(m_device);
8106 pipe.AddShader(&vs);
8107 pipe.AddShader(&fs);
8108
8109 /* set up CB 0; type is UNORM by default */
8110 pipe.AddColorAttachment();
8111 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8112
8113 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008114 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12008115
8116 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8117
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008118 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12008119}
8120
Chris Forbes5c59e902016-02-26 16:56:09 +13008121TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
8122 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8123 "not declared in layout");
8124
8125 ASSERT_NO_FATAL_FAILURE(InitState());
8126
8127 char const *vsSource =
8128 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008129 "\n"
8130 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
8131 "out gl_PerVertex {\n"
8132 " vec4 gl_Position;\n"
8133 "};\n"
8134 "void main(){\n"
8135 " gl_Position = vec4(consts.x);\n"
8136 "}\n";
8137 char const *fsSource =
8138 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13008139 "\n"
8140 "layout(location=0) out vec4 x;\n"
8141 "void main(){\n"
8142 " x = vec4(1);\n"
8143 "}\n";
8144
8145 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8146 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8147
8148 VkPipelineObj pipe(m_device);
8149 pipe.AddShader(&vs);
8150 pipe.AddShader(&fs);
8151
8152 /* set up CB 0; type is UNORM by default */
8153 pipe.AddColorAttachment();
8154 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8155
8156 VkDescriptorSetObj descriptorSet(m_device);
8157 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
8158
8159 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
8160
8161 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008162 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13008163}
8164
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008165#endif // SHADER_CHECKER_TESTS
8166
8167#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06008168TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07008169 m_errorMonitor->SetDesiredFailureMsg(
8170 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008171 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008172
8173 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008174
8175 // Create an image
8176 VkImage image;
8177
Karl Schultz6addd812016-02-02 17:17:23 -07008178 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8179 const int32_t tex_width = 32;
8180 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008181
8182 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008183 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8184 image_create_info.pNext = NULL;
8185 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8186 image_create_info.format = tex_format;
8187 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008188 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07008189 image_create_info.extent.depth = 1;
8190 image_create_info.mipLevels = 1;
8191 image_create_info.arrayLayers = 1;
8192 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8193 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8194 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8195 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008196
8197 // Introduce error by sending down a bogus width extent
8198 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008199 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008200
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008201 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06008202}
8203
Mark Youngc48c4c12016-04-11 14:26:49 -06008204TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
8205 m_errorMonitor->SetDesiredFailureMsg(
8206 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8207 "CreateImage extents is 0 for at least one required dimension");
8208
8209 ASSERT_NO_FATAL_FAILURE(InitState());
8210
8211 // Create an image
8212 VkImage image;
8213
8214 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8215 const int32_t tex_width = 32;
8216 const int32_t tex_height = 32;
8217
8218 VkImageCreateInfo image_create_info = {};
8219 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8220 image_create_info.pNext = NULL;
8221 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8222 image_create_info.format = tex_format;
8223 image_create_info.extent.width = tex_width;
8224 image_create_info.extent.height = tex_height;
8225 image_create_info.extent.depth = 1;
8226 image_create_info.mipLevels = 1;
8227 image_create_info.arrayLayers = 1;
8228 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8229 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8230 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8231 image_create_info.flags = 0;
8232
8233 // Introduce error by sending down a bogus width extent
8234 image_create_info.extent.width = 0;
8235 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8236
8237 m_errorMonitor->VerifyFound();
8238}
8239
Karl Schultz6addd812016-02-02 17:17:23 -07008240TEST_F(VkLayerTest, UpdateBufferAlignment) {
8241 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06008242
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008244 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008245
Mike Stroyana3082432015-09-25 13:39:21 -06008246 ASSERT_NO_FATAL_FAILURE(InitState());
8247
8248 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8249 vk_testing::Buffer buffer;
8250 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8251
8252 BeginCommandBuffer();
8253 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008254 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008255 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008256
Mike Stroyana3082432015-09-25 13:39:21 -06008257 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008259 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008260
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008261 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008262 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008263 EndCommandBuffer();
8264}
8265
Karl Schultz6addd812016-02-02 17:17:23 -07008266TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008267 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008268 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06008269
8270 ASSERT_NO_FATAL_FAILURE(InitState());
8271
8272 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8273 vk_testing::Buffer buffer;
8274 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
8275
8276 BeginCommandBuffer();
8277 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008278 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008279 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008280
Mike Stroyana3082432015-09-25 13:39:21 -06008281 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008283 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008284
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008285 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008286
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008287 m_errorMonitor->VerifyFound();
8288
Mike Stroyana3082432015-09-25 13:39:21 -06008289 EndCommandBuffer();
8290}
8291
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008292#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12008293
Tobin Ehliscde08892015-09-22 10:11:37 -06008294#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07008295TEST_F(VkLayerTest, InvalidImageView) {
8296 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06008297
Karl Schultz6addd812016-02-02 17:17:23 -07008298 m_errorMonitor->SetDesiredFailureMsg(
8299 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008300 "vkCreateImageView called with baseMipLevel 10 ");
8301
Tobin Ehliscde08892015-09-22 10:11:37 -06008302 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06008303
Mike Stroyana3082432015-09-25 13:39:21 -06008304 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07008305 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06008306
Karl Schultz6addd812016-02-02 17:17:23 -07008307 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8308 const int32_t tex_width = 32;
8309 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06008310
8311 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008312 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8313 image_create_info.pNext = NULL;
8314 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8315 image_create_info.format = tex_format;
8316 image_create_info.extent.width = tex_width;
8317 image_create_info.extent.height = tex_height;
8318 image_create_info.extent.depth = 1;
8319 image_create_info.mipLevels = 1;
8320 image_create_info.arrayLayers = 1;
8321 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8322 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8323 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8324 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06008325
Chia-I Wuf7458c52015-10-26 21:10:41 +08008326 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06008327 ASSERT_VK_SUCCESS(err);
8328
8329 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008330 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8331 image_view_create_info.image = image;
8332 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8333 image_view_create_info.format = tex_format;
8334 image_view_create_info.subresourceRange.layerCount = 1;
8335 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
8336 image_view_create_info.subresourceRange.levelCount = 1;
8337 image_view_create_info.subresourceRange.aspectMask =
8338 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06008339
8340 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008341 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8342 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06008343
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008344 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06008345}
Mike Stroyana3082432015-09-25 13:39:21 -06008346
Karl Schultz6addd812016-02-02 17:17:23 -07008347TEST_F(VkLayerTest, InvalidImageViewAspect) {
8348 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008349
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008350 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008351 "vkCreateImageView: Color image "
8352 "formats must have ONLY the "
8353 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008354
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008355 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008356
8357 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07008358 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008359
Karl Schultz6addd812016-02-02 17:17:23 -07008360 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8361 const int32_t tex_width = 32;
8362 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008363
8364 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008365 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8366 image_create_info.pNext = NULL;
8367 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8368 image_create_info.format = tex_format;
8369 image_create_info.extent.width = tex_width;
8370 image_create_info.extent.height = tex_height;
8371 image_create_info.extent.depth = 1;
8372 image_create_info.mipLevels = 1;
8373 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8374 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8375 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8376 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008377
Chia-I Wuf7458c52015-10-26 21:10:41 +08008378 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008379 ASSERT_VK_SUCCESS(err);
8380
8381 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008382 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8383 image_view_create_info.image = image;
8384 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8385 image_view_create_info.format = tex_format;
8386 image_view_create_info.subresourceRange.baseMipLevel = 0;
8387 image_view_create_info.subresourceRange.levelCount = 1;
8388 // Cause an error by setting an invalid image aspect
8389 image_view_create_info.subresourceRange.aspectMask =
8390 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008391
8392 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008393 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8394 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008395
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008396 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06008397}
8398
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008399TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008400 VkResult err;
8401 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008402
Karl Schultz6addd812016-02-02 17:17:23 -07008403 m_errorMonitor->SetDesiredFailureMsg(
8404 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008405 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008406
Mike Stroyana3082432015-09-25 13:39:21 -06008407 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008408
8409 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008410 VkImage srcImage;
8411 VkImage dstImage;
8412 VkDeviceMemory srcMem;
8413 VkDeviceMemory destMem;
8414 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008415
8416 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008417 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8418 image_create_info.pNext = NULL;
8419 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8420 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8421 image_create_info.extent.width = 32;
8422 image_create_info.extent.height = 32;
8423 image_create_info.extent.depth = 1;
8424 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008425 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07008426 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8427 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8428 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8429 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008430
Karl Schultz6addd812016-02-02 17:17:23 -07008431 err =
8432 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008433 ASSERT_VK_SUCCESS(err);
8434
Karl Schultz6addd812016-02-02 17:17:23 -07008435 err =
8436 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008437 ASSERT_VK_SUCCESS(err);
8438
8439 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008440 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008441 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8442 memAlloc.pNext = NULL;
8443 memAlloc.allocationSize = 0;
8444 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008445
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008446 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008447 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008448 pass =
8449 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008450 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008451 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008452 ASSERT_VK_SUCCESS(err);
8453
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008454 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008455 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008456 pass =
8457 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008458 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008459 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008460 ASSERT_VK_SUCCESS(err);
8461
8462 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8463 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008464 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008465 ASSERT_VK_SUCCESS(err);
8466
8467 BeginCommandBuffer();
8468 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008469 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008470 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008471 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008472 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06008473 copyRegion.srcOffset.x = 0;
8474 copyRegion.srcOffset.y = 0;
8475 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008476 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008477 copyRegion.dstSubresource.mipLevel = 0;
8478 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008479 // Introduce failure by forcing the dst layerCount to differ from src
8480 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008481 copyRegion.dstOffset.x = 0;
8482 copyRegion.dstOffset.y = 0;
8483 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008484 copyRegion.extent.width = 1;
8485 copyRegion.extent.height = 1;
8486 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008487 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8488 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008489 EndCommandBuffer();
8490
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008491 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008492
Chia-I Wuf7458c52015-10-26 21:10:41 +08008493 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008494 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008495 vkFreeMemory(m_device->device(), srcMem, NULL);
8496 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008497}
8498
Karl Schultz6addd812016-02-02 17:17:23 -07008499TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06008500 VkResult err;
8501 bool pass;
8502
8503 // Create color images with different format sizes and try to copy between them
8504 m_errorMonitor->SetDesiredFailureMsg(
8505 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8506 "vkCmdCopyImage called with unmatched source and dest image format sizes");
8507
8508 ASSERT_NO_FATAL_FAILURE(InitState());
8509
8510 // Create two images of different types and try to copy between them
8511 VkImage srcImage;
8512 VkImage dstImage;
8513 VkDeviceMemory srcMem;
8514 VkDeviceMemory destMem;
8515 VkMemoryRequirements memReqs;
8516
8517 VkImageCreateInfo image_create_info = {};
8518 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8519 image_create_info.pNext = NULL;
8520 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8521 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8522 image_create_info.extent.width = 32;
8523 image_create_info.extent.height = 32;
8524 image_create_info.extent.depth = 1;
8525 image_create_info.mipLevels = 1;
8526 image_create_info.arrayLayers = 1;
8527 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8528 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8529 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8530 image_create_info.flags = 0;
8531
8532 err =
8533 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
8534 ASSERT_VK_SUCCESS(err);
8535
8536 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8537 // Introduce failure by creating second image with a different-sized format.
8538 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
8539
8540 err =
8541 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
8542 ASSERT_VK_SUCCESS(err);
8543
8544 // Allocate memory
8545 VkMemoryAllocateInfo memAlloc = {};
8546 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8547 memAlloc.pNext = NULL;
8548 memAlloc.allocationSize = 0;
8549 memAlloc.memoryTypeIndex = 0;
8550
8551 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
8552 memAlloc.allocationSize = memReqs.size;
8553 pass =
8554 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
8555 ASSERT_TRUE(pass);
8556 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
8557 ASSERT_VK_SUCCESS(err);
8558
8559 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
8560 memAlloc.allocationSize = memReqs.size;
8561 pass =
8562 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
8563 ASSERT_TRUE(pass);
8564 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
8565 ASSERT_VK_SUCCESS(err);
8566
8567 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8568 ASSERT_VK_SUCCESS(err);
8569 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
8570 ASSERT_VK_SUCCESS(err);
8571
8572 BeginCommandBuffer();
8573 VkImageCopy copyRegion;
8574 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8575 copyRegion.srcSubresource.mipLevel = 0;
8576 copyRegion.srcSubresource.baseArrayLayer = 0;
8577 copyRegion.srcSubresource.layerCount = 0;
8578 copyRegion.srcOffset.x = 0;
8579 copyRegion.srcOffset.y = 0;
8580 copyRegion.srcOffset.z = 0;
8581 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8582 copyRegion.dstSubresource.mipLevel = 0;
8583 copyRegion.dstSubresource.baseArrayLayer = 0;
8584 copyRegion.dstSubresource.layerCount = 0;
8585 copyRegion.dstOffset.x = 0;
8586 copyRegion.dstOffset.y = 0;
8587 copyRegion.dstOffset.z = 0;
8588 copyRegion.extent.width = 1;
8589 copyRegion.extent.height = 1;
8590 copyRegion.extent.depth = 1;
8591 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8592 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
8593 EndCommandBuffer();
8594
8595 m_errorMonitor->VerifyFound();
8596
8597 vkDestroyImage(m_device->device(), srcImage, NULL);
8598 vkDestroyImage(m_device->device(), dstImage, NULL);
8599 vkFreeMemory(m_device->device(), srcMem, NULL);
8600 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008601}
8602
Karl Schultz6addd812016-02-02 17:17:23 -07008603TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
8604 VkResult err;
8605 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008606
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008607 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008608 m_errorMonitor->SetDesiredFailureMsg(
8609 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008610 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008611
Mike Stroyana3082432015-09-25 13:39:21 -06008612 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008613
8614 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008615 VkImage srcImage;
8616 VkImage dstImage;
8617 VkDeviceMemory srcMem;
8618 VkDeviceMemory destMem;
8619 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008620
8621 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008622 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8623 image_create_info.pNext = NULL;
8624 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8625 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8626 image_create_info.extent.width = 32;
8627 image_create_info.extent.height = 32;
8628 image_create_info.extent.depth = 1;
8629 image_create_info.mipLevels = 1;
8630 image_create_info.arrayLayers = 1;
8631 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8632 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8633 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8634 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008635
Karl Schultz6addd812016-02-02 17:17:23 -07008636 err =
8637 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008638 ASSERT_VK_SUCCESS(err);
8639
Karl Schultzbdb75952016-04-19 11:36:49 -06008640 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
8641
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008642 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07008643 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06008644 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8645 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008646
Karl Schultz6addd812016-02-02 17:17:23 -07008647 err =
8648 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008649 ASSERT_VK_SUCCESS(err);
8650
8651 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008652 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008653 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8654 memAlloc.pNext = NULL;
8655 memAlloc.allocationSize = 0;
8656 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008657
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008658 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008659 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008660 pass =
8661 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008662 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008663 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008664 ASSERT_VK_SUCCESS(err);
8665
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008666 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008667 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008668 pass =
8669 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008670 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008671 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008672 ASSERT_VK_SUCCESS(err);
8673
8674 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8675 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008676 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008677 ASSERT_VK_SUCCESS(err);
8678
8679 BeginCommandBuffer();
8680 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008681 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008682 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008683 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008684 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008685 copyRegion.srcOffset.x = 0;
8686 copyRegion.srcOffset.y = 0;
8687 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008688 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008689 copyRegion.dstSubresource.mipLevel = 0;
8690 copyRegion.dstSubresource.baseArrayLayer = 0;
8691 copyRegion.dstSubresource.layerCount = 0;
8692 copyRegion.dstOffset.x = 0;
8693 copyRegion.dstOffset.y = 0;
8694 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008695 copyRegion.extent.width = 1;
8696 copyRegion.extent.height = 1;
8697 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008698 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8699 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008700 EndCommandBuffer();
8701
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008702 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008703
Chia-I Wuf7458c52015-10-26 21:10:41 +08008704 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008705 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008706 vkFreeMemory(m_device->device(), srcMem, NULL);
8707 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008708}
8709
Karl Schultz6addd812016-02-02 17:17:23 -07008710TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
8711 VkResult err;
8712 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008713
Karl Schultz6addd812016-02-02 17:17:23 -07008714 m_errorMonitor->SetDesiredFailureMsg(
8715 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008716 "vkCmdResolveImage called with source sample count less than 2.");
8717
Mike Stroyana3082432015-09-25 13:39:21 -06008718 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008719
8720 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008721 VkImage srcImage;
8722 VkImage dstImage;
8723 VkDeviceMemory srcMem;
8724 VkDeviceMemory destMem;
8725 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008726
8727 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008728 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8729 image_create_info.pNext = NULL;
8730 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8731 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8732 image_create_info.extent.width = 32;
8733 image_create_info.extent.height = 1;
8734 image_create_info.extent.depth = 1;
8735 image_create_info.mipLevels = 1;
8736 image_create_info.arrayLayers = 1;
8737 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8738 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8739 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8740 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008741
Karl Schultz6addd812016-02-02 17:17:23 -07008742 err =
8743 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008744 ASSERT_VK_SUCCESS(err);
8745
Karl Schultz6addd812016-02-02 17:17:23 -07008746 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008747
Karl Schultz6addd812016-02-02 17:17:23 -07008748 err =
8749 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008750 ASSERT_VK_SUCCESS(err);
8751
8752 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008753 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008754 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8755 memAlloc.pNext = NULL;
8756 memAlloc.allocationSize = 0;
8757 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008758
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008759 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008760 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008761 pass =
8762 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008763 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008764 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008765 ASSERT_VK_SUCCESS(err);
8766
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008767 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008768 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008769 pass =
8770 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008771 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008772 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008773 ASSERT_VK_SUCCESS(err);
8774
8775 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8776 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008777 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008778 ASSERT_VK_SUCCESS(err);
8779
8780 BeginCommandBuffer();
8781 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008782 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8783 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008784 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008785 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008786 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008787 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008788 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008789 resolveRegion.srcOffset.x = 0;
8790 resolveRegion.srcOffset.y = 0;
8791 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008792 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008793 resolveRegion.dstSubresource.mipLevel = 0;
8794 resolveRegion.dstSubresource.baseArrayLayer = 0;
8795 resolveRegion.dstSubresource.layerCount = 0;
8796 resolveRegion.dstOffset.x = 0;
8797 resolveRegion.dstOffset.y = 0;
8798 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008799 resolveRegion.extent.width = 1;
8800 resolveRegion.extent.height = 1;
8801 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008802 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8803 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008804 EndCommandBuffer();
8805
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008806 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008807
Chia-I Wuf7458c52015-10-26 21:10:41 +08008808 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008809 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008810 vkFreeMemory(m_device->device(), srcMem, NULL);
8811 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008812}
8813
Karl Schultz6addd812016-02-02 17:17:23 -07008814TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
8815 VkResult err;
8816 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008817
Karl Schultz6addd812016-02-02 17:17:23 -07008818 m_errorMonitor->SetDesiredFailureMsg(
8819 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008820 "vkCmdResolveImage called with dest sample count greater than 1.");
8821
Mike Stroyana3082432015-09-25 13:39:21 -06008822 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008823
Chris Forbesa7530692016-05-08 12:35:39 +12008824 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07008825 VkImage srcImage;
8826 VkImage dstImage;
8827 VkDeviceMemory srcMem;
8828 VkDeviceMemory destMem;
8829 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008830
8831 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008832 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8833 image_create_info.pNext = NULL;
8834 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8835 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8836 image_create_info.extent.width = 32;
8837 image_create_info.extent.height = 1;
8838 image_create_info.extent.depth = 1;
8839 image_create_info.mipLevels = 1;
8840 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +12008841 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07008842 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8843 // Note: Some implementations expect color attachment usage for any
8844 // multisample surface
8845 image_create_info.usage =
8846 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8847 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008848
Karl Schultz6addd812016-02-02 17:17:23 -07008849 err =
8850 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008851 ASSERT_VK_SUCCESS(err);
8852
Karl Schultz6addd812016-02-02 17:17:23 -07008853 // Note: Some implementations expect color attachment usage for any
8854 // multisample surface
8855 image_create_info.usage =
8856 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008857
Karl Schultz6addd812016-02-02 17:17:23 -07008858 err =
8859 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008860 ASSERT_VK_SUCCESS(err);
8861
8862 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008863 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008864 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8865 memAlloc.pNext = NULL;
8866 memAlloc.allocationSize = 0;
8867 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008868
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008869 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008870 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008871 pass =
8872 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008873 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008874 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008875 ASSERT_VK_SUCCESS(err);
8876
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008877 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008878 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008879 pass =
8880 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008881 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008882 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008883 ASSERT_VK_SUCCESS(err);
8884
8885 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8886 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008887 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06008888 ASSERT_VK_SUCCESS(err);
8889
8890 BeginCommandBuffer();
8891 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07008892 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
8893 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06008894 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008895 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008896 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06008897 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008898 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008899 resolveRegion.srcOffset.x = 0;
8900 resolveRegion.srcOffset.y = 0;
8901 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08008902 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008903 resolveRegion.dstSubresource.mipLevel = 0;
8904 resolveRegion.dstSubresource.baseArrayLayer = 0;
8905 resolveRegion.dstSubresource.layerCount = 0;
8906 resolveRegion.dstOffset.x = 0;
8907 resolveRegion.dstOffset.y = 0;
8908 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008909 resolveRegion.extent.width = 1;
8910 resolveRegion.extent.height = 1;
8911 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07008912 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
8913 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06008914 EndCommandBuffer();
8915
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008916 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06008917
Chia-I Wuf7458c52015-10-26 21:10:41 +08008918 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008919 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008920 vkFreeMemory(m_device->device(), srcMem, NULL);
8921 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06008922}
8923
Karl Schultz6addd812016-02-02 17:17:23 -07008924TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
8925 VkResult err;
8926 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06008927
Karl Schultz6addd812016-02-02 17:17:23 -07008928 m_errorMonitor->SetDesiredFailureMsg(
8929 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008930 "vkCmdResolveImage called with unmatched source and dest formats.");
8931
Mike Stroyana3082432015-09-25 13:39:21 -06008932 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06008933
8934 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07008935 VkImage srcImage;
8936 VkImage dstImage;
8937 VkDeviceMemory srcMem;
8938 VkDeviceMemory destMem;
8939 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06008940
8941 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008942 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8943 image_create_info.pNext = NULL;
8944 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8945 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
8946 image_create_info.extent.width = 32;
8947 image_create_info.extent.height = 1;
8948 image_create_info.extent.depth = 1;
8949 image_create_info.mipLevels = 1;
8950 image_create_info.arrayLayers = 1;
8951 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
8952 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8953 // Note: Some implementations expect color attachment usage for any
8954 // multisample surface
8955 image_create_info.usage =
8956 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8957 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008958
Karl Schultz6addd812016-02-02 17:17:23 -07008959 err =
8960 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008961 ASSERT_VK_SUCCESS(err);
8962
Karl Schultz6addd812016-02-02 17:17:23 -07008963 // Set format to something other than source image
8964 image_create_info.format = VK_FORMAT_R32_SFLOAT;
8965 // Note: Some implementations expect color attachment usage for any
8966 // multisample surface
8967 image_create_info.usage =
8968 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8969 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06008970
Karl Schultz6addd812016-02-02 17:17:23 -07008971 err =
8972 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06008973 ASSERT_VK_SUCCESS(err);
8974
8975 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008976 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008977 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8978 memAlloc.pNext = NULL;
8979 memAlloc.allocationSize = 0;
8980 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06008981
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06008982 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008983 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008984 pass =
8985 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008986 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008987 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008988 ASSERT_VK_SUCCESS(err);
8989
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008990 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06008991 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008992 pass =
8993 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06008994 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008995 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06008996 ASSERT_VK_SUCCESS(err);
8997
8998 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
8999 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009000 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009001 ASSERT_VK_SUCCESS(err);
9002
9003 BeginCommandBuffer();
9004 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009005 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9006 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009007 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009008 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009009 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009010 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009011 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009012 resolveRegion.srcOffset.x = 0;
9013 resolveRegion.srcOffset.y = 0;
9014 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009015 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009016 resolveRegion.dstSubresource.mipLevel = 0;
9017 resolveRegion.dstSubresource.baseArrayLayer = 0;
9018 resolveRegion.dstSubresource.layerCount = 0;
9019 resolveRegion.dstOffset.x = 0;
9020 resolveRegion.dstOffset.y = 0;
9021 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009022 resolveRegion.extent.width = 1;
9023 resolveRegion.extent.height = 1;
9024 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009025 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9026 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009027 EndCommandBuffer();
9028
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009029 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009030
Chia-I Wuf7458c52015-10-26 21:10:41 +08009031 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009032 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009033 vkFreeMemory(m_device->device(), srcMem, NULL);
9034 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009035}
9036
Karl Schultz6addd812016-02-02 17:17:23 -07009037TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
9038 VkResult err;
9039 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06009040
Karl Schultz6addd812016-02-02 17:17:23 -07009041 m_errorMonitor->SetDesiredFailureMsg(
9042 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009043 "vkCmdResolveImage called with unmatched source and dest image types.");
9044
Mike Stroyana3082432015-09-25 13:39:21 -06009045 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06009046
9047 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07009048 VkImage srcImage;
9049 VkImage dstImage;
9050 VkDeviceMemory srcMem;
9051 VkDeviceMemory destMem;
9052 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06009053
9054 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009055 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9056 image_create_info.pNext = NULL;
9057 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9058 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
9059 image_create_info.extent.width = 32;
9060 image_create_info.extent.height = 1;
9061 image_create_info.extent.depth = 1;
9062 image_create_info.mipLevels = 1;
9063 image_create_info.arrayLayers = 1;
9064 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
9065 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9066 // Note: Some implementations expect color attachment usage for any
9067 // multisample surface
9068 image_create_info.usage =
9069 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9070 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009071
Karl Schultz6addd812016-02-02 17:17:23 -07009072 err =
9073 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009074 ASSERT_VK_SUCCESS(err);
9075
Karl Schultz6addd812016-02-02 17:17:23 -07009076 image_create_info.imageType = VK_IMAGE_TYPE_1D;
9077 // Note: Some implementations expect color attachment usage for any
9078 // multisample surface
9079 image_create_info.usage =
9080 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9081 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009082
Karl Schultz6addd812016-02-02 17:17:23 -07009083 err =
9084 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06009085 ASSERT_VK_SUCCESS(err);
9086
9087 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009088 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009089 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9090 memAlloc.pNext = NULL;
9091 memAlloc.allocationSize = 0;
9092 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009093
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06009094 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009095 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009096 pass =
9097 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009098 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009099 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009100 ASSERT_VK_SUCCESS(err);
9101
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009102 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06009103 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07009104 pass =
9105 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06009106 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009107 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06009108 ASSERT_VK_SUCCESS(err);
9109
9110 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
9111 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009112 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06009113 ASSERT_VK_SUCCESS(err);
9114
9115 BeginCommandBuffer();
9116 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07009117 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
9118 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06009119 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009120 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06009121 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06009122 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009123 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009124 resolveRegion.srcOffset.x = 0;
9125 resolveRegion.srcOffset.y = 0;
9126 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08009127 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009128 resolveRegion.dstSubresource.mipLevel = 0;
9129 resolveRegion.dstSubresource.baseArrayLayer = 0;
9130 resolveRegion.dstSubresource.layerCount = 0;
9131 resolveRegion.dstOffset.x = 0;
9132 resolveRegion.dstOffset.y = 0;
9133 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06009134 resolveRegion.extent.width = 1;
9135 resolveRegion.extent.height = 1;
9136 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07009137 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
9138 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06009139 EndCommandBuffer();
9140
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009141 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06009142
Chia-I Wuf7458c52015-10-26 21:10:41 +08009143 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009144 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009145 vkFreeMemory(m_device->device(), srcMem, NULL);
9146 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06009147}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009148
Karl Schultz6addd812016-02-02 17:17:23 -07009149TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009150 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07009151 // to using a DS format, then cause it to hit error due to COLOR_BIT not
9152 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009153 // The image format check comes 2nd in validation so we trigger it first,
9154 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07009155 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009156
Karl Schultz6addd812016-02-02 17:17:23 -07009157 m_errorMonitor->SetDesiredFailureMsg(
9158 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009159 "Combination depth/stencil image formats can have only the ");
9160
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009161 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009162
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009163 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009164 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9165 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009166
9167 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009168 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9169 ds_pool_ci.pNext = NULL;
9170 ds_pool_ci.maxSets = 1;
9171 ds_pool_ci.poolSizeCount = 1;
9172 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009173
9174 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009175 err =
9176 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009177 ASSERT_VK_SUCCESS(err);
9178
9179 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009180 dsl_binding.binding = 0;
9181 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9182 dsl_binding.descriptorCount = 1;
9183 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9184 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009185
9186 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009187 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9188 ds_layout_ci.pNext = NULL;
9189 ds_layout_ci.bindingCount = 1;
9190 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009191 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009192 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9193 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009194 ASSERT_VK_SUCCESS(err);
9195
9196 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009197 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009198 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009199 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009200 alloc_info.descriptorPool = ds_pool;
9201 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009202 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9203 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009204 ASSERT_VK_SUCCESS(err);
9205
Karl Schultz6addd812016-02-02 17:17:23 -07009206 VkImage image_bad;
9207 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009208 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07009209 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009210 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07009211 const int32_t tex_width = 32;
9212 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009213
9214 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009215 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9216 image_create_info.pNext = NULL;
9217 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9218 image_create_info.format = tex_format_bad;
9219 image_create_info.extent.width = tex_width;
9220 image_create_info.extent.height = tex_height;
9221 image_create_info.extent.depth = 1;
9222 image_create_info.mipLevels = 1;
9223 image_create_info.arrayLayers = 1;
9224 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9225 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9226 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
9227 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
9228 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009229
Karl Schultz6addd812016-02-02 17:17:23 -07009230 err =
9231 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009232 ASSERT_VK_SUCCESS(err);
9233 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07009234 image_create_info.usage =
9235 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9236 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
9237 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009238 ASSERT_VK_SUCCESS(err);
9239
9240 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009241 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9242 image_view_create_info.image = image_bad;
9243 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
9244 image_view_create_info.format = tex_format_bad;
9245 image_view_create_info.subresourceRange.baseArrayLayer = 0;
9246 image_view_create_info.subresourceRange.baseMipLevel = 0;
9247 image_view_create_info.subresourceRange.layerCount = 1;
9248 image_view_create_info.subresourceRange.levelCount = 1;
9249 image_view_create_info.subresourceRange.aspectMask =
9250 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009251
9252 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07009253 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
9254 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009255
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009256 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009257
Chia-I Wuf7458c52015-10-26 21:10:41 +08009258 vkDestroyImage(m_device->device(), image_bad, NULL);
9259 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08009260 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9261 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009262}
Tobin Ehliscde08892015-09-22 10:11:37 -06009263#endif // IMAGE_TESTS
9264
Tony Barbour300a6082015-04-07 13:44:53 -06009265int main(int argc, char **argv) {
9266 int result;
9267
Cody Northrop8e54a402016-03-08 22:25:52 -07009268#ifdef ANDROID
9269 int vulkanSupport = InitVulkan();
9270 if (vulkanSupport == 0)
9271 return 1;
9272#endif
9273
Tony Barbour300a6082015-04-07 13:44:53 -06009274 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06009275 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06009276
9277 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
9278
9279 result = RUN_ALL_TESTS();
9280
Tony Barbour6918cd52015-04-09 12:58:51 -06009281 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06009282 return result;
9283}