blob: 314d3c3dcc75dffa9e9dc6a0c8db883819a70758 [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 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and/or associated documentation files (the "Materials"), to
9 * deal in the Materials without restriction, including without limitation the
10 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
11 * sell copies of the Materials, and to permit persons to whom the Materials are
12 * furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice(s) and this permission notice shall be included in
15 * all copies or substantial portions of the Materials.
16 *
Karl Schultz6addd812016-02-02 17:17:23 -070017 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 *
21 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
24 * USE OR OTHER DEALINGS IN THE MATERIALS.
25 *
26 * Author: Chia-I Wu <olvaffe@gmail.com>
27 * Author: Chris Forbes <chrisf@ijw.co.nz>
28 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
29 * Author: Mark Lobodzinski <mark@lunarg.com>
30 * Author: Mike Stroyan <mike@LunarG.com>
31 * Author: Tobin Ehlis <tobine@google.com>
32 * Author: Tony Barbour <tony@LunarG.com>
33 */
Tony Barbour65c48b32015-11-17 10:02:56 -070034
David Pinedo9316d3b2015-11-06 12:54:48 -070035#include <vulkan/vulkan.h>
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060036#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060037#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060038#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070039#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060040
Mark Lobodzinski3780e142015-05-14 15:08:13 -050041#define GLM_FORCE_RADIANS
42#include "glm/glm.hpp"
43#include <glm/gtc/matrix_transform.hpp>
44
Tobin Ehlis0788f522015-05-26 16:11:58 -060045#define MEM_TRACKER_TESTS 1
46#define OBJ_TRACKER_TESTS 1
47#define DRAW_STATE_TESTS 1
48#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120049#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060050#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060051#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060052
Mark Lobodzinski3780e142015-05-14 15:08:13 -050053//--------------------------------------------------------------------------------------
54// Mesh and VertexFormat Data
55//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070056struct Vertex {
57 float posX, posY, posZ, posW; // Position data
58 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050059};
60
Karl Schultz6addd812016-02-02 17:17:23 -070061#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050062
63typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070064 BsoFailNone = 0x00000000,
65 BsoFailLineWidth = 0x00000001,
66 BsoFailDepthBias = 0x00000002,
67 BsoFailViewport = 0x00000004,
68 BsoFailScissor = 0x00000008,
69 BsoFailBlend = 0x00000010,
70 BsoFailDepthBounds = 0x00000020,
71 BsoFailStencilReadMask = 0x00000040,
72 BsoFailStencilWriteMask = 0x00000080,
73 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050074} BsoFailSelect;
75
76struct vktriangle_vs_uniform {
77 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070078 float mvp[4][4];
79 float position[3][4];
80 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050081};
82
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050083static const char bindStateVertShaderText[] =
Karl Schultz6addd812016-02-02 17:17:23 -070084 "#version 400\n"
85 "#extension GL_ARB_separate_shader_objects : require\n"
86 "#extension GL_ARB_shading_language_420pack : require\n"
87 "vec2 vertices[3];\n"
88 "out gl_PerVertex {\n"
89 " vec4 gl_Position;\n"
90 "};\n"
91 "void main() {\n"
92 " vertices[0] = vec2(-1.0, -1.0);\n"
93 " vertices[1] = vec2( 1.0, -1.0);\n"
94 " vertices[2] = vec2( 0.0, 1.0);\n"
95 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
96 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050097
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050098static const char bindStateFragShaderText[] =
Karl Schultz6addd812016-02-02 17:17:23 -070099 "#version 400\n"
100 "#extension GL_ARB_separate_shader_objects: require\n"
101 "#extension GL_ARB_shading_language_420pack: require\n"
102 "\n"
103 "layout(location = 0) out vec4 uFragColor;\n"
104 "void main(){\n"
105 " uFragColor = vec4(0,1,0,1);\n"
106 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500107
Karl Schultz6addd812016-02-02 17:17:23 -0700108static VKAPI_ATTR VkBool32 VKAPI_CALL
109myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
110 uint64_t srcObject, size_t location, int32_t msgCode,
111 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -0600112
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600113// ********************************************************
114// ErrorMonitor Usage:
115//
116// Call SetDesiredFailureMsg with a string to be compared against all
117// encountered log messages. Passing NULL will match all log messages.
118// logMsg will return true for skipCall only if msg is matched or NULL.
119//
120// Call DesiredMsgFound to determine if the desired failure message
121// was encountered.
122
Tony Barbour300a6082015-04-07 13:44:53 -0600123class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700124 public:
125 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600126 test_platform_thread_create_mutex(&m_mutex);
127 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700128 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700129 m_bailout = NULL;
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 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600134 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600135 m_desiredMsg.clear();
136 m_failureMsg.clear();
137 m_otherMsgs.clear();
138 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700139 m_msgFound = VK_FALSE;
140 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600141 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600142 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600143
Karl Schultz6addd812016-02-02 17:17:23 -0700144 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600145 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600146 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600147 if (m_bailout != NULL) {
148 *m_bailout = true;
149 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600150 string errorString(msgString);
151 if (msgFlags & m_msgFlags) {
152 if (errorString.find(m_desiredMsg) != string::npos) {
153 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700154 m_msgFound = VK_TRUE;
155 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600156 } else {
157 m_otherMsgs.push_back(errorString);
158 }
159 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600160 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600162 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600163
Karl Schultz6addd812016-02-02 17:17:23 -0700164 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165
Karl Schultz6addd812016-02-02 17:17:23 -0700166 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600167
Karl Schultz6addd812016-02-02 17:17:23 -0700168 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600169
Karl Schultz6addd812016-02-02 17:17:23 -0700170 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600171
Karl Schultz6addd812016-02-02 17:17:23 -0700172 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600173 vector<string> otherMsgs = GetOtherFailureMsgs();
174 cout << "Other error messages logged for this test were:" << endl;
175 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
176 cout << " " << *iter << endl;
177 }
178 }
179
Karl Schultz6addd812016-02-02 17:17:23 -0700180 private:
181 VkFlags m_msgFlags;
182 string m_desiredMsg;
183 string m_failureMsg;
184 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600185 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700186 bool *m_bailout;
187 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600188};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500189
Karl Schultz6addd812016-02-02 17:17:23 -0700190static VKAPI_ATTR VkBool32 VKAPI_CALL
191myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
192 uint64_t srcObject, size_t location, int32_t msgCode,
193 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
194 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700195 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700196 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600197 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600198 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600199 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600200 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600201}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500202
Karl Schultz6addd812016-02-02 17:17:23 -0700203class VkLayerTest : public VkRenderFramework {
204 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800205 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
206 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700207 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
208 BsoFailSelect failMask);
209 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
210 VkPipelineObj &pipelineobj,
211 VkDescriptorSetObj &descriptorSet,
212 BsoFailSelect failMask);
213 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
214 VkDescriptorSetObj &descriptorSet,
215 BsoFailSelect failMask) {
216 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
217 failMask);
218 }
Tony Barbour300a6082015-04-07 13:44:53 -0600219
Tony Barbourfe3351b2015-07-28 10:17:20 -0600220 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700221 VkResult BeginCommandBuffer() {
222 return BeginCommandBuffer(*m_commandBuffer);
223 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800224 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700225 void Draw(uint32_t vertexCount, uint32_t instanceCount,
226 uint32_t firstVertex, uint32_t firstInstance) {
227 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
228 firstInstance);
229 }
230 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
231 uint32_t firstIndex, int32_t vertexOffset,
232 uint32_t firstInstance) {
233 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
234 vertexOffset, firstInstance);
235 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800236 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700237 void QueueCommandBuffer(const VkFence &fence) {
238 m_commandBuffer->QueueCommandBuffer(fence);
239 }
240 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
241 VkDeviceSize offset, uint32_t binding) {
242 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
243 }
244 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
245 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
246 }
247
248 protected:
249 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600250
251 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600252 std::vector<const char *> instance_layer_names;
253 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600254 std::vector<const char *> instance_extension_names;
255 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600256
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700257 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600258 /*
259 * Since CreateDbgMsgCallback is an instance level extension call
260 * any extension / layer that utilizes that feature also needs
261 * to be enabled at create instance time.
262 */
Karl Schultz6addd812016-02-02 17:17:23 -0700263 // Use Threading layer first to protect others from
264 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700265 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Michael Lentine03107b42015-12-11 10:49:51 -0800266 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
267 instance_layer_names.push_back("VK_LAYER_LUNARG_mem_tracker");
268 instance_layer_names.push_back("VK_LAYER_LUNARG_draw_state");
269 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
270 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700271 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600272
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700273 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Michael Lentine03107b42015-12-11 10:49:51 -0800274 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
275 device_layer_names.push_back("VK_LAYER_LUNARG_mem_tracker");
276 device_layer_names.push_back("VK_LAYER_LUNARG_draw_state");
277 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
278 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700279 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600280
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600281 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600282 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800283 this->app_info.pApplicationName = "layer_tests";
284 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600285 this->app_info.pEngineName = "unittest";
286 this->app_info.engineVersion = 1;
Tony Barbouraabb3592016-02-25 13:58:50 -0700287 this->app_info.apiVersion = VK_MAKE_VERSION(1, 0, 0);
Tony Barbour300a6082015-04-07 13:44:53 -0600288
Tony Barbour15524c32015-04-29 17:34:29 -0600289 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600290 InitFramework(instance_layer_names, device_layer_names,
291 instance_extension_names, device_extension_names,
292 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600293 }
294
295 virtual void TearDown() {
296 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600297 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600298 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600299 }
300};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500301
Karl Schultz6addd812016-02-02 17:17:23 -0700302VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600303 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600304
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800305 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600306
307 /*
308 * For render test all drawing happens in a single render pass
309 * on a single command buffer.
310 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200311 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800312 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600313 }
314
315 return result;
316}
317
Karl Schultz6addd812016-02-02 17:17:23 -0700318VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600319 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600320
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200321 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800322 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200323 }
Tony Barbour300a6082015-04-07 13:44:53 -0600324
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800325 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600326
327 return result;
328}
329
Karl Schultz6addd812016-02-02 17:17:23 -0700330void VkLayerTest::VKTriangleTest(const char *vertShaderText,
331 const char *fragShaderText,
332 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500333 // Create identity matrix
334 int i;
335 struct vktriangle_vs_uniform data;
336
337 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700338 glm::mat4 View = glm::mat4(1.0f);
339 glm::mat4 Model = glm::mat4(1.0f);
340 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500341 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700342 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500343
344 memcpy(&data.mvp, &MVP[0][0], matrixSize);
345
Karl Schultz6addd812016-02-02 17:17:23 -0700346 static const Vertex tri_data[] = {
347 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
348 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
349 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500350 };
351
Karl Schultz6addd812016-02-02 17:17:23 -0700352 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500353 data.position[i][0] = tri_data[i].posX;
354 data.position[i][1] = tri_data[i].posY;
355 data.position[i][2] = tri_data[i].posZ;
356 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700357 data.color[i][0] = tri_data[i].r;
358 data.color[i][1] = tri_data[i].g;
359 data.color[i][2] = tri_data[i].b;
360 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500361 }
362
363 ASSERT_NO_FATAL_FAILURE(InitState());
364 ASSERT_NO_FATAL_FAILURE(InitViewport());
365
Karl Schultz6addd812016-02-02 17:17:23 -0700366 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
367 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500368
Karl Schultz6addd812016-02-02 17:17:23 -0700369 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
370 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
371 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500372
373 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800374 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500375 pipelineobj.AddShader(&vs);
376 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600377 if (failMask & BsoFailLineWidth) {
378 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
379 }
380 if (failMask & BsoFailDepthBias) {
381 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
382 }
Karl Schultz6addd812016-02-02 17:17:23 -0700383 // Viewport and scissors must stay in synch or other errors will occur than
384 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600385 if (failMask & BsoFailViewport) {
386 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600387 m_viewports.clear();
388 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600389 }
390 if (failMask & BsoFailScissor) {
391 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600392 m_scissors.clear();
393 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600394 }
395 if (failMask & BsoFailBlend) {
396 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
397 }
398 if (failMask & BsoFailDepthBounds) {
399 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
400 }
401 if (failMask & BsoFailStencilReadMask) {
402 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
403 }
404 if (failMask & BsoFailStencilWriteMask) {
405 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
406 }
407 if (failMask & BsoFailStencilReference) {
408 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
409 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500410
411 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700412 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
413 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500414
415 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600416 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500417
Tony Barbourfe3351b2015-07-28 10:17:20 -0600418 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500419
420 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600421 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500422
423 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600424 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500425
Tony Barbourfe3351b2015-07-28 10:17:20 -0600426 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500427}
428
Karl Schultz6addd812016-02-02 17:17:23 -0700429void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
430 VkPipelineObj &pipelineobj,
431 VkDescriptorSetObj &descriptorSet,
432 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500433 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700434 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
435 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500436 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700437 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
438 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500439 }
440
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800441 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700442 // Make sure depthWriteEnable is set so that Depth fail test will work
443 // correctly
444 // Make sure stencilTestEnable is set so that Stencil fail test will work
445 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600446 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800447 stencil.failOp = VK_STENCIL_OP_KEEP;
448 stencil.passOp = VK_STENCIL_OP_KEEP;
449 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
450 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600451
452 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
453 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600454 ds_ci.pNext = NULL;
455 ds_ci.depthTestEnable = VK_FALSE;
456 ds_ci.depthWriteEnable = VK_TRUE;
457 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
458 ds_ci.depthBoundsTestEnable = VK_FALSE;
459 ds_ci.stencilTestEnable = VK_TRUE;
460 ds_ci.front = stencil;
461 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600462
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600463 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600464 pipelineobj.SetViewport(m_viewports);
465 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800466 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700467 VkResult err = pipelineobj.CreateVKPipeline(
468 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600469 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800470 commandBuffer->BindPipeline(pipelineobj);
471 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500472}
473
474// ********************************************************************************************************************
475// ********************************************************************************************************************
476// ********************************************************************************************************************
477// ********************************************************************************************************************
Tobin Ehlis0788f522015-05-26 16:11:58 -0600478#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700479#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800480TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500481{
482 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500483 VkFenceCreateInfo fenceInfo = {};
484 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
485 fenceInfo.pNext = NULL;
486 fenceInfo.flags = 0;
487
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600489
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500490 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600491
492 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
493 vk_testing::Buffer buffer;
494 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500495
Tony Barbourfe3351b2015-07-28 10:17:20 -0600496 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800497 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600498 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500499
500 testFence.init(*m_device, fenceInfo);
501
502 // Bypass framework since it does the waits automatically
503 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600504 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800505 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
506 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800507 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600508 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700509 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800510 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800511 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800512 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600513 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600514
515 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500516 ASSERT_VK_SUCCESS( err );
517
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500518 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800519 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500520
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600521 if (!m_errorMonitor->DesiredMsgFound()) {
522 FAIL() << "Did not receive Error 'Resetting CB (0xaddress) before it has completed. You must check CB flag before.'";
523 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500524 }
525}
526
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800527TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500528{
529 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500530 VkFenceCreateInfo fenceInfo = {};
531 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
532 fenceInfo.pNext = NULL;
533 fenceInfo.flags = 0;
534
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600536
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500537 ASSERT_NO_FATAL_FAILURE(InitState());
538 ASSERT_NO_FATAL_FAILURE(InitViewport());
539 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
540
Tony Barbourfe3351b2015-07-28 10:17:20 -0600541 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800542 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600543 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500544
545 testFence.init(*m_device, fenceInfo);
546
547 // Bypass framework since it does the waits automatically
548 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600549 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800550 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
551 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800552 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600553 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700554 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800555 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800556 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800557 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600558 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600559
560 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500561 ASSERT_VK_SUCCESS( err );
562
Jon Ashburnf19916e2016-01-11 13:12:43 -0700563 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800564 VkCommandBufferBeginInfo info = {};
565 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
566 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600567 info.renderPass = VK_NULL_HANDLE;
568 info.subpass = 0;
569 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800570 info.occlusionQueryEnable = VK_FALSE;
571 info.queryFlags = 0;
572 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600573
574 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800575 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500576
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600577 if (!m_errorMonitor->DesiredMsgFound()) {
578 FAIL() << "Did not receive Error 'Calling vkBeginCommandBuffer() on an active CB (0xaddress) before it has completed'";
579 m_errorMonitor->DumpFailureMsgs();
580
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500581 }
582}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700583#endif
Karl Schultz6addd812016-02-02 17:17:23 -0700584TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
585 VkResult err;
586 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500587
Karl Schultz6addd812016-02-02 17:17:23 -0700588 m_errorMonitor->SetDesiredFailureMsg(
589 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600590 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
591
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500592 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500593
594 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700595 VkImage image;
596 VkDeviceMemory mem;
597 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500598
Karl Schultz6addd812016-02-02 17:17:23 -0700599 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
600 const int32_t tex_width = 32;
601 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500602
Tony Barboureb254902015-07-15 12:50:33 -0600603 VkImageCreateInfo image_create_info = {};
604 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700605 image_create_info.pNext = NULL;
606 image_create_info.imageType = VK_IMAGE_TYPE_2D;
607 image_create_info.format = tex_format;
608 image_create_info.extent.width = tex_width;
609 image_create_info.extent.height = tex_height;
610 image_create_info.extent.depth = 1;
611 image_create_info.mipLevels = 1;
612 image_create_info.arrayLayers = 1;
613 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
614 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
615 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
616 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600617
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800618 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800619 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700620 mem_alloc.pNext = NULL;
621 mem_alloc.allocationSize = 0;
622 // Introduce failure, do NOT set memProps to
623 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
624 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500625
Chia-I Wuf7458c52015-10-26 21:10:41 +0800626 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500627 ASSERT_VK_SUCCESS(err);
628
Karl Schultz6addd812016-02-02 17:17:23 -0700629 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500630
Mark Lobodzinski23065352015-05-29 09:32:35 -0500631 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500632
Karl Schultz6addd812016-02-02 17:17:23 -0700633 pass =
634 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
635 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
636 if (!pass) { // If we can't find any unmappable memory this test doesn't
637 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +0800638 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -0600639 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -0600640 }
Mike Stroyan713b2d72015-08-04 10:49:29 -0600641
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500642 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800643 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500644 ASSERT_VK_SUCCESS(err);
645
646 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -0600647 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500648 ASSERT_VK_SUCCESS(err);
649
650 // Map memory as if to initialize the image
651 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -0700652 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
653 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500654
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600655 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700656 FAIL() << "Did not receive Error 'Error received did not match "
657 "expected error message from vkMapMemory in MemTracker'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600658 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500659 }
Mike Stroyand1c84a52015-08-18 14:40:24 -0600660
Chia-I Wuf7458c52015-10-26 21:10:41 +0800661 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500662}
663
Karl Schultz6addd812016-02-02 17:17:23 -0700664// TODO : Is this test still valid. Not sure it is with updates to memory
665// binding model
Tobin Ehlis2717d132015-07-10 18:25:07 -0600666// Verify and delete the test of fix the check
Karl Schultz6addd812016-02-02 17:17:23 -0700667// TEST_F(VkLayerTest, FreeBoundMemory)
Tobin Ehlis2717d132015-07-10 18:25:07 -0600668//{
Tobin Ehlis2717d132015-07-10 18:25:07 -0600669// VkResult err;
670//
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700671// m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600672// "Freeing memory object while it still has references");
Tobin Ehlis2717d132015-07-10 18:25:07 -0600673//
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600674// ASSERT_NO_FATAL_FAILURE(InitState());
675
Tobin Ehlis2717d132015-07-10 18:25:07 -0600676// // Create an image, allocate memory, free it, and then try to bind it
677// VkImage image;
678// VkDeviceMemory mem;
679// VkMemoryRequirements mem_reqs;
680//
681// const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
682// const int32_t tex_width = 32;
683// const int32_t tex_height = 32;
684//
685// const VkImageCreateInfo image_create_info = {
686// .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
687// .pNext = NULL,
688// .imageType = VK_IMAGE_TYPE_2D,
689// .format = tex_format,
690// .extent = { tex_width, tex_height, 1 },
691// .mipLevels = 1,
692// .arraySize = 1,
Chia-I Wu5c17c962015-10-31 00:31:16 +0800693// .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlis2717d132015-07-10 18:25:07 -0600694// .tiling = VK_IMAGE_TILING_LINEAR,
695// .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
696// .flags = 0,
697// };
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800698// VkMemoryAllocateInfo mem_alloc = {
Chia-I Wu00ce5402015-11-10 16:21:09 +0800699// .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
Tobin Ehlis2717d132015-07-10 18:25:07 -0600700// .pNext = NULL,
701// .allocationSize = 0,
702// .memoryTypeIndex = 0,
703// };
704//
Chia-I Wuf7458c52015-10-26 21:10:41 +0800705// err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis2717d132015-07-10 18:25:07 -0600706// ASSERT_VK_SUCCESS(err);
707//
708// err = vkGetImageMemoryRequirements(m_device->device(),
709// image,
710// &mem_reqs);
711// ASSERT_VK_SUCCESS(err);
712//
713// mem_alloc.allocationSize = mem_reqs.size;
714//
Karl Schultz6addd812016-02-02 17:17:23 -0700715// err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
716// 0);
Tobin Ehlis2717d132015-07-10 18:25:07 -0600717// ASSERT_VK_SUCCESS(err);
718//
719// // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800720// err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis2717d132015-07-10 18:25:07 -0600721// ASSERT_VK_SUCCESS(err);
722//
723// // Bind memory to Image object
724// err = vkBindImageMemory(m_device->device(), image, mem, 0);
725// ASSERT_VK_SUCCESS(err);
726//
727// // Introduce validation failure, free memory while still bound to object
Chia-I Wuf7458c52015-10-26 21:10:41 +0800728// vkFreeMemory(m_device->device(), mem, NULL);
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600729//
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600730// if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700731// FAIL() << "Did not receive Warning 'Freeing memory object while it
732// still has references'");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600733// m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis2717d132015-07-10 18:25:07 -0600734// }
735//}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500736
Karl Schultz6addd812016-02-02 17:17:23 -0700737TEST_F(VkLayerTest, RebindMemory) {
738 VkResult err;
739 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500740
Karl Schultz6addd812016-02-02 17:17:23 -0700741 m_errorMonitor->SetDesiredFailureMsg(
742 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600743 "which has already been bound to mem object");
744
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500745 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500746
747 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700748 VkImage image;
749 VkDeviceMemory mem1;
750 VkDeviceMemory mem2;
751 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500752
Karl Schultz6addd812016-02-02 17:17:23 -0700753 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
754 const int32_t tex_width = 32;
755 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500756
Tony Barboureb254902015-07-15 12:50:33 -0600757 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700758 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
759 image_create_info.pNext = NULL;
760 image_create_info.imageType = VK_IMAGE_TYPE_2D;
761 image_create_info.format = tex_format;
762 image_create_info.extent.width = tex_width;
763 image_create_info.extent.height = tex_height;
764 image_create_info.extent.depth = 1;
765 image_create_info.mipLevels = 1;
766 image_create_info.arrayLayers = 1;
767 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
768 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
769 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
770 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500771
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800772 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700773 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
774 mem_alloc.pNext = NULL;
775 mem_alloc.allocationSize = 0;
776 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -0600777
Karl Schultz6addd812016-02-02 17:17:23 -0700778 // Introduce failure, do NOT set memProps to
779 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -0600780 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800781 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500782 ASSERT_VK_SUCCESS(err);
783
Karl Schultz6addd812016-02-02 17:17:23 -0700784 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500785
786 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -0700787 pass =
788 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -0600789 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500790
791 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800792 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500793 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800794 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500795 ASSERT_VK_SUCCESS(err);
796
797 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -0600798 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500799 ASSERT_VK_SUCCESS(err);
800
Karl Schultz6addd812016-02-02 17:17:23 -0700801 // Introduce validation failure, try to bind a different memory object to
802 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -0600803 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500804
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600805 if (!m_errorMonitor->DesiredMsgFound()) {
806 FAIL() << "Did not receive Error when rebinding memory to an object";
807 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500808 }
Mike Stroyand1c84a52015-08-18 14:40:24 -0600809
Chia-I Wuf7458c52015-10-26 21:10:41 +0800810 vkDestroyImage(m_device->device(), image, NULL);
811 vkFreeMemory(m_device->device(), mem1, NULL);
812 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500813}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500814
Karl Schultz6addd812016-02-02 17:17:23 -0700815TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600816 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600817
Karl Schultz6addd812016-02-02 17:17:23 -0700818 m_errorMonitor->SetDesiredFailureMsg(
819 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
820 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600821
822 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600823 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
824 fenceInfo.pNext = NULL;
825 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -0600826
Tony Barbour300a6082015-04-07 13:44:53 -0600827 ASSERT_NO_FATAL_FAILURE(InitState());
828 ASSERT_NO_FATAL_FAILURE(InitViewport());
829 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
830
Tony Barbourfe3351b2015-07-28 10:17:20 -0600831 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700832 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
833 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600834 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600835
836 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600837
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600838 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800839 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
840 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800841 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600842 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700843 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800844 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800845 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800846 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600847 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600848
849 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -0700850 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600851
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600852 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700853 FAIL() << "Did not receive Error 'VkQueueSubmit with fence in "
854 "SIGNALED_STATE'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600855 m_errorMonitor->DumpFailureMsgs();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600856 }
Tony Barbour0b4d9562015-04-09 10:48:04 -0600857}
858
Karl Schultz6addd812016-02-02 17:17:23 -0700859TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600860 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600861 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600862 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
863 fenceInfo.pNext = NULL;
864
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700865 // TODO: verify that this matches layer
Karl Schultz6addd812016-02-02 17:17:23 -0700866 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700867 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600868 "submitted to VkResetFences in UNSIGNALED STATE");
869
Tony Barbour0b4d9562015-04-09 10:48:04 -0600870 ASSERT_NO_FATAL_FAILURE(InitState());
871 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +0800872 VkFence fences[1] = {testFence.handle()};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600873 vkResetFences(m_device->device(), 1, fences);
Tony Barbour300a6082015-04-07 13:44:53 -0600874
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600875 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700876 FAIL() << "Did not receive Error 'VkResetFences with fence in "
877 "UNSIGNALED_STATE'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600878 m_errorMonitor->DumpFailureMsgs();
879 }
Tony Barbour300a6082015-04-07 13:44:53 -0600880}
Tobin Ehlis41376e12015-07-03 08:45:14 -0600881
Chia-I Wu08accc62015-07-07 11:50:03 +0800882/* TODO: Update for changes due to bug-14075 tiling across render passes */
883#if 0
Tobin Ehlis41376e12015-07-03 08:45:14 -0600884TEST_F(VkLayerTest, InvalidUsageBits)
885{
886 // Initiate Draw w/o a PSO bound
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600887
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600889 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -0600890
891 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800892 VkCommandBufferObj commandBuffer(m_device);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600893 BeginCommandBuffer();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600894
895 const VkExtent3D e3d = {
896 .width = 128,
897 .height = 128,
898 .depth = 1,
899 };
900 const VkImageCreateInfo ici = {
901 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
902 .pNext = NULL,
903 .imageType = VK_IMAGE_TYPE_2D,
904 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
905 .extent = e3d,
906 .mipLevels = 1,
907 .arraySize = 1,
Chia-I Wu5c17c962015-10-31 00:31:16 +0800908 .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600909 .tiling = VK_IMAGE_TILING_LINEAR,
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600910 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
Tobin Ehlis41376e12015-07-03 08:45:14 -0600911 .flags = 0,
912 };
913
914 VkImage dsi;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800915 vkCreateImage(m_device->device(), &ici, NULL, &dsi);
Tobin Ehlis41376e12015-07-03 08:45:14 -0600916 VkDepthStencilView dsv;
917 const VkDepthStencilViewCreateInfo dsvci = {
918 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
919 .pNext = NULL,
920 .image = dsi,
921 .mipLevel = 0,
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -0600922 .baseArrayLayer = 0,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600923 .arraySize = 1,
924 .flags = 0,
925 };
Chia-I Wuf7458c52015-10-26 21:10:41 +0800926 vkCreateDepthStencilView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600927
928 if (!m_errorMonitor->DesiredMsgFound()) {
Tobin Ehlis41376e12015-07-03 08:45:14 -0600929 FAIL() << "Error received was not 'Invalid usage flag for image...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600930 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600931 }
932}
Mark Lobodzinski209b5292015-09-17 09:44:05 -0600933#endif // 0
934#endif // MEM_TRACKER_TESTS
935
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600936#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -0700937TEST_F(VkLayerTest, PipelineNotBound) {
938 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600939
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -0700941 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600942
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600943 ASSERT_NO_FATAL_FAILURE(InitState());
944 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600945
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800946 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700947 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
948 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600949
950 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700951 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
952 ds_pool_ci.pNext = NULL;
953 ds_pool_ci.maxSets = 1;
954 ds_pool_ci.poolSizeCount = 1;
955 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600956
957 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -0700958 err =
959 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600960 ASSERT_VK_SUCCESS(err);
961
962 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700963 dsl_binding.binding = 0;
964 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
965 dsl_binding.descriptorCount = 1;
966 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
967 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600968
969 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700970 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
971 ds_layout_ci.pNext = NULL;
972 ds_layout_ci.bindingCount = 1;
973 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600974
975 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700976 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
977 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600978 ASSERT_VK_SUCCESS(err);
979
980 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800981 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800982 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -0700983 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -0600984 alloc_info.descriptorPool = ds_pool;
985 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700986 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
987 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600988 ASSERT_VK_SUCCESS(err);
989
990 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700991 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
992 pipeline_layout_ci.pNext = NULL;
993 pipeline_layout_ci.setLayoutCount = 1;
994 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600995
996 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700997 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
998 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600999 ASSERT_VK_SUCCESS(err);
1000
Mark Youngad779052016-01-06 14:26:04 -07001001 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001002
1003 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001004 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1005 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001006
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001007 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001008 FAIL()
1009 << "Error received was not 'Invalid VkPipeline Object 0xbaadb1be'"
1010 << endl;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001011 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisec598302015-09-15 15:02:17 -06001012 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06001013
Chia-I Wuf7458c52015-10-26 21:10:41 +08001014 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1015 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1016 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001017}
1018
Karl Schultz6addd812016-02-02 17:17:23 -07001019TEST_F(VkLayerTest, BindInvalidMemory) {
1020 VkResult err;
1021 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001022
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001024 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001025
Tobin Ehlisec598302015-09-15 15:02:17 -06001026 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001027
1028 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001029 VkImage image;
1030 VkDeviceMemory mem;
1031 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001032
Karl Schultz6addd812016-02-02 17:17:23 -07001033 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1034 const int32_t tex_width = 32;
1035 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001036
1037 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001038 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1039 image_create_info.pNext = NULL;
1040 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1041 image_create_info.format = tex_format;
1042 image_create_info.extent.width = tex_width;
1043 image_create_info.extent.height = tex_height;
1044 image_create_info.extent.depth = 1;
1045 image_create_info.mipLevels = 1;
1046 image_create_info.arrayLayers = 1;
1047 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1048 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1049 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1050 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001051
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001052 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001053 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1054 mem_alloc.pNext = NULL;
1055 mem_alloc.allocationSize = 0;
1056 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001057
Chia-I Wuf7458c52015-10-26 21:10:41 +08001058 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001059 ASSERT_VK_SUCCESS(err);
1060
Karl Schultz6addd812016-02-02 17:17:23 -07001061 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001062
1063 mem_alloc.allocationSize = mem_reqs.size;
1064
Karl Schultz6addd812016-02-02 17:17:23 -07001065 pass =
1066 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001067 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001068
1069 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001070 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001071 ASSERT_VK_SUCCESS(err);
1072
1073 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001074 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001075
1076 // Try to bind free memory that has been freed
1077 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1078 // This may very well return an error.
1079 (void)err;
1080
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001081 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001082 FAIL() << "Did not receive Error 'Invalid VkDeviceMemory Object "
1083 "0x<handle>'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001084 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisec598302015-09-15 15:02:17 -06001085 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06001086
Chia-I Wuf7458c52015-10-26 21:10:41 +08001087 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001088}
1089
Karl Schultz6addd812016-02-02 17:17:23 -07001090TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1091 VkResult err;
1092 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001093
Karl Schultz6addd812016-02-02 17:17:23 -07001094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1095 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001096
Tobin Ehlisec598302015-09-15 15:02:17 -06001097 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001098
Karl Schultz6addd812016-02-02 17:17:23 -07001099 // Create an image object, allocate memory, destroy the object and then try
1100 // to bind it
1101 VkImage image;
1102 VkDeviceMemory mem;
1103 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001104
Karl Schultz6addd812016-02-02 17:17:23 -07001105 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1106 const int32_t tex_width = 32;
1107 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001108
1109 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001110 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1111 image_create_info.pNext = NULL;
1112 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1113 image_create_info.format = tex_format;
1114 image_create_info.extent.width = tex_width;
1115 image_create_info.extent.height = tex_height;
1116 image_create_info.extent.depth = 1;
1117 image_create_info.mipLevels = 1;
1118 image_create_info.arrayLayers = 1;
1119 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1120 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1121 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1122 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001123
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001124 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001125 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1126 mem_alloc.pNext = NULL;
1127 mem_alloc.allocationSize = 0;
1128 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001129
Chia-I Wuf7458c52015-10-26 21:10:41 +08001130 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001131 ASSERT_VK_SUCCESS(err);
1132
Karl Schultz6addd812016-02-02 17:17:23 -07001133 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001134
1135 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001136 pass =
1137 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001138 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001139
1140 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001141 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001142 ASSERT_VK_SUCCESS(err);
1143
1144 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001145 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001146 ASSERT_VK_SUCCESS(err);
1147
1148 // Now Try to bind memory to this destroyed object
1149 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1150 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001151 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001152
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001153 if (!m_errorMonitor->DesiredMsgFound()) {
1154 FAIL() << "Did not receive Error 'Invalid VkImage Object 0x<handle>'";
1155 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001156 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06001157
Chia-I Wuf7458c52015-10-26 21:10:41 +08001158 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001159}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001160
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001161#endif // OBJ_TRACKER_TESTS
1162
Tobin Ehlis0788f522015-05-26 16:11:58 -06001163#if DRAW_STATE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07001164TEST_F(VkLayerTest, LineWidthStateNotBound) {
1165 m_errorMonitor->SetDesiredFailureMsg(
1166 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001167 "Dynamic line width state not set for this command buffer");
1168
Karl Schultz6addd812016-02-02 17:17:23 -07001169 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line "
1170 "width state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001171
Karl Schultz6addd812016-02-02 17:17:23 -07001172 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1173 BsoFailLineWidth);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001174
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001175 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001176 FAIL() << "Did not receive Error 'Dynamic line width state not set for "
1177 "this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001178 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001179 }
1180}
1181
Karl Schultz6addd812016-02-02 17:17:23 -07001182TEST_F(VkLayerTest, DepthBiasStateNotBound) {
1183 m_errorMonitor->SetDesiredFailureMsg(
1184 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001185 "Dynamic depth bias state not set for this command buffer");
1186
Karl Schultz6addd812016-02-02 17:17:23 -07001187 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1188 "bias state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001189
Karl Schultz6addd812016-02-02 17:17:23 -07001190 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1191 BsoFailDepthBias);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001192
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001193 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001194 FAIL() << "Did not receive Error 'Dynamic depth bias state not set for "
1195 "this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001196 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001197 }
1198}
1199
Karl Schultz6addd812016-02-02 17:17:23 -07001200// Disable these two tests until we can sort out how to track multiple layer
1201// errors
1202TEST_F(VkLayerTest, ViewportStateNotBound) {
1203 m_errorMonitor->SetDesiredFailureMsg(
1204 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001205 "Dynamic viewport state not set for this command buffer");
1206
Karl Schultz6addd812016-02-02 17:17:23 -07001207 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1208 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001209
Karl Schultz6addd812016-02-02 17:17:23 -07001210 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1211 BsoFailViewport);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001212
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001213 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001214 FAIL() << "Did not recieve Error 'Dynamic scissor state not set for "
1215 "this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001216 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001217 }
1218}
1219
Karl Schultz6addd812016-02-02 17:17:23 -07001220TEST_F(VkLayerTest, ScissorStateNotBound) {
1221 m_errorMonitor->SetDesiredFailureMsg(
1222 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001223 "Dynamic scissor state not set for this command buffer");
1224
Karl Schultz6addd812016-02-02 17:17:23 -07001225 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1226 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001227
Karl Schultz6addd812016-02-02 17:17:23 -07001228 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1229 BsoFailScissor);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001230
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001231 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001232 FAIL() << "Did not recieve Error ' Expected: 'Dynamic scissor state "
1233 "not set for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001234 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001235 }
1236}
1237
Karl Schultz6addd812016-02-02 17:17:23 -07001238TEST_F(VkLayerTest, BlendStateNotBound) {
1239 m_errorMonitor->SetDesiredFailureMsg(
1240 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001241 "Dynamic blend object state not set for this command buffer");
1242
Karl Schultz6addd812016-02-02 17:17:23 -07001243 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend "
1244 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001245
Karl Schultz6addd812016-02-02 17:17:23 -07001246 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1247 BsoFailBlend);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001248
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001249 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001250 FAIL() << "Did not recieve Error 'Dynamic blend object state not set "
1251 "for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001252 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001253 }
1254}
1255
Karl Schultz6addd812016-02-02 17:17:23 -07001256TEST_F(VkLayerTest, DepthBoundsStateNotBound) {
1257 m_errorMonitor->SetDesiredFailureMsg(
1258 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001259 "Dynamic depth bounds state not set for this command buffer");
1260
Karl Schultz6addd812016-02-02 17:17:23 -07001261 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1262 "bounds state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001263
Karl Schultz6addd812016-02-02 17:17:23 -07001264 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1265 BsoFailDepthBounds);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001266
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001267 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001268 FAIL() << "Did not receive Error 'Dynamic depth bounds state not set "
1269 "for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001270 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001271 }
1272}
1273
Karl Schultz6addd812016-02-02 17:17:23 -07001274TEST_F(VkLayerTest, StencilReadMaskNotSet) {
1275 m_errorMonitor->SetDesiredFailureMsg(
1276 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001277 "Dynamic stencil read mask state not set for this command buffer");
1278
Tobin Ehlis963a4042015-09-29 08:18:34 -06001279 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001280
Karl Schultz6addd812016-02-02 17:17:23 -07001281 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1282 "read mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001283
Karl Schultz6addd812016-02-02 17:17:23 -07001284 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1285 BsoFailStencilReadMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001286
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001287 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001288 FAIL() << "Did not receive Error 'Dynamic stencil read mask state not "
1289 "set for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001290 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001291 }
1292}
1293
Karl Schultz6addd812016-02-02 17:17:23 -07001294TEST_F(VkLayerTest, StencilWriteMaskNotSet) {
1295 m_errorMonitor->SetDesiredFailureMsg(
1296 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001297 "Dynamic stencil write mask state not set for this command buffer");
1298
Tobin Ehlis963a4042015-09-29 08:18:34 -06001299 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001300
Karl Schultz6addd812016-02-02 17:17:23 -07001301 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1302 "write mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001303
Karl Schultz6addd812016-02-02 17:17:23 -07001304 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1305 BsoFailStencilWriteMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001306
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001307 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001308 FAIL() << "Did not receive Error 'Dynamic stencil write mask state not "
1309 "set for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001310 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001311 }
1312}
1313
Karl Schultz6addd812016-02-02 17:17:23 -07001314TEST_F(VkLayerTest, StencilReferenceNotSet) {
1315 m_errorMonitor->SetDesiredFailureMsg(
1316 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001317 "Dynamic stencil reference state not set for this command buffer");
1318
Karl Schultz6addd812016-02-02 17:17:23 -07001319 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1320 "reference is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001321
Karl Schultz6addd812016-02-02 17:17:23 -07001322 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1323 BsoFailStencilReference);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001324
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001325 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001326 FAIL() << "Did not receive Error 'Dynamic stencil reference state not "
1327 "set for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001328 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001329 }
1330}
1331
Karl Schultz6addd812016-02-02 17:17:23 -07001332TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001333 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001334
Karl Schultz6addd812016-02-02 17:17:23 -07001335 m_errorMonitor->SetDesiredFailureMsg(
1336 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1337 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
1338 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001339
1340 VkFenceCreateInfo fenceInfo = {};
1341 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1342 fenceInfo.pNext = NULL;
1343 fenceInfo.flags = 0;
1344
1345 ASSERT_NO_FATAL_FAILURE(InitState());
1346 ASSERT_NO_FATAL_FAILURE(InitViewport());
1347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1348
Karl Schultz6addd812016-02-02 17:17:23 -07001349 // We luck out b/c by default the framework creates CB w/ the
1350 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001351 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001352 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1353 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001354 EndCommandBuffer();
1355
1356 testFence.init(*m_device, fenceInfo);
1357
1358 // Bypass framework since it does the waits automatically
1359 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001360 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001361 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1362 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001363 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001364 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001365 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001366 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001367 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001368 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001369 submit_info.pSignalSemaphores = NULL;
1370
Karl Schultz6addd812016-02-02 17:17:23 -07001371 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
1372 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001373
Karl Schultz6addd812016-02-02 17:17:23 -07001374 // Cause validation error by re-submitting cmd buffer that should only be
1375 // submitted once
1376 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001377
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001378 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001379 FAIL() << "Did not receive Error 'CB (0xaddress) was created w/ "
1380 "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001381 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001382 }
1383}
1384
Karl Schultz6addd812016-02-02 17:17:23 -07001385TEST_F(VkLayerTest, BindPipelineNoRenderPass) {
Mark Lobodzinski74635932015-12-18 15:35:38 -07001386 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07001387 VkResult err;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001388
1389 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001390 "vkCmdBindPipeline: This call must be "
1391 "issued inside an active render pass");
Mark Lobodzinski74635932015-12-18 15:35:38 -07001392
1393 ASSERT_NO_FATAL_FAILURE(InitState());
1394 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1395
1396 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001397 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1398 ds_type_count.descriptorCount = 1;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001399
1400 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001401 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1402 ds_pool_ci.pNext = NULL;
1403 ds_pool_ci.maxSets = 1;
1404 ds_pool_ci.poolSizeCount = 1;
1405 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001406
1407 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001408 err =
1409 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Lobodzinski74635932015-12-18 15:35:38 -07001410 ASSERT_VK_SUCCESS(err);
1411
1412 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001413 dsl_binding.binding = 0;
1414 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1415 dsl_binding.descriptorCount = 1;
1416 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1417 dsl_binding.pImmutableSamplers = NULL;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001418
1419 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001420 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1421 ds_layout_ci.pNext = NULL;
1422 ds_layout_ci.bindingCount = 1;
1423 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001424
1425 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001426 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1427 &ds_layout);
Mark Lobodzinski74635932015-12-18 15:35:38 -07001428 ASSERT_VK_SUCCESS(err);
1429
1430 VkDescriptorSet descriptorSet;
1431 VkDescriptorSetAllocateInfo alloc_info = {};
1432 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001433 alloc_info.descriptorSetCount = 1;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001434 alloc_info.descriptorPool = ds_pool;
1435 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001436 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1437 &descriptorSet);
Mark Lobodzinski74635932015-12-18 15:35:38 -07001438 ASSERT_VK_SUCCESS(err);
1439 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001440 pipe_ms_state_ci.sType =
1441 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
1442 pipe_ms_state_ci.pNext = NULL;
1443 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
1444 pipe_ms_state_ci.sampleShadingEnable = 0;
1445 pipe_ms_state_ci.minSampleShading = 1.0;
1446 pipe_ms_state_ci.pSampleMask = NULL;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001447
1448 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001449 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1450 pipeline_layout_ci.pNext = NULL;
1451 pipeline_layout_ci.setLayoutCount = 1;
1452 pipeline_layout_ci.pSetLayouts = &ds_layout;
1453 VkPipelineLayout pipeline_layout;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001454
Karl Schultz6addd812016-02-02 17:17:23 -07001455 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1456 &pipeline_layout);
Mark Lobodzinski74635932015-12-18 15:35:38 -07001457 ASSERT_VK_SUCCESS(err);
1458
Karl Schultz6addd812016-02-02 17:17:23 -07001459 VkShaderObj vs(m_device, bindStateVertShaderText,
1460 VK_SHADER_STAGE_VERTEX_BIT, this);
1461 VkShaderObj fs(m_device, bindStateFragShaderText,
1462 VK_SHADER_STAGE_FRAGMENT_BIT,
1463 this); // TODO - We shouldn't need a fragment shader
1464 // but add it to be able to run on more devices
Mark Lobodzinski74635932015-12-18 15:35:38 -07001465 VkPipelineObj pipe(m_device);
1466 pipe.AddShader(&vs);
1467 pipe.AddShader(&fs);
1468 pipe.SetMSAA(&pipe_ms_state_ci);
1469 pipe.CreateVKPipeline(pipeline_layout, renderPass());
1470
1471 // Calls AllocateCommandBuffers
1472 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
1473 VkCommandBufferBeginInfo cmd_buf_info = {};
1474 memset(&cmd_buf_info, 0, sizeof(VkCommandBufferBeginInfo));
Jon Ashburnf19916e2016-01-11 13:12:43 -07001475 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
1476 memset(&cmd_buf_hinfo, 0, sizeof(VkCommandBufferInheritanceInfo));
Mark Lobodzinski74635932015-12-18 15:35:38 -07001477 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1478 cmd_buf_info.pNext = NULL;
1479 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001480 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinski74635932015-12-18 15:35:38 -07001481
1482 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Karl Schultz6addd812016-02-02 17:17:23 -07001483 vkCmdBindPipeline(commandBuffer.GetBufferHandle(),
1484 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Lobodzinski74635932015-12-18 15:35:38 -07001485
1486 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001487 FAIL() << "Did not receive Error 'vkCmdBindPipeline: This call must be "
1488 "issued inside an active render pass'";
Mark Lobodzinski74635932015-12-18 15:35:38 -07001489 m_errorMonitor->DumpFailureMsgs();
1490 }
1491
1492 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1493 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1494 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1495}
1496
Karl Schultz6addd812016-02-02 17:17:23 -07001497TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001498 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07001499 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001500
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001502 "Unable to allocate 1 descriptors of "
1503 "type "
1504 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001505
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001506 ASSERT_NO_FATAL_FAILURE(InitState());
1507 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001508
Karl Schultz6addd812016-02-02 17:17:23 -07001509 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
1510 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001511 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001512 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
1513 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001514
1515 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001516 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1517 ds_pool_ci.pNext = NULL;
1518 ds_pool_ci.flags = 0;
1519 ds_pool_ci.maxSets = 1;
1520 ds_pool_ci.poolSizeCount = 1;
1521 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001522
1523 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001524 err =
1525 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001526 ASSERT_VK_SUCCESS(err);
1527
1528 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001529 dsl_binding.binding = 0;
1530 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1531 dsl_binding.descriptorCount = 1;
1532 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1533 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001534
1535 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001536 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1537 ds_layout_ci.pNext = NULL;
1538 ds_layout_ci.bindingCount = 1;
1539 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001540
1541 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001542 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1543 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001544 ASSERT_VK_SUCCESS(err);
1545
1546 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001547 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001548 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001549 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001550 alloc_info.descriptorPool = ds_pool;
1551 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001552 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1553 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001554
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001555 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001556 FAIL() << "Did not receive Error 'Unable to allocate 1 descriptors of "
1557 "type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001558 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001559 }
1560
Chia-I Wuf7458c52015-10-26 21:10:41 +08001561 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1562 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001563}
1564
Karl Schultz6addd812016-02-02 17:17:23 -07001565TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
1566 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06001567
Karl Schultz6addd812016-02-02 17:17:23 -07001568 m_errorMonitor->SetDesiredFailureMsg(
1569 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1570 "It is invalid to call vkFreeDescriptorSets() with a pool created "
1571 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001572
Tobin Ehlise735c692015-10-08 13:13:50 -06001573 ASSERT_NO_FATAL_FAILURE(InitState());
1574 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06001575
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001576 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001577 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1578 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06001579
1580 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001581 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1582 ds_pool_ci.pNext = NULL;
1583 ds_pool_ci.maxSets = 1;
1584 ds_pool_ci.poolSizeCount = 1;
1585 ds_pool_ci.flags = 0;
1586 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
1587 // app can only call vkResetDescriptorPool on this pool.;
1588 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06001589
1590 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001591 err =
1592 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06001593 ASSERT_VK_SUCCESS(err);
1594
1595 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001596 dsl_binding.binding = 0;
1597 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1598 dsl_binding.descriptorCount = 1;
1599 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1600 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06001601
1602 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001603 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1604 ds_layout_ci.pNext = NULL;
1605 ds_layout_ci.bindingCount = 1;
1606 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06001607
1608 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001609 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1610 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06001611 ASSERT_VK_SUCCESS(err);
1612
1613 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001614 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001615 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001616 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001617 alloc_info.descriptorPool = ds_pool;
1618 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001619 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1620 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06001621 ASSERT_VK_SUCCESS(err);
1622
1623 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001624 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001625 FAIL() << "Did not receive Error 'It is invalid to call "
1626 "vkFreeDescriptorSets() with a pool created with...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001627 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlise735c692015-10-08 13:13:50 -06001628 }
1629
Chia-I Wuf7458c52015-10-26 21:10:41 +08001630 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1631 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06001632}
1633
Karl Schultz6addd812016-02-02 17:17:23 -07001634TEST_F(VkLayerTest, InvalidDescriptorPool) {
1635 // TODO : Simple check for bad object should be added to ObjectTracker to
1636 // catch this case
1637 // The DS check for this is after driver has been called to validate DS
1638 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001639 // Attempt to clear DS Pool with bad object
Karl Schultz6addd812016-02-02 17:17:23 -07001640 /*
1641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1642 "Unable to find pool node for pool 0xbaad6001 specified in
1643 vkResetDescriptorPool() call");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001644
Karl Schultz6addd812016-02-02 17:17:23 -07001645 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
1646 vkResetDescriptorPool(device(), badPool);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001647
Karl Schultz6addd812016-02-02 17:17:23 -07001648 if (!m_errorMonitor->DesiredMsgFound()) {
1649 FAIL() << "Did not receive Error 'Unable to find pool node for pool
1650 0xbaad6001 specified in vkResetDescriptorPool() call'";
1651 m_errorMonitor->DumpFailureMsgs();
1652 }*/
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001653}
1654
Karl Schultz6addd812016-02-02 17:17:23 -07001655TEST_F(VkLayerTest, InvalidDescriptorSet) {
1656 // TODO : Simple check for bad object should be added to ObjectTracker to
1657 // catch this case
1658 // The DS check for this is after driver has been called to validate DS
1659 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001660 // Create a valid cmd buffer
1661 // call vkCmdBindDescriptorSets w/ false DS
1662}
1663
Karl Schultz6addd812016-02-02 17:17:23 -07001664TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
1665 // TODO : Simple check for bad object should be added to ObjectTracker to
1666 // catch this case
1667 // The DS check for this is after driver has been called to validate DS
1668 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001669}
1670
Karl Schultz6addd812016-02-02 17:17:23 -07001671TEST_F(VkLayerTest, InvalidPipeline) {
1672 // TODO : Simple check for bad object should be added to ObjectTracker to
1673 // catch this case
1674 // The DS check for this is after driver has been called to validate DS
1675 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001676 // Create a valid cmd buffer
1677 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultz6addd812016-02-02 17:17:23 -07001678 //
1679 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1680 // "Attempt to bind Pipeline ");
1681 //
1682 // ASSERT_NO_FATAL_FAILURE(InitState());
1683 // VkCommandBufferObj commandBuffer(m_device);
1684 // BeginCommandBuffer();
1685 // VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
1686 // vkCmdBindPipeline(commandBuffer.GetBufferHandle(),
1687 // VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
1688 //
1689 // if (!m_errorMonitor->DesiredMsgFound()) {
1690 // FAIL() << "Did not receive Error 'Attempt to bind Pipeline
1691 // 0xbaadb1be that doesn't exist!'";
1692 // m_errorMonitor->DumpFailureMsgs();
1693 // }
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001694}
1695
Karl Schultz6addd812016-02-02 17:17:23 -07001696TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
1697 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
1698 // CommandBuffer
1699 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001700
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001701 // TODO: verify that this matches layer
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07001702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001703 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001704
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001705 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06001706 ASSERT_NO_FATAL_FAILURE(InitViewport());
1707 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001708 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001709 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1710 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06001711
1712 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001713 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1714 ds_pool_ci.pNext = NULL;
1715 ds_pool_ci.maxSets = 1;
1716 ds_pool_ci.poolSizeCount = 1;
1717 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06001718
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001719 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001720 err =
1721 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001722 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001723
Tony Barboureb254902015-07-15 12:50:33 -06001724 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001725 dsl_binding.binding = 0;
1726 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1727 dsl_binding.descriptorCount = 1;
1728 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1729 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001730
Tony Barboureb254902015-07-15 12:50:33 -06001731 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001732 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1733 ds_layout_ci.pNext = NULL;
1734 ds_layout_ci.bindingCount = 1;
1735 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001736 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001737 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1738 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001739 ASSERT_VK_SUCCESS(err);
1740
1741 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001742 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001743 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001744 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001745 alloc_info.descriptorPool = ds_pool;
1746 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001747 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1748 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001749 ASSERT_VK_SUCCESS(err);
1750
Tony Barboureb254902015-07-15 12:50:33 -06001751 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001752 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1753 pipeline_layout_ci.pNext = NULL;
1754 pipeline_layout_ci.setLayoutCount = 1;
1755 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001756
1757 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001758 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1759 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001760 ASSERT_VK_SUCCESS(err);
1761
Karl Schultz6addd812016-02-02 17:17:23 -07001762 VkShaderObj vs(m_device, bindStateVertShaderText,
1763 VK_SHADER_STAGE_VERTEX_BIT, this);
1764 // TODO - We shouldn't need a fragment shader but add it to be able to run
1765 // on more devices
1766 VkShaderObj fs(m_device, bindStateFragShaderText,
1767 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001768
Tony Barbourc95e4ac2015-08-04 17:05:26 -06001769 VkPipelineObj pipe(m_device);
1770 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06001771 pipe.AddShader(&fs);
Tony Barbourc95e4ac2015-08-04 17:05:26 -06001772 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06001773
1774 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001775 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1776 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
1777 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1778 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1779 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001780
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001781 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001782 FAIL() << "Did not recieve Warning 'DS <blah> bound but it was never "
1783 "updated. You may want to either update it or not bind it.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001784 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06001785 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06001786
Chia-I Wuf7458c52015-10-26 21:10:41 +08001787 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1788 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1789 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06001790}
1791
Karl Schultz6addd812016-02-02 17:17:23 -07001792TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001793 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07001794 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001795
Karl Schultz6addd812016-02-02 17:17:23 -07001796 m_errorMonitor->SetDesiredFailureMsg(
1797 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001798 "Attempt to update descriptor with invalid bufferView ");
1799
1800 ASSERT_NO_FATAL_FAILURE(InitState());
1801 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001802 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1803 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001804
1805 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001806 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1807 ds_pool_ci.pNext = NULL;
1808 ds_pool_ci.maxSets = 1;
1809 ds_pool_ci.poolSizeCount = 1;
1810 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001811
1812 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001813 err =
1814 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001815 ASSERT_VK_SUCCESS(err);
1816
1817 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001818 dsl_binding.binding = 0;
1819 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1820 dsl_binding.descriptorCount = 1;
1821 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1822 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001823
1824 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001825 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1826 ds_layout_ci.pNext = NULL;
1827 ds_layout_ci.bindingCount = 1;
1828 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001829 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001830 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1831 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001832 ASSERT_VK_SUCCESS(err);
1833
1834 VkDescriptorSet descriptorSet;
1835 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001836 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001837 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001838 alloc_info.descriptorPool = ds_pool;
1839 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001840 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1841 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001842 ASSERT_VK_SUCCESS(err);
1843
Karl Schultz6addd812016-02-02 17:17:23 -07001844 VkBufferView view =
1845 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001846 VkWriteDescriptorSet descriptor_write;
1847 memset(&descriptor_write, 0, sizeof(descriptor_write));
1848 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1849 descriptor_write.dstSet = descriptorSet;
1850 descriptor_write.dstBinding = 0;
1851 descriptor_write.descriptorCount = 1;
1852 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1853 descriptor_write.pTexelBufferView = &view;
1854
1855 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1856
1857 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001858 FAIL() << "Did not receive Error 'Attempt to update descriptor with "
1859 "invalid bufferView'";
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001860 m_errorMonitor->DumpFailureMsgs();
1861 }
1862
1863 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1864 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1865}
1866
Karl Schultz6addd812016-02-02 17:17:23 -07001867TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
1868 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
1869 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07001870 // 1. No dynamicOffset supplied
1871 // 2. Too many dynamicOffsets supplied
1872 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07001873 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001875 " requires 1 dynamicOffsets, but only "
1876 "0 dynamicOffsets are left in "
1877 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001878
1879 ASSERT_NO_FATAL_FAILURE(InitState());
1880 ASSERT_NO_FATAL_FAILURE(InitViewport());
1881 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1882
1883 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001884 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1885 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001886
1887 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001888 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1889 ds_pool_ci.pNext = NULL;
1890 ds_pool_ci.maxSets = 1;
1891 ds_pool_ci.poolSizeCount = 1;
1892 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001893
1894 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001895 err =
1896 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001897 ASSERT_VK_SUCCESS(err);
1898
1899 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001900 dsl_binding.binding = 0;
1901 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1902 dsl_binding.descriptorCount = 1;
1903 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1904 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001905
1906 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001907 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1908 ds_layout_ci.pNext = NULL;
1909 ds_layout_ci.bindingCount = 1;
1910 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001911 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001912 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1913 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001914 ASSERT_VK_SUCCESS(err);
1915
1916 VkDescriptorSet descriptorSet;
1917 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001918 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001919 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001920 alloc_info.descriptorPool = ds_pool;
1921 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001922 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1923 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001924 ASSERT_VK_SUCCESS(err);
1925
1926 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001927 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1928 pipeline_layout_ci.pNext = NULL;
1929 pipeline_layout_ci.setLayoutCount = 1;
1930 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001931
1932 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001933 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1934 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001935 ASSERT_VK_SUCCESS(err);
1936
1937 // Create a buffer to update the descriptor with
1938 uint32_t qfi = 0;
1939 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001940 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1941 buffCI.size = 1024;
1942 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1943 buffCI.queueFamilyIndexCount = 1;
1944 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001945
1946 VkBuffer dyub;
1947 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
1948 ASSERT_VK_SUCCESS(err);
1949 // Correctly update descriptor to avoid "NOT_UPDATED" error
1950 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001951 buffInfo.buffer = dyub;
1952 buffInfo.offset = 0;
1953 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001954
1955 VkWriteDescriptorSet descriptor_write;
1956 memset(&descriptor_write, 0, sizeof(descriptor_write));
1957 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1958 descriptor_write.dstSet = descriptorSet;
1959 descriptor_write.dstBinding = 0;
1960 descriptor_write.descriptorCount = 1;
1961 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1962 descriptor_write.pBufferInfo = &buffInfo;
1963
1964 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1965
1966 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001967 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1968 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1969 1, &descriptorSet, 0, NULL);
Tobin Ehlisf6585052015-12-17 11:48:42 -07001970 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001971 FAIL() << "Error received was not 'descriptorSet #0 (0x<ADDR>) "
1972 "requires 1 dynamicOffsets, but only 0 dynamicOffsets are "
1973 "left in pDynamicOffsets array...'";
Tobin Ehlisf6585052015-12-17 11:48:42 -07001974 m_errorMonitor->DumpFailureMsgs();
1975 }
1976 uint32_t pDynOff[2] = {512, 756};
1977 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07001978 m_errorMonitor->SetDesiredFailureMsg(
1979 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07001980 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07001981 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1982 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1983 1, &descriptorSet, 2, pDynOff);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001984 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001985 FAIL() << "Error received was not 'Attempting to bind 1 descriptorSets "
1986 "with 1 dynamic descriptors, but dynamicOffsetCount is 0...'";
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001987 m_errorMonitor->DumpFailureMsgs();
1988 }
Tobin Ehlisf6585052015-12-17 11:48:42 -07001989 // Finally cause error due to dynamicOffset being too big
Karl Schultz6addd812016-02-02 17:17:23 -07001990 m_errorMonitor->SetDesiredFailureMsg(
1991 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07001992 " from its update, this oversteps its buffer (");
1993 // Create PSO to be used for draw-time errors below
1994 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07001995 "#version 400\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07001996 "#extension GL_ARB_separate_shader_objects: require\n"
1997 "#extension GL_ARB_shading_language_420pack: require\n"
1998 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07001999 "out gl_PerVertex { \n"
2000 " vec4 gl_Position;\n"
2001 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002002 "void main(){\n"
2003 " gl_Position = vec4(1);\n"
2004 "}\n";
2005 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07002006 "#version 400\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002007 "#extension GL_ARB_separate_shader_objects: require\n"
2008 "#extension GL_ARB_shading_language_420pack: require\n"
2009 "\n"
2010 "layout(location=0) out vec4 x;\n"
2011 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2012 "void main(){\n"
2013 " x = vec4(bar.y);\n"
2014 "}\n";
2015 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2016 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2017 VkPipelineObj pipe(m_device);
2018 pipe.AddShader(&vs);
2019 pipe.AddShader(&fs);
2020 pipe.AddColorAttachment();
2021 pipe.CreateVKPipeline(pipeline_layout, renderPass());
2022
Karl Schultz6addd812016-02-02 17:17:23 -07002023 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2024 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2025 // This update should succeed, but offset size of 512 will overstep buffer
2026 // /w range 1024 & size 1024
2027 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2028 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2029 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07002030 Draw(1, 0, 0, 0);
2031 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002032 FAIL() << "Error received was not 'VkDescriptorSet (0x<ADDR>) bound as "
2033 "set #0 has dynamic offset 512. Combined with offet 0 and "
2034 "range 1024 from its update, this oversteps...'";
Tobin Ehlisf6585052015-12-17 11:48:42 -07002035 m_errorMonitor->DumpFailureMsgs();
2036 }
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002037
2038 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2039 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2040}
2041
Karl Schultz6addd812016-02-02 17:17:23 -07002042TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002043 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07002044 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002045
2046 ASSERT_NO_FATAL_FAILURE(InitState());
2047 ASSERT_NO_FATAL_FAILURE(InitViewport());
2048 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2049
2050 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
2051 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002052 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2053 ds_type_count[0].descriptorCount = 10;
2054 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2055 ds_type_count[1].descriptorCount = 2;
2056 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2057 ds_type_count[2].descriptorCount = 2;
2058 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
2059 ds_type_count[3].descriptorCount = 5;
2060 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
2061 // type
2062 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
2063 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
2064 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002065
2066 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002067 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2068 ds_pool_ci.pNext = NULL;
2069 ds_pool_ci.maxSets = 5;
2070 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
2071 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002072
2073 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002074 err =
2075 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002076 ASSERT_VK_SUCCESS(err);
2077
2078 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
2079 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002080 dsl_binding[0].binding = 0;
2081 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2082 dsl_binding[0].descriptorCount = 5;
2083 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
2084 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002085
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002086 // Create layout identical to set0 layout but w/ different stageFlags
2087 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002088 dsl_fs_stage_only.binding = 0;
2089 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2090 dsl_fs_stage_only.descriptorCount = 5;
2091 dsl_fs_stage_only.stageFlags =
2092 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
2093 // bind time
2094 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002095 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002096 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2097 ds_layout_ci.pNext = NULL;
2098 ds_layout_ci.bindingCount = 1;
2099 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002100 static const uint32_t NUM_LAYOUTS = 4;
2101 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002102 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002103 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
2104 // layout for error case
2105 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2106 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002107 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002108 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002109 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2110 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002111 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002112 dsl_binding[0].binding = 0;
2113 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002114 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002115 dsl_binding[1].binding = 1;
2116 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2117 dsl_binding[1].descriptorCount = 2;
2118 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
2119 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002120 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002121 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07002122 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2123 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002124 ASSERT_VK_SUCCESS(err);
2125 dsl_binding[0].binding = 0;
2126 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002127 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002128 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07002129 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2130 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002131 ASSERT_VK_SUCCESS(err);
2132 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002133 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07002134 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2135 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002136 ASSERT_VK_SUCCESS(err);
2137
2138 static const uint32_t NUM_SETS = 4;
2139 VkDescriptorSet descriptorSet[NUM_SETS] = {};
2140 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002141 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002142 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002143 alloc_info.descriptorPool = ds_pool;
2144 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002145 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2146 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002147 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002148 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002149 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002150 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002151 err =
2152 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002153 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002154
2155 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002156 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2157 pipeline_layout_ci.pNext = NULL;
2158 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
2159 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002160
2161 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002162 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2163 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002164 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002165 // Create pipelineLayout with only one setLayout
2166 pipeline_layout_ci.setLayoutCount = 1;
2167 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002168 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2169 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002170 ASSERT_VK_SUCCESS(err);
2171 // Create pipelineLayout with 2 descriptor setLayout at index 0
2172 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
2173 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07002174 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2175 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002176 ASSERT_VK_SUCCESS(err);
2177 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
2178 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
2179 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07002180 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2181 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002182 ASSERT_VK_SUCCESS(err);
2183 // Create pipelineLayout with UB type, but stageFlags for FS only
2184 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
2185 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002186 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2187 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002188 ASSERT_VK_SUCCESS(err);
2189 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
2190 VkDescriptorSetLayout pl_bad_s0[2] = {};
2191 pl_bad_s0[0] = ds_layout_fs_only;
2192 pl_bad_s0[1] = ds_layout[1];
2193 pipeline_layout_ci.setLayoutCount = 2;
2194 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
2195 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07002196 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2197 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002198 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002199
2200 // Create a buffer to update the descriptor with
2201 uint32_t qfi = 0;
2202 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002203 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2204 buffCI.size = 1024;
2205 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2206 buffCI.queueFamilyIndexCount = 1;
2207 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002208
2209 VkBuffer dyub;
2210 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2211 ASSERT_VK_SUCCESS(err);
2212 // Correctly update descriptor to avoid "NOT_UPDATED" error
2213 static const uint32_t NUM_BUFFS = 5;
2214 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002215 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002216 buffInfo[i].buffer = dyub;
2217 buffInfo[i].offset = 0;
2218 buffInfo[i].range = 1024;
2219 }
Karl Schultz6addd812016-02-02 17:17:23 -07002220 VkImage image;
2221 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2222 const int32_t tex_width = 32;
2223 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002224 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002225 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2226 image_create_info.pNext = NULL;
2227 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2228 image_create_info.format = tex_format;
2229 image_create_info.extent.width = tex_width;
2230 image_create_info.extent.height = tex_height;
2231 image_create_info.extent.depth = 1;
2232 image_create_info.mipLevels = 1;
2233 image_create_info.arrayLayers = 1;
2234 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2235 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2236 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2237 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002238 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2239 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002240
Karl Schultz6addd812016-02-02 17:17:23 -07002241 VkMemoryRequirements memReqs;
2242 VkDeviceMemory imageMem;
2243 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002244 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002245 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2246 memAlloc.pNext = NULL;
2247 memAlloc.allocationSize = 0;
2248 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002249 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
2250 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002251 pass =
2252 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002253 ASSERT_TRUE(pass);
2254 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
2255 ASSERT_VK_SUCCESS(err);
2256 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
2257 ASSERT_VK_SUCCESS(err);
2258
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002259 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002260 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2261 image_view_create_info.image = image;
2262 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
2263 image_view_create_info.format = tex_format;
2264 image_view_create_info.subresourceRange.layerCount = 1;
2265 image_view_create_info.subresourceRange.baseMipLevel = 0;
2266 image_view_create_info.subresourceRange.levelCount = 1;
2267 image_view_create_info.subresourceRange.aspectMask =
2268 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002269
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002270 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07002271 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
2272 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002273 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002274 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002275 imageInfo[0].imageView = view;
2276 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2277 imageInfo[1].imageView = view;
2278 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002279 imageInfo[2].imageView = view;
2280 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2281 imageInfo[3].imageView = view;
2282 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002283
2284 static const uint32_t NUM_SET_UPDATES = 3;
2285 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
2286 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2287 descriptor_write[0].dstSet = descriptorSet[0];
2288 descriptor_write[0].dstBinding = 0;
2289 descriptor_write[0].descriptorCount = 5;
2290 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2291 descriptor_write[0].pBufferInfo = buffInfo;
2292 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2293 descriptor_write[1].dstSet = descriptorSet[1];
2294 descriptor_write[1].dstBinding = 0;
2295 descriptor_write[1].descriptorCount = 2;
2296 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2297 descriptor_write[1].pImageInfo = imageInfo;
2298 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2299 descriptor_write[2].dstSet = descriptorSet[1];
2300 descriptor_write[2].dstBinding = 1;
2301 descriptor_write[2].descriptorCount = 2;
2302 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002303 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002304
2305 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002306
Tobin Ehlis88452832015-12-03 09:40:56 -07002307 // Create PSO to be used for draw-time errors below
2308 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07002309 "#version 400\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002310 "#extension GL_ARB_separate_shader_objects: require\n"
2311 "#extension GL_ARB_shading_language_420pack: require\n"
2312 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002313 "out gl_PerVertex {\n"
2314 " vec4 gl_Position;\n"
2315 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002316 "void main(){\n"
2317 " gl_Position = vec4(1);\n"
2318 "}\n";
2319 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07002320 "#version 400\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002321 "#extension GL_ARB_separate_shader_objects: require\n"
2322 "#extension GL_ARB_shading_language_420pack: require\n"
2323 "\n"
2324 "layout(location=0) out vec4 x;\n"
2325 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2326 "void main(){\n"
2327 " x = vec4(bar.y);\n"
2328 "}\n";
2329 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2330 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002331 VkPipelineObj pipe(m_device);
2332 pipe.AddShader(&vs);
2333 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07002334 pipe.AddColorAttachment();
2335 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07002336
2337 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07002338
Karl Schultz6addd812016-02-02 17:17:23 -07002339 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2340 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2341 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
2342 // of PSO
2343 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
2344 // cmd_pipeline.c
2345 // due to the fact that cmd_alloc_dset_data() has not been called in
2346 // cmd_bind_graphics_pipeline()
2347 // TODO : Want to cause various binding incompatibility issues here to test
2348 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07002349 // First cause various verify_layout_compatibility() fails
2350 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002351 // verify_set_layout_compatibility fail cases:
2352 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07002353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2354 " due to: invalid VkPipelineLayout ");
2355 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2356 VK_PIPELINE_BIND_POINT_GRAPHICS,
2357 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
2358 &descriptorSet[0], 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002359 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002360 FAIL() << "Did not receive correct error msg when attempting to bind "
2361 "descriptorSets with invalid VkPipelineLayout.";
Tobin Ehlis559c6382015-11-05 09:52:49 -07002362 m_errorMonitor->DumpFailureMsgs();
2363 }
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002364 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07002365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2366 " attempting to bind set to index 1");
2367 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2368 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
2369 0, 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002370 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002371 FAIL() << "Did not receive correct error msg when attempting to bind "
2372 "descriptorSet to index 1 when pipelineLayout only has index "
2373 "0.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002374 m_errorMonitor->DumpFailureMsgs();
2375 }
2376 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002377 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
2378 // descriptors
2379 m_errorMonitor->SetDesiredFailureMsg(
2380 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2381 ", but corresponding set being bound has 5 descriptors.");
2382 vkCmdBindDescriptorSets(
2383 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2384 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002385 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002386 FAIL() << "Did not receive correct error msg when attempting to bind "
2387 "descriptorSet w/ 5 descriptors to pipelineLayout with only "
2388 "2 descriptors.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002389 m_errorMonitor->DumpFailureMsgs();
2390 }
2391 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
2392 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07002393 m_errorMonitor->SetDesiredFailureMsg(
2394 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2395 " descriptor from pipelineLayout is type 'VK_DESCRIPTOR_TYPE_SAMPLER'");
2396 vkCmdBindDescriptorSets(
2397 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2398 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002399 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002400 FAIL() << "Did not receive correct error msg when attempting to bind "
2401 "UNIFORM_BUFFER descriptorSet to pipelineLayout with "
2402 "overlapping SAMPLER type.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002403 m_errorMonitor->DumpFailureMsgs();
2404 }
2405 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
2406 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07002407 m_errorMonitor->SetDesiredFailureMsg(
2408 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2409 " descriptor from pipelineLayout has stageFlags ");
2410 vkCmdBindDescriptorSets(
2411 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2412 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002413 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002414 FAIL() << "Did not receive correct error msg when attempting to bind "
2415 "UNIFORM_BUFFER descriptorSet with ALL stageFlags to "
2416 "pipelineLayout with FS-only stageFlags.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002417 m_errorMonitor->DumpFailureMsgs();
2418 }
2419 // Cause INFO messages due to disturbing previously bound Sets
2420 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07002421 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2422 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2423 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002424 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07002425 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002426 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002427 " previously bound as set #0 was disturbed ");
2428 vkCmdBindDescriptorSets(
2429 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2430 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002431 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002432 FAIL() << "Did not receive correct info msg when binding Set1 w/ "
2433 "pipelineLayout that should disturb Set0.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002434 m_errorMonitor->DumpFailureMsgs();
2435 }
Karl Schultz6addd812016-02-02 17:17:23 -07002436 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2437 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2438 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002439 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002441 " newly bound as set #0 so set #1 and "
2442 "any subsequent sets were disturbed ");
2443 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2444 VK_PIPELINE_BIND_POINT_GRAPHICS,
2445 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002446 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002447 FAIL() << "Did not receive correct info msg when re-binding Set0 w/ "
2448 "pipelineLayout that should disturb Set1.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002449 m_errorMonitor->DumpFailureMsgs();
2450 }
Tobin Ehlis88452832015-12-03 09:40:56 -07002451 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07002452 // 1. Error due to not binding required set (we actually use same code as
2453 // above to disturb set0)
2454 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2455 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2456 2, &descriptorSet[0], 0, NULL);
2457 vkCmdBindDescriptorSets(
2458 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2459 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
2460 m_errorMonitor->SetDesiredFailureMsg(
2461 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2462 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07002463 Draw(1, 0, 0, 0);
2464 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002465 FAIL() << "Did not receive correct error msg when attempting draw "
2466 "requiring Set0 but Set0 is not bound.";
Tobin Ehlis88452832015-12-03 09:40:56 -07002467 m_errorMonitor->DumpFailureMsgs();
2468 }
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002469 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002470 // 2. Error due to bound set not being compatible with PSO's
2471 // VkPipelineLayout (diff stageFlags in this case)
2472 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2473 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2474 2, &descriptorSet[0], 0, NULL);
2475 m_errorMonitor->SetDesiredFailureMsg(
2476 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2477 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07002478 Draw(1, 0, 0, 0);
2479 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002480 FAIL() << "Did not receive correct error msg when attempted draw where "
2481 "bound Set0 layout is not compatible PSO Set0 layout.";
Tobin Ehlis88452832015-12-03 09:40:56 -07002482 m_errorMonitor->DumpFailureMsgs();
2483 }
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002484 // Remaining clean-up
2485 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002486 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002487 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
2488 }
2489 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
2490 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
2491 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002492 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2493 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2494}
Tobin Ehlis559c6382015-11-05 09:52:49 -07002495
Karl Schultz6addd812016-02-02 17:17:23 -07002496TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002497
Karl Schultz6addd812016-02-02 17:17:23 -07002498 m_errorMonitor->SetDesiredFailureMsg(
2499 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002500 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002501
2502 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002503 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002504 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002505 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002506
2507 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002508 FAIL() << "Did not recieve Error 'You must call vkBeginCommandBuffer() "
2509 "before this call to vkEndCommandBuffer()'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002510 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002511 }
2512}
2513
Karl Schultz6addd812016-02-02 17:17:23 -07002514TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
2515 VkResult err;
2516 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002517
Karl Schultz6addd812016-02-02 17:17:23 -07002518 m_errorMonitor->SetDesiredFailureMsg(
2519 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07002520 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002521
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002522 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002523
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002524 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002525 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06002526 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002527 cmd.commandPool = m_commandPool;
2528 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002529 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06002530
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002531 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06002532 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002533
2534 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002535 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002536 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002537 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06002538 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002539 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
2540 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002541 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002542
2543 // The error should be caught by validation of the BeginCommandBuffer call
2544 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
2545
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002546 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002547 FAIL() << "Did not receive Error 'vkBeginCommandBuffer(): Secondary "
2548 "Command Buffers (0x<ADDR>) must specify a valid renderpass "
2549 "parameter.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002550 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002551 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002552 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002553}
2554
Karl Schultz6addd812016-02-02 17:17:23 -07002555TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002556 // Cause error due to Begin while recording CB
2557 // Then cause 2 errors for attempting to reset CB w/o having
2558 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
2559 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002560 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002561 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002562
2563 ASSERT_NO_FATAL_FAILURE(InitState());
2564
2565 // Calls AllocateCommandBuffers
2566 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
2567
Karl Schultz6addd812016-02-02 17:17:23 -07002568 // Force the failure by setting the Renderpass and Framebuffer fields with
2569 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002570 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002571 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002572 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2573 cmd_buf_info.pNext = NULL;
2574 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002575 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002576
2577 // Begin CB to transition to recording state
2578 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
2579 // Can't re-begin. This should trigger error
2580 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
2581 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002582 FAIL() << "Did not receive Error 'Cannot call Begin on CB (0x<ADDR>) "
2583 "in the RECORDING state...'";
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002584 m_errorMonitor->DumpFailureMsgs();
2585 }
Karl Schultz6addd812016-02-02 17:17:23 -07002586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2587 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002588 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
2589 // Reset attempt will trigger error due to incorrect CommandPool state
2590 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
2591 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002592 FAIL() << "Did not receive Error 'Attempt to reset command buffer "
2593 "(0x<ADDR>) created from command pool...'";
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002594 m_errorMonitor->DumpFailureMsgs();
2595 }
Karl Schultz6addd812016-02-02 17:17:23 -07002596 m_errorMonitor->SetDesiredFailureMsg(
2597 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2598 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002599 // Transition CB to RECORDED state
2600 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
2601 // Now attempting to Begin will implicitly reset, which triggers error
2602 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
2603 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002604 FAIL() << "Did not receive Error 'Call to vkBeginCommandBuffer() on "
2605 "command buffer (0x<ADDR>) attempts to implicitly reset...'";
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002606 m_errorMonitor->DumpFailureMsgs();
2607 }
2608}
2609
Karl Schultz6addd812016-02-02 17:17:23 -07002610TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002611 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07002612 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002613
Karl Schultz6addd812016-02-02 17:17:23 -07002614 m_errorMonitor->SetDesiredFailureMsg(
2615 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002616 "Invalid Pipeline CreateInfo State: Vtx Shader required");
2617
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002618 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002619 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002620
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002621 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002622 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2623 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002624
2625 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002626 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2627 ds_pool_ci.pNext = NULL;
2628 ds_pool_ci.maxSets = 1;
2629 ds_pool_ci.poolSizeCount = 1;
2630 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002631
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002632 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002633 err =
2634 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002635 ASSERT_VK_SUCCESS(err);
2636
Tony Barboureb254902015-07-15 12:50:33 -06002637 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002638 dsl_binding.binding = 0;
2639 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2640 dsl_binding.descriptorCount = 1;
2641 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2642 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002643
Tony Barboureb254902015-07-15 12:50:33 -06002644 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002645 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2646 ds_layout_ci.pNext = NULL;
2647 ds_layout_ci.bindingCount = 1;
2648 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06002649
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002650 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002651 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2652 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002653 ASSERT_VK_SUCCESS(err);
2654
2655 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002656 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002657 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002658 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002659 alloc_info.descriptorPool = ds_pool;
2660 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002661 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2662 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002663 ASSERT_VK_SUCCESS(err);
2664
Tony Barboureb254902015-07-15 12:50:33 -06002665 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002666 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2667 pipeline_layout_ci.setLayoutCount = 1;
2668 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002669
2670 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002671 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2672 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002673 ASSERT_VK_SUCCESS(err);
2674
Tobin Ehlise68360f2015-10-01 11:15:13 -06002675 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07002676 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06002677
2678 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002679 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2680 vp_state_ci.scissorCount = 1;
2681 vp_state_ci.pScissors = &sc;
2682 vp_state_ci.viewportCount = 1;
2683 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002684
Tony Barboureb254902015-07-15 12:50:33 -06002685 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002686 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2687 gp_ci.pViewportState = &vp_state_ci;
2688 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2689 gp_ci.layout = pipeline_layout;
2690 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06002691
2692 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002693 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2694 pc_ci.initialDataSize = 0;
2695 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002696
2697 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06002698 VkPipelineCache pipelineCache;
2699
Karl Schultz6addd812016-02-02 17:17:23 -07002700 err =
2701 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06002702 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002703 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2704 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002705
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002706 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002707 FAIL() << "Did not receive Error 'Invalid Pipeline CreateInfo State: "
2708 "Vtx Shader required'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002709 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002710 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06002711
Chia-I Wuf7458c52015-10-26 21:10:41 +08002712 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2713 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2714 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2715 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002716}
Tobin Ehlis912df022015-09-17 08:46:18 -06002717/*// TODO : This test should be good, but needs Tess support in compiler to run
2718TEST_F(VkLayerTest, InvalidPatchControlPoints)
2719{
2720 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06002721 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002722
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002724 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
2725primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002726
Tobin Ehlis912df022015-09-17 08:46:18 -06002727 ASSERT_NO_FATAL_FAILURE(InitState());
2728 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06002729
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002730 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06002731 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002732 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002733
2734 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2735 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2736 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002737 ds_pool_ci.poolSizeCount = 1;
2738 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06002739
2740 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002741 err = vkCreateDescriptorPool(m_device->device(),
2742VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06002743 ASSERT_VK_SUCCESS(err);
2744
2745 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08002746 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06002747 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08002748 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002749 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2750 dsl_binding.pImmutableSamplers = NULL;
2751
2752 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002753 ds_layout_ci.sType =
2754VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06002755 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002756 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002757 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06002758
2759 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002760 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2761&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06002762 ASSERT_VK_SUCCESS(err);
2763
2764 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07002765 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
2766VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06002767 ASSERT_VK_SUCCESS(err);
2768
2769 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002770 pipeline_layout_ci.sType =
2771VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06002772 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002773 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002774 pipeline_layout_ci.pSetLayouts = &ds_layout;
2775
2776 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002777 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2778&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06002779 ASSERT_VK_SUCCESS(err);
2780
2781 VkPipelineShaderStageCreateInfo shaderStages[3];
2782 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
2783
Karl Schultz6addd812016-02-02 17:17:23 -07002784 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
2785this);
Tobin Ehlis912df022015-09-17 08:46:18 -06002786 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07002787 VkShaderObj
2788tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
2789this);
2790 VkShaderObj
2791te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
2792this);
Tobin Ehlis912df022015-09-17 08:46:18 -06002793
Karl Schultz6addd812016-02-02 17:17:23 -07002794 shaderStages[0].sType =
2795VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002796 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002797 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07002798 shaderStages[1].sType =
2799VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002800 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002801 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07002802 shaderStages[2].sType =
2803VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002804 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002805 shaderStages[2].shader = te.handle();
2806
2807 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002808 iaCI.sType =
2809VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08002810 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06002811
2812 VkPipelineTessellationStateCreateInfo tsCI = {};
2813 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
2814 tsCI.patchControlPoints = 0; // This will cause an error
2815
2816 VkGraphicsPipelineCreateInfo gp_ci = {};
2817 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2818 gp_ci.pNext = NULL;
2819 gp_ci.stageCount = 3;
2820 gp_ci.pStages = shaderStages;
2821 gp_ci.pVertexInputState = NULL;
2822 gp_ci.pInputAssemblyState = &iaCI;
2823 gp_ci.pTessellationState = &tsCI;
2824 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002825 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06002826 gp_ci.pMultisampleState = NULL;
2827 gp_ci.pDepthStencilState = NULL;
2828 gp_ci.pColorBlendState = NULL;
2829 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2830 gp_ci.layout = pipeline_layout;
2831 gp_ci.renderPass = renderPass();
2832
2833 VkPipelineCacheCreateInfo pc_ci = {};
2834 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2835 pc_ci.pNext = NULL;
2836 pc_ci.initialSize = 0;
2837 pc_ci.initialData = 0;
2838 pc_ci.maxSize = 0;
2839
2840 VkPipeline pipeline;
2841 VkPipelineCache pipelineCache;
2842
Karl Schultz6addd812016-02-02 17:17:23 -07002843 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
2844&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06002845 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002846 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2847&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06002848
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002849 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002850 FAIL() << "Did not receive Error 'Invalid Pipeline CreateInfo State:
2851VK_PRIMITIVE_TOPOLOGY_PATCH primitive...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002852 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis912df022015-09-17 08:46:18 -06002853 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06002854
Chia-I Wuf7458c52015-10-26 21:10:41 +08002855 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2856 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2857 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2858 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06002859}
2860*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06002861// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07002862TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06002863 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07002864 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002865
Karl Schultz6addd812016-02-02 17:17:23 -07002866 m_errorMonitor->SetDesiredFailureMsg(
2867 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002868 "Gfx Pipeline viewport count (1) must match scissor count (0).");
2869
Tobin Ehlise68360f2015-10-01 11:15:13 -06002870 ASSERT_NO_FATAL_FAILURE(InitState());
2871 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06002872
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002873 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002874 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2875 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002876
2877 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002878 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2879 ds_pool_ci.maxSets = 1;
2880 ds_pool_ci.poolSizeCount = 1;
2881 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002882
2883 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002884 err =
2885 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002886 ASSERT_VK_SUCCESS(err);
2887
2888 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002889 dsl_binding.binding = 0;
2890 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2891 dsl_binding.descriptorCount = 1;
2892 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002893
2894 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002895 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2896 ds_layout_ci.bindingCount = 1;
2897 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002898
2899 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002900 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2901 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002902 ASSERT_VK_SUCCESS(err);
2903
2904 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002905 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002906 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002907 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002908 alloc_info.descriptorPool = ds_pool;
2909 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002910 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2911 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002912 ASSERT_VK_SUCCESS(err);
2913
2914 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002915 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2916 pipeline_layout_ci.setLayoutCount = 1;
2917 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002918
2919 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002920 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2921 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002922 ASSERT_VK_SUCCESS(err);
2923
2924 VkViewport vp = {}; // Just need dummy vp to point to
2925
2926 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002927 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2928 vp_state_ci.scissorCount = 0;
2929 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
2930 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002931
Cody Northropeb3a6c12015-10-05 14:44:45 -06002932 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07002933 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06002934
Karl Schultz6addd812016-02-02 17:17:23 -07002935 VkShaderObj vs(m_device, bindStateVertShaderText,
2936 VK_SHADER_STAGE_VERTEX_BIT, this);
2937 VkShaderObj fs(m_device, bindStateFragShaderText,
2938 VK_SHADER_STAGE_FRAGMENT_BIT,
2939 this); // TODO - We shouldn't need a fragment shader
2940 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08002941 shaderStages[0] = vs.GetStageCreateInfo();
2942 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002943
2944 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002945 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2946 gp_ci.stageCount = 2;
2947 gp_ci.pStages = shaderStages;
2948 gp_ci.pViewportState = &vp_state_ci;
2949 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2950 gp_ci.layout = pipeline_layout;
2951 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002952
2953 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002954 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002955
2956 VkPipeline pipeline;
2957 VkPipelineCache pipelineCache;
2958
Karl Schultz6addd812016-02-02 17:17:23 -07002959 err =
2960 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002961 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002962 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2963 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002964
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002965 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002966 FAIL() << "Did not receive Error 'Gfx Pipeline viewport count (1) must "
2967 "match scissor count (0).'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002968 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002969 }
2970
Chia-I Wuf7458c52015-10-26 21:10:41 +08002971 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2972 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2973 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2974 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002975}
Karl Schultz6addd812016-02-02 17:17:23 -07002976// Don't set viewport state in PSO. This is an error b/c we always need this
2977// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06002978// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07002979TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06002980 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07002981 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002982
Karl Schultz6addd812016-02-02 17:17:23 -07002983 m_errorMonitor->SetDesiredFailureMsg(
2984 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002985 "Gfx Pipeline pViewportState is null. Even if ");
2986
Tobin Ehlise68360f2015-10-01 11:15:13 -06002987 ASSERT_NO_FATAL_FAILURE(InitState());
2988 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06002989
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002990 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002991 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2992 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002993
2994 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002995 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2996 ds_pool_ci.maxSets = 1;
2997 ds_pool_ci.poolSizeCount = 1;
2998 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002999
3000 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003001 err =
3002 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003003 ASSERT_VK_SUCCESS(err);
3004
3005 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003006 dsl_binding.binding = 0;
3007 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3008 dsl_binding.descriptorCount = 1;
3009 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003010
3011 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003012 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3013 ds_layout_ci.bindingCount = 1;
3014 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003015
3016 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003017 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3018 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003019 ASSERT_VK_SUCCESS(err);
3020
3021 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003022 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003023 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003024 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003025 alloc_info.descriptorPool = ds_pool;
3026 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003027 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3028 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003029 ASSERT_VK_SUCCESS(err);
3030
3031 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003032 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3033 pipeline_layout_ci.setLayoutCount = 1;
3034 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003035
3036 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003037 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3038 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003039 ASSERT_VK_SUCCESS(err);
3040
3041 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3042 // Set scissor as dynamic to avoid second error
3043 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003044 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3045 dyn_state_ci.dynamicStateCount = 1;
3046 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003047
Cody Northropeb3a6c12015-10-05 14:44:45 -06003048 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003049 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003050
Karl Schultz6addd812016-02-02 17:17:23 -07003051 VkShaderObj vs(m_device, bindStateVertShaderText,
3052 VK_SHADER_STAGE_VERTEX_BIT, this);
3053 VkShaderObj fs(m_device, bindStateFragShaderText,
3054 VK_SHADER_STAGE_FRAGMENT_BIT,
3055 this); // TODO - We shouldn't need a fragment shader
3056 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003057 shaderStages[0] = vs.GetStageCreateInfo();
3058 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003059
3060 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003061 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3062 gp_ci.stageCount = 2;
3063 gp_ci.pStages = shaderStages;
3064 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
3065 // should cause validation error
3066 gp_ci.pDynamicState = &dyn_state_ci;
3067 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3068 gp_ci.layout = pipeline_layout;
3069 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003070
3071 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003072 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003073
3074 VkPipeline pipeline;
3075 VkPipelineCache pipelineCache;
3076
Karl Schultz6addd812016-02-02 17:17:23 -07003077 err =
3078 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003079 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003080 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3081 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003082
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003083 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003084 FAIL() << "Did not receive Error 'Gfx Pipeline pViewportState is null. "
3085 "Even if...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003086 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003087 }
3088
Chia-I Wuf7458c52015-10-26 21:10:41 +08003089 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3090 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3091 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3092 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003093}
3094// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07003095// Then run second test where dynamic scissor count doesn't match PSO scissor
3096// count
3097TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
3098 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003099
Karl Schultz6addd812016-02-02 17:17:23 -07003100 m_errorMonitor->SetDesiredFailureMsg(
3101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003102 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
3103
Tobin Ehlise68360f2015-10-01 11:15:13 -06003104 ASSERT_NO_FATAL_FAILURE(InitState());
3105 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003106
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003107 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003108 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3109 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003110
3111 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003112 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3113 ds_pool_ci.maxSets = 1;
3114 ds_pool_ci.poolSizeCount = 1;
3115 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003116
3117 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003118 err =
3119 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003120 ASSERT_VK_SUCCESS(err);
3121
3122 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003123 dsl_binding.binding = 0;
3124 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3125 dsl_binding.descriptorCount = 1;
3126 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003127
3128 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003129 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3130 ds_layout_ci.bindingCount = 1;
3131 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003132
3133 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003134 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3135 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003136 ASSERT_VK_SUCCESS(err);
3137
3138 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003139 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003140 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003141 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003142 alloc_info.descriptorPool = ds_pool;
3143 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003144 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3145 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003146 ASSERT_VK_SUCCESS(err);
3147
3148 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003149 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3150 pipeline_layout_ci.setLayoutCount = 1;
3151 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003152
3153 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003154 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3155 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003156 ASSERT_VK_SUCCESS(err);
3157
3158 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003159 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3160 vp_state_ci.viewportCount = 1;
3161 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
3162 vp_state_ci.scissorCount = 1;
3163 vp_state_ci.pScissors =
3164 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06003165
3166 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3167 // Set scissor as dynamic to avoid that error
3168 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003169 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3170 dyn_state_ci.dynamicStateCount = 1;
3171 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003172
Cody Northropeb3a6c12015-10-05 14:44:45 -06003173 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003174 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003175
Karl Schultz6addd812016-02-02 17:17:23 -07003176 VkShaderObj vs(m_device, bindStateVertShaderText,
3177 VK_SHADER_STAGE_VERTEX_BIT, this);
3178 VkShaderObj fs(m_device, bindStateFragShaderText,
3179 VK_SHADER_STAGE_FRAGMENT_BIT,
3180 this); // TODO - We shouldn't need a fragment shader
3181 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003182 shaderStages[0] = vs.GetStageCreateInfo();
3183 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003184
Cody Northropf6622dc2015-10-06 10:33:21 -06003185 VkPipelineVertexInputStateCreateInfo vi_ci = {};
3186 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3187 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003188 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06003189 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003190 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06003191 vi_ci.pVertexAttributeDescriptions = nullptr;
3192
3193 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
3194 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
3195 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3196
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003197 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003198 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06003199 rs_ci.pNext = nullptr;
3200
3201 VkPipelineColorBlendStateCreateInfo cb_ci = {};
3202 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
3203 cb_ci.pNext = nullptr;
3204
Tobin Ehlise68360f2015-10-01 11:15:13 -06003205 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003206 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3207 gp_ci.stageCount = 2;
3208 gp_ci.pStages = shaderStages;
3209 gp_ci.pVertexInputState = &vi_ci;
3210 gp_ci.pInputAssemblyState = &ia_ci;
3211 gp_ci.pViewportState = &vp_state_ci;
3212 gp_ci.pRasterizationState = &rs_ci;
3213 gp_ci.pColorBlendState = &cb_ci;
3214 gp_ci.pDynamicState = &dyn_state_ci;
3215 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3216 gp_ci.layout = pipeline_layout;
3217 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003218
3219 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003220 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003221
3222 VkPipeline pipeline;
3223 VkPipelineCache pipelineCache;
3224
Karl Schultz6addd812016-02-02 17:17:23 -07003225 err =
3226 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003227 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003228 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3229 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003230
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003231 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003232 FAIL() << "Did not recieve Error 'Gfx Pipeline viewportCount is 1, but "
3233 "pViewports is NULL...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003234 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003235 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003236
Tobin Ehlisd332f282015-10-02 11:00:56 -06003237 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07003238 // First need to successfully create the PSO from above by setting
3239 // pViewports
3240 m_errorMonitor->SetDesiredFailureMsg(
3241 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3242 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
3243 "scissorCount is 1. These counts must match.");
3244
3245 VkViewport vp = {}; // Just need dummy vp to point to
3246 vp_state_ci.pViewports = &vp;
3247 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3248 &gp_ci, NULL, &pipeline);
3249 ASSERT_VK_SUCCESS(err);
3250 BeginCommandBuffer();
3251 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3252 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3253 VkRect2D scissors[2] = {}; // don't care about data
3254 // Count of 2 doesn't match PSO count of 1
3255 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
3256 Draw(1, 0, 0, 0);
3257
3258 if (!m_errorMonitor->DesiredMsgFound()) {
3259 FAIL() << "Did not receive Error 'Dynamic scissorCount from "
3260 "vkCmdSetScissor() is 2, but PSO scissorCount is 1...'";
3261 m_errorMonitor->DumpFailureMsgs();
3262 }
3263
3264 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3265 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3266 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3267 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3268}
3269// Create PSO w/o non-zero scissorCount but no scissor data
3270// Then run second test where dynamic viewportCount doesn't match PSO
3271// viewportCount
3272TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
3273 VkResult err;
3274
3275 m_errorMonitor->SetDesiredFailureMsg(
3276 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3277 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
3278
3279 ASSERT_NO_FATAL_FAILURE(InitState());
3280 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3281
3282 VkDescriptorPoolSize ds_type_count = {};
3283 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3284 ds_type_count.descriptorCount = 1;
3285
3286 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3287 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3288 ds_pool_ci.maxSets = 1;
3289 ds_pool_ci.poolSizeCount = 1;
3290 ds_pool_ci.pPoolSizes = &ds_type_count;
3291
3292 VkDescriptorPool ds_pool;
3293 err =
3294 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
3295 ASSERT_VK_SUCCESS(err);
3296
3297 VkDescriptorSetLayoutBinding dsl_binding = {};
3298 dsl_binding.binding = 0;
3299 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3300 dsl_binding.descriptorCount = 1;
3301 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3302
3303 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3304 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3305 ds_layout_ci.bindingCount = 1;
3306 ds_layout_ci.pBindings = &dsl_binding;
3307
3308 VkDescriptorSetLayout ds_layout;
3309 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3310 &ds_layout);
3311 ASSERT_VK_SUCCESS(err);
3312
3313 VkDescriptorSet descriptorSet;
3314 VkDescriptorSetAllocateInfo alloc_info = {};
3315 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3316 alloc_info.descriptorSetCount = 1;
3317 alloc_info.descriptorPool = ds_pool;
3318 alloc_info.pSetLayouts = &ds_layout;
3319 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3320 &descriptorSet);
3321 ASSERT_VK_SUCCESS(err);
3322
3323 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3324 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3325 pipeline_layout_ci.setLayoutCount = 1;
3326 pipeline_layout_ci.pSetLayouts = &ds_layout;
3327
3328 VkPipelineLayout pipeline_layout;
3329 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3330 &pipeline_layout);
3331 ASSERT_VK_SUCCESS(err);
3332
3333 VkPipelineViewportStateCreateInfo vp_state_ci = {};
3334 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3335 vp_state_ci.scissorCount = 1;
3336 vp_state_ci.pScissors =
3337 NULL; // Null scissor w/ count of 1 should cause error
3338 vp_state_ci.viewportCount = 1;
3339 vp_state_ci.pViewports =
3340 NULL; // vp is dynamic (below) so this won't cause error
3341
3342 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
3343 // Set scissor as dynamic to avoid that error
3344 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
3345 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3346 dyn_state_ci.dynamicStateCount = 1;
3347 dyn_state_ci.pDynamicStates = &vp_state;
3348
3349 VkPipelineShaderStageCreateInfo shaderStages[2];
3350 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
3351
3352 VkShaderObj vs(m_device, bindStateVertShaderText,
3353 VK_SHADER_STAGE_VERTEX_BIT, this);
3354 VkShaderObj fs(m_device, bindStateFragShaderText,
3355 VK_SHADER_STAGE_FRAGMENT_BIT,
3356 this); // TODO - We shouldn't need a fragment shader
3357 // but add it to be able to run on more devices
3358 shaderStages[0] = vs.GetStageCreateInfo();
3359 shaderStages[1] = fs.GetStageCreateInfo();
3360
3361 VkPipelineVertexInputStateCreateInfo vi_ci = {};
3362 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3363 vi_ci.pNext = nullptr;
3364 vi_ci.vertexBindingDescriptionCount = 0;
3365 vi_ci.pVertexBindingDescriptions = nullptr;
3366 vi_ci.vertexAttributeDescriptionCount = 0;
3367 vi_ci.pVertexAttributeDescriptions = nullptr;
3368
3369 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
3370 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
3371 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3372
3373 VkPipelineRasterizationStateCreateInfo rs_ci = {};
3374 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3375 rs_ci.pNext = nullptr;
3376
3377 VkPipelineColorBlendStateCreateInfo cb_ci = {};
3378 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
3379 cb_ci.pNext = nullptr;
3380
3381 VkGraphicsPipelineCreateInfo gp_ci = {};
3382 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3383 gp_ci.stageCount = 2;
3384 gp_ci.pStages = shaderStages;
3385 gp_ci.pVertexInputState = &vi_ci;
3386 gp_ci.pInputAssemblyState = &ia_ci;
3387 gp_ci.pViewportState = &vp_state_ci;
3388 gp_ci.pRasterizationState = &rs_ci;
3389 gp_ci.pColorBlendState = &cb_ci;
3390 gp_ci.pDynamicState = &dyn_state_ci;
3391 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3392 gp_ci.layout = pipeline_layout;
3393 gp_ci.renderPass = renderPass();
3394
3395 VkPipelineCacheCreateInfo pc_ci = {};
3396 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3397
3398 VkPipeline pipeline;
3399 VkPipelineCache pipelineCache;
3400
3401 err =
3402 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
3403 ASSERT_VK_SUCCESS(err);
3404 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3405 &gp_ci, NULL, &pipeline);
3406
3407 if (!m_errorMonitor->DesiredMsgFound()) {
3408 FAIL() << "Did not recieve Error 'Gfx Pipeline scissorCount is 1, but "
3409 "pScissors is NULL...'";
3410 m_errorMonitor->DumpFailureMsgs();
3411 }
3412
3413 // Now hit second fail case where we set scissor w/ different count than PSO
3414 // First need to successfully create the PSO from above by setting
3415 // pViewports
3416 m_errorMonitor->SetDesiredFailureMsg(
3417 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3418 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
3419 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003420
Tobin Ehlisd332f282015-10-02 11:00:56 -06003421 VkRect2D sc = {}; // Just need dummy vp to point to
3422 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07003423 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3424 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003425 ASSERT_VK_SUCCESS(err);
3426 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003427 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3428 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003429 VkViewport viewports[2] = {}; // don't care about data
3430 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07003431 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003432 Draw(1, 0, 0, 0);
3433
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003434 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003435 FAIL() << "Did not receive Error 'Dynamic viewportCount from "
3436 "vkCmdSetViewport() is 2, but PSO viewportCount is 1...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003437 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisd332f282015-10-02 11:00:56 -06003438 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06003439
Chia-I Wuf7458c52015-10-26 21:10:41 +08003440 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3441 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3442 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3443 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003444}
3445
Karl Schultz6addd812016-02-02 17:17:23 -07003446TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003447 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003448 m_errorMonitor->SetDesiredFailureMsg(
3449 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003450 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003451
3452 ASSERT_NO_FATAL_FAILURE(InitState());
3453 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003454
Tony Barbourfe3351b2015-07-28 10:17:20 -06003455 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003456 // Don't care about RenderPass handle b/c error should be flagged before
3457 // that
3458 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
3459 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003460
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003461 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003462 FAIL() << "Did not receive Error 'You cannot use a NULL RenderPass "
3463 "object in vkCmdBeginRenderPass()'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003464 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003465 }
3466}
3467
Karl Schultz6addd812016-02-02 17:17:23 -07003468TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003469 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003470 m_errorMonitor->SetDesiredFailureMsg(
3471 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003472 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003473
3474 ASSERT_NO_FATAL_FAILURE(InitState());
3475 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003476
Tony Barbourfe3351b2015-07-28 10:17:20 -06003477 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003478 // Just create a dummy Renderpass that's non-NULL so we can get to the
3479 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06003480 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003481 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
3482 rp_begin.pNext = NULL;
3483 rp_begin.renderPass = renderPass();
3484 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003485
Karl Schultz6addd812016-02-02 17:17:23 -07003486 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
3487 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003488
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003489 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003490 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3491 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003492 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003493 }
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003494}
3495
Karl Schultz6addd812016-02-02 17:17:23 -07003496TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003497 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07003498 m_errorMonitor->SetDesiredFailureMsg(
3499 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003500 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003501
3502 ASSERT_NO_FATAL_FAILURE(InitState());
3503 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003504
3505 // Renderpass is started here
3506 BeginCommandBuffer();
3507
3508 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003509 vk_testing::Buffer dstBuffer;
3510 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003511
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003512 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003513
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003514 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003515 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3516 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003517 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003518 }
3519}
3520
Karl Schultz6addd812016-02-02 17:17:23 -07003521TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003522 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07003523 m_errorMonitor->SetDesiredFailureMsg(
3524 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003525 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003526
3527 ASSERT_NO_FATAL_FAILURE(InitState());
3528 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003529
3530 // Renderpass is started here
3531 BeginCommandBuffer();
3532
3533 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003534 vk_testing::Buffer dstBuffer;
3535 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003536
Karl Schultz6addd812016-02-02 17:17:23 -07003537 VkDeviceSize dstOffset = 0;
3538 VkDeviceSize dataSize = 1024;
3539 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003540
Karl Schultz6addd812016-02-02 17:17:23 -07003541 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
3542 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003543
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003544 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003545 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3546 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003547 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003548 }
3549}
3550
Karl Schultz6addd812016-02-02 17:17:23 -07003551TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003552 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003553 m_errorMonitor->SetDesiredFailureMsg(
3554 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003555 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003556
3557 ASSERT_NO_FATAL_FAILURE(InitState());
3558 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003559
3560 // Renderpass is started here
3561 BeginCommandBuffer();
3562
Michael Lentine0a369f62016-02-03 16:51:46 -06003563 VkClearColorValue clear_color;
3564 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07003565 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
3566 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3567 const int32_t tex_width = 32;
3568 const int32_t tex_height = 32;
3569 VkImageCreateInfo image_create_info = {};
3570 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3571 image_create_info.pNext = NULL;
3572 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3573 image_create_info.format = tex_format;
3574 image_create_info.extent.width = tex_width;
3575 image_create_info.extent.height = tex_height;
3576 image_create_info.extent.depth = 1;
3577 image_create_info.mipLevels = 1;
3578 image_create_info.arrayLayers = 1;
3579 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3580 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3581 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003582
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003583 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07003584 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
3585 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003586
Karl Schultz6addd812016-02-02 17:17:23 -07003587 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
3588 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003589
Karl Schultz6addd812016-02-02 17:17:23 -07003590 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
3591 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003592
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003593 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003594 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3595 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003596 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003597 }
3598}
3599
Karl Schultz6addd812016-02-02 17:17:23 -07003600TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003601 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003602 m_errorMonitor->SetDesiredFailureMsg(
3603 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003604 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003605
3606 ASSERT_NO_FATAL_FAILURE(InitState());
3607 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003608
3609 // Renderpass is started here
3610 BeginCommandBuffer();
3611
3612 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07003613 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07003614 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
3615 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3616 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
3617 image_create_info.extent.width = 64;
3618 image_create_info.extent.height = 64;
3619 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3620 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003621
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003622 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07003623 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
3624 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003625
Karl Schultz6addd812016-02-02 17:17:23 -07003626 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
3627 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003628
Karl Schultz6addd812016-02-02 17:17:23 -07003629 vkCmdClearDepthStencilImage(
3630 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
3631 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
3632 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003633
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003634 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003635 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3636 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003637 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003638 }
3639}
3640
Karl Schultz6addd812016-02-02 17:17:23 -07003641TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06003642 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003643 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003644
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003646 "vkCmdClearAttachments: This call "
3647 "must be issued inside an active "
3648 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003649
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003650 ASSERT_NO_FATAL_FAILURE(InitState());
3651 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003652
3653 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003654 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003655 ASSERT_VK_SUCCESS(err);
3656
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06003657 VkClearAttachment color_attachment;
3658 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3659 color_attachment.clearValue.color.float32[0] = 0;
3660 color_attachment.clearValue.color.float32[1] = 0;
3661 color_attachment.clearValue.color.float32[2] = 0;
3662 color_attachment.clearValue.color.float32[3] = 0;
3663 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07003664 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
3665 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
3666 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003667
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003668 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003669 FAIL() << "Did not receive Error 'vkCmdClearAttachments: This call "
3670 "must be issued inside an active render pass.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003671 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003672 }
3673}
3674
Karl Schultz6addd812016-02-02 17:17:23 -07003675TEST_F(VkLayerTest, InvalidDynamicStateObject) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003676 // Create a valid cmd buffer
3677 // call vkCmdBindDynamicStateObject w/ false DS Obj
Karl Schultz6addd812016-02-02 17:17:23 -07003678 // TODO : Simple check for bad object should be added to ObjectTracker to
3679 // catch this case
3680 // The DS check for this is after driver has been called to validate DS
3681 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003682}
Tobin Ehlis1056d452015-05-27 14:55:35 -06003683
Karl Schultz6addd812016-02-02 17:17:23 -07003684TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003685 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003686 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003687
Karl Schultz6addd812016-02-02 17:17:23 -07003688 m_errorMonitor->SetDesiredFailureMsg(
3689 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003690 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
3691
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003692 ASSERT_NO_FATAL_FAILURE(InitState());
3693 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003694 uint32_t qfi = 0;
3695 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003696 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3697 buffCI.size = 1024;
3698 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
3699 buffCI.queueFamilyIndexCount = 1;
3700 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003701
3702 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003703 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003704 ASSERT_VK_SUCCESS(err);
3705
3706 BeginCommandBuffer();
3707 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003708 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3709 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003710 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07003711 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
3712 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003713
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003714 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003715 FAIL() << "Did not receive Error 'vkCmdBindIndexBuffer() offset (0x7) "
3716 "does not fall on ...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003717 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003718 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06003719
Chia-I Wuf7458c52015-10-26 21:10:41 +08003720 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003721}
3722
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07003723TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
3724 // Create an out-of-range queueFamilyIndex
3725 m_errorMonitor->SetDesiredFailureMsg(
3726 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3727 "vkCreateBuffer has QueueFamilyIndex greater than");
3728
3729 ASSERT_NO_FATAL_FAILURE(InitState());
3730 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3731 VkBufferCreateInfo buffCI = {};
3732 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3733 buffCI.size = 1024;
3734 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
3735 buffCI.queueFamilyIndexCount = 1;
3736 // Introduce failure by specifying invalid queue_family_index
3737 uint32_t qfi = 777;
3738 buffCI.pQueueFamilyIndices = &qfi;
3739
3740 VkBuffer ib;
3741 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
3742
3743 if (!m_errorMonitor->DesiredMsgFound()) {
3744 FAIL() << "Did not receive Error 'vkCreateBuffer() has "
3745 "QueueFamilyIndex greater than...'";
3746 m_errorMonitor->DumpFailureMsgs();
3747 }
3748}
3749
Karl Schultz6addd812016-02-02 17:17:23 -07003750TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
3751 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
3752 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003753
Karl Schultz6addd812016-02-02 17:17:23 -07003754 m_errorMonitor->SetDesiredFailureMsg(
3755 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003756 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003757
3758 ASSERT_NO_FATAL_FAILURE(InitState());
3759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003760
3761 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003762 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003763 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
3764 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003765
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003766 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003767 FAIL() << "Did not receive Error 'vkCmdExecuteCommands() called w/ "
3768 "Primary Cmd Buffer '";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003769 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003770 }
3771}
3772
Karl Schultz6addd812016-02-02 17:17:23 -07003773TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003774 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07003775 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003776
Karl Schultz6addd812016-02-02 17:17:23 -07003777 m_errorMonitor->SetDesiredFailureMsg(
3778 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
3779 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
3780 "does not match ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003781
Tobin Ehlis3b780662015-05-28 12:11:26 -06003782 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003783 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003784 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003785 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3786 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003787
3788 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003789 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3790 ds_pool_ci.pNext = NULL;
3791 ds_pool_ci.maxSets = 1;
3792 ds_pool_ci.poolSizeCount = 1;
3793 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06003794
Tobin Ehlis3b780662015-05-28 12:11:26 -06003795 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003796 err =
3797 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003798 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06003799 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003800 dsl_binding.binding = 0;
3801 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3802 dsl_binding.descriptorCount = 1;
3803 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3804 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003805
Tony Barboureb254902015-07-15 12:50:33 -06003806 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003807 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3808 ds_layout_ci.pNext = NULL;
3809 ds_layout_ci.bindingCount = 1;
3810 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003811
Tobin Ehlis3b780662015-05-28 12:11:26 -06003812 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003813 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3814 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003815 ASSERT_VK_SUCCESS(err);
3816
3817 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003818 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003819 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003820 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003821 alloc_info.descriptorPool = ds_pool;
3822 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003823 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3824 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003825 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003826
Tony Barboureb254902015-07-15 12:50:33 -06003827 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003828 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3829 sampler_ci.pNext = NULL;
3830 sampler_ci.magFilter = VK_FILTER_NEAREST;
3831 sampler_ci.minFilter = VK_FILTER_NEAREST;
3832 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3833 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3834 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3835 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3836 sampler_ci.mipLodBias = 1.0;
3837 sampler_ci.anisotropyEnable = VK_FALSE;
3838 sampler_ci.maxAnisotropy = 1;
3839 sampler_ci.compareEnable = VK_FALSE;
3840 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3841 sampler_ci.minLod = 1.0;
3842 sampler_ci.maxLod = 1.0;
3843 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3844 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski52ac6582015-09-01 15:42:56 -06003845
Tobin Ehlis3b780662015-05-28 12:11:26 -06003846 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003847 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003848 ASSERT_VK_SUCCESS(err);
3849
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003850 VkDescriptorImageInfo info = {};
3851 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003852
3853 VkWriteDescriptorSet descriptor_write;
3854 memset(&descriptor_write, 0, sizeof(descriptor_write));
3855 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003856 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003857 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003858 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003859 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003860 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003861
3862 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3863
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003864 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003865 FAIL() << "Did not receive Error 'Write descriptor update has "
3866 "descriptor type VK_DESCRIPTOR_TYPE_SAMPLER that does not "
3867 "match...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003868 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06003869 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06003870
Chia-I Wuf7458c52015-10-26 21:10:41 +08003871 vkDestroySampler(m_device->device(), sampler, NULL);
3872 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3873 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003874}
3875
Karl Schultz6addd812016-02-02 17:17:23 -07003876TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003877 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07003878 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003879
Karl Schultz6addd812016-02-02 17:17:23 -07003880 m_errorMonitor->SetDesiredFailureMsg(
3881 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
3882 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
3883 "is out of bounds for matching binding");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003884
Tobin Ehlis3b780662015-05-28 12:11:26 -06003885 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003886 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003887 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003888 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3889 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003890
3891 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003892 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3893 ds_pool_ci.pNext = NULL;
3894 ds_pool_ci.maxSets = 1;
3895 ds_pool_ci.poolSizeCount = 1;
3896 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06003897
Tobin Ehlis3b780662015-05-28 12:11:26 -06003898 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003899 err =
3900 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003901 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003902
Tony Barboureb254902015-07-15 12:50:33 -06003903 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003904 dsl_binding.binding = 0;
3905 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3906 dsl_binding.descriptorCount = 1;
3907 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3908 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06003909
3910 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003911 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3912 ds_layout_ci.pNext = NULL;
3913 ds_layout_ci.bindingCount = 1;
3914 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003915
Tobin Ehlis3b780662015-05-28 12:11:26 -06003916 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003917 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3918 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003919 ASSERT_VK_SUCCESS(err);
3920
3921 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003922 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003923 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003924 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003925 alloc_info.descriptorPool = ds_pool;
3926 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003927 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3928 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003929 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003930
Tony Barboureb254902015-07-15 12:50:33 -06003931 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003932 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3933 sampler_ci.pNext = NULL;
3934 sampler_ci.magFilter = VK_FILTER_NEAREST;
3935 sampler_ci.minFilter = VK_FILTER_NEAREST;
3936 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3937 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3938 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3939 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3940 sampler_ci.mipLodBias = 1.0;
3941 sampler_ci.anisotropyEnable = VK_FALSE;
3942 sampler_ci.maxAnisotropy = 1;
3943 sampler_ci.compareEnable = VK_FALSE;
3944 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3945 sampler_ci.minLod = 1.0;
3946 sampler_ci.maxLod = 1.0;
3947 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3948 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06003949
Tobin Ehlis3b780662015-05-28 12:11:26 -06003950 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003951 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003952 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003953
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003954 VkDescriptorImageInfo info = {};
3955 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003956
3957 VkWriteDescriptorSet descriptor_write;
3958 memset(&descriptor_write, 0, sizeof(descriptor_write));
3959 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003960 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003961 descriptor_write.dstArrayElement =
3962 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08003963 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003964 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003965 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003966 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003967
3968 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3969
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003970 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003971 FAIL() << "Did not receive Error 'Descriptor update type of "
3972 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET is out of bounds for "
3973 "matching binding...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003974 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06003975 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06003976
Chia-I Wuf7458c52015-10-26 21:10:41 +08003977 vkDestroySampler(m_device->device(), sampler, NULL);
3978 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3979 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003980}
3981
Karl Schultz6addd812016-02-02 17:17:23 -07003982TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
3983 // Create layout w/ count of 1 and attempt update to that layout w/ binding
3984 // index 2
3985 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003986
Karl Schultz6addd812016-02-02 17:17:23 -07003987 m_errorMonitor->SetDesiredFailureMsg(
3988 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003989 " does not have binding to match update binding ");
3990
Tobin Ehlis3b780662015-05-28 12:11:26 -06003991 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003992 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003993 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003994 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3995 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003996
3997 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003998 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3999 ds_pool_ci.pNext = NULL;
4000 ds_pool_ci.maxSets = 1;
4001 ds_pool_ci.poolSizeCount = 1;
4002 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004003
Tobin Ehlis3b780662015-05-28 12:11:26 -06004004 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004005 err =
4006 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004007 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004008
Tony Barboureb254902015-07-15 12:50:33 -06004009 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004010 dsl_binding.binding = 0;
4011 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4012 dsl_binding.descriptorCount = 1;
4013 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4014 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06004015
4016 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004017 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4018 ds_layout_ci.pNext = NULL;
4019 ds_layout_ci.bindingCount = 1;
4020 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004021 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004022 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4023 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004024 ASSERT_VK_SUCCESS(err);
4025
4026 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004027 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004028 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004029 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004030 alloc_info.descriptorPool = ds_pool;
4031 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004032 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4033 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004034 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004035
Tony Barboureb254902015-07-15 12:50:33 -06004036 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004037 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4038 sampler_ci.pNext = NULL;
4039 sampler_ci.magFilter = VK_FILTER_NEAREST;
4040 sampler_ci.minFilter = VK_FILTER_NEAREST;
4041 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4042 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4043 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4044 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4045 sampler_ci.mipLodBias = 1.0;
4046 sampler_ci.anisotropyEnable = VK_FALSE;
4047 sampler_ci.maxAnisotropy = 1;
4048 sampler_ci.compareEnable = VK_FALSE;
4049 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4050 sampler_ci.minLod = 1.0;
4051 sampler_ci.maxLod = 1.0;
4052 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4053 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06004054
Tobin Ehlis3b780662015-05-28 12:11:26 -06004055 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004056 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004057 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004058
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004059 VkDescriptorImageInfo info = {};
4060 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004061
4062 VkWriteDescriptorSet descriptor_write;
4063 memset(&descriptor_write, 0, sizeof(descriptor_write));
4064 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004065 descriptor_write.dstSet = descriptorSet;
4066 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004067 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004068 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004069 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004070 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004071
4072 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4073
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004074 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004075 FAIL() << "Did not receive Error 'Descriptor Set <blah> does not have "
4076 "binding to match update binding '";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004077 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06004078 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004079
Chia-I Wuf7458c52015-10-26 21:10:41 +08004080 vkDestroySampler(m_device->device(), sampler, NULL);
4081 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4082 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004083}
4084
Karl Schultz6addd812016-02-02 17:17:23 -07004085TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
4086 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
4087 // types
4088 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004089
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004091 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004092
Tobin Ehlis3b780662015-05-28 12:11:26 -06004093 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004094
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004095 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004096 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4097 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004098
4099 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004100 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4101 ds_pool_ci.pNext = NULL;
4102 ds_pool_ci.maxSets = 1;
4103 ds_pool_ci.poolSizeCount = 1;
4104 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004105
Tobin Ehlis3b780662015-05-28 12:11:26 -06004106 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004107 err =
4108 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004109 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004110 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004111 dsl_binding.binding = 0;
4112 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4113 dsl_binding.descriptorCount = 1;
4114 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4115 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004116
Tony Barboureb254902015-07-15 12:50:33 -06004117 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004118 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4119 ds_layout_ci.pNext = NULL;
4120 ds_layout_ci.bindingCount = 1;
4121 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004122
Tobin Ehlis3b780662015-05-28 12:11:26 -06004123 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004124 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4125 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004126 ASSERT_VK_SUCCESS(err);
4127
4128 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004129 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004130 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004131 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004132 alloc_info.descriptorPool = ds_pool;
4133 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004134 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4135 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004136 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004137
Tony Barboureb254902015-07-15 12:50:33 -06004138 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004139 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4140 sampler_ci.pNext = NULL;
4141 sampler_ci.magFilter = VK_FILTER_NEAREST;
4142 sampler_ci.minFilter = VK_FILTER_NEAREST;
4143 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4144 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4145 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4146 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4147 sampler_ci.mipLodBias = 1.0;
4148 sampler_ci.anisotropyEnable = VK_FALSE;
4149 sampler_ci.maxAnisotropy = 1;
4150 sampler_ci.compareEnable = VK_FALSE;
4151 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4152 sampler_ci.minLod = 1.0;
4153 sampler_ci.maxLod = 1.0;
4154 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4155 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004156 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004157 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004158 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004159
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004160 VkDescriptorImageInfo info = {};
4161 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004162
4163 VkWriteDescriptorSet descriptor_write;
4164 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07004165 descriptor_write.sType =
4166 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004167 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004168 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004169 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004170 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004171 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004172
4173 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4174
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004175 if (!m_errorMonitor->DesiredMsgFound()) {
4176 FAIL() << "Did not receive Error 'Unexpected UPDATE struct of type '";
4177 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06004178 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004179
Chia-I Wuf7458c52015-10-26 21:10:41 +08004180 vkDestroySampler(m_device->device(), sampler, NULL);
4181 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4182 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004183}
4184
Karl Schultz6addd812016-02-02 17:17:23 -07004185TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004186 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07004187 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004188
Karl Schultz6addd812016-02-02 17:17:23 -07004189 m_errorMonitor->SetDesiredFailureMsg(
4190 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004191 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
4192
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004193 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004194 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
4195 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004196 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004197 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
4198 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004199
4200 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004201 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4202 ds_pool_ci.pNext = NULL;
4203 ds_pool_ci.maxSets = 1;
4204 ds_pool_ci.poolSizeCount = 1;
4205 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004206
4207 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004208 err =
4209 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004210 ASSERT_VK_SUCCESS(err);
4211
4212 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004213 dsl_binding.binding = 0;
4214 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4215 dsl_binding.descriptorCount = 1;
4216 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4217 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004218
4219 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004220 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4221 ds_layout_ci.pNext = NULL;
4222 ds_layout_ci.bindingCount = 1;
4223 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004224 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004225 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4226 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004227 ASSERT_VK_SUCCESS(err);
4228
4229 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004230 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004231 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004232 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004233 alloc_info.descriptorPool = ds_pool;
4234 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004235 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4236 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004237 ASSERT_VK_SUCCESS(err);
4238
Karl Schultz6addd812016-02-02 17:17:23 -07004239 VkSampler sampler =
4240 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004241
4242 VkDescriptorImageInfo descriptor_info;
4243 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
4244 descriptor_info.sampler = sampler;
4245
4246 VkWriteDescriptorSet descriptor_write;
4247 memset(&descriptor_write, 0, sizeof(descriptor_write));
4248 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004249 descriptor_write.dstSet = descriptorSet;
4250 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004251 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004252 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4253 descriptor_write.pImageInfo = &descriptor_info;
4254
4255 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4256
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004257 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004258 FAIL() << "Did not receive Error 'Attempt to update descriptor with "
4259 "invalid sampler...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004260 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004261 }
4262
Chia-I Wuf7458c52015-10-26 21:10:41 +08004263 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4264 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004265}
4266
Karl Schultz6addd812016-02-02 17:17:23 -07004267TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
4268 // Create a single combined Image/Sampler descriptor and send it an invalid
4269 // imageView
4270 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004271
Karl Schultz6addd812016-02-02 17:17:23 -07004272 m_errorMonitor->SetDesiredFailureMsg(
4273 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004274 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
4275
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004276 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004277 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004278 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4279 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004280
4281 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004282 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4283 ds_pool_ci.pNext = NULL;
4284 ds_pool_ci.maxSets = 1;
4285 ds_pool_ci.poolSizeCount = 1;
4286 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004287
4288 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004289 err =
4290 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004291 ASSERT_VK_SUCCESS(err);
4292
4293 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004294 dsl_binding.binding = 0;
4295 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4296 dsl_binding.descriptorCount = 1;
4297 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4298 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004299
4300 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004301 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4302 ds_layout_ci.pNext = NULL;
4303 ds_layout_ci.bindingCount = 1;
4304 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004305 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004306 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4307 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004308 ASSERT_VK_SUCCESS(err);
4309
4310 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004311 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004312 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004313 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004314 alloc_info.descriptorPool = ds_pool;
4315 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004316 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4317 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004318 ASSERT_VK_SUCCESS(err);
4319
4320 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004321 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4322 sampler_ci.pNext = NULL;
4323 sampler_ci.magFilter = VK_FILTER_NEAREST;
4324 sampler_ci.minFilter = VK_FILTER_NEAREST;
4325 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4326 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4327 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4328 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4329 sampler_ci.mipLodBias = 1.0;
4330 sampler_ci.anisotropyEnable = VK_FALSE;
4331 sampler_ci.maxAnisotropy = 1;
4332 sampler_ci.compareEnable = VK_FALSE;
4333 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4334 sampler_ci.minLod = 1.0;
4335 sampler_ci.maxLod = 1.0;
4336 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4337 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004338
4339 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004340 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004341 ASSERT_VK_SUCCESS(err);
4342
Karl Schultz6addd812016-02-02 17:17:23 -07004343 VkImageView view =
4344 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004345
4346 VkDescriptorImageInfo descriptor_info;
4347 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
4348 descriptor_info.sampler = sampler;
4349 descriptor_info.imageView = view;
4350
4351 VkWriteDescriptorSet descriptor_write;
4352 memset(&descriptor_write, 0, sizeof(descriptor_write));
4353 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004354 descriptor_write.dstSet = descriptorSet;
4355 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004356 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004357 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4358 descriptor_write.pImageInfo = &descriptor_info;
4359
4360 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4361
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004362 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004363 FAIL() << "Did not receive Error 'Attempt to update descriptor with "
4364 "invalid imageView...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004365 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004366 }
4367
Chia-I Wuf7458c52015-10-26 21:10:41 +08004368 vkDestroySampler(m_device->device(), sampler, NULL);
4369 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4370 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004371}
4372
Karl Schultz6addd812016-02-02 17:17:23 -07004373TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
4374 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
4375 // into the other
4376 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004377
Karl Schultz6addd812016-02-02 17:17:23 -07004378 m_errorMonitor->SetDesiredFailureMsg(
4379 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Copy descriptor update index 0, update "
4380 "count #1, has src update descriptor "
4381 "type VK_DESCRIPTOR_TYPE_SAMPLER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004382
Tobin Ehlis04356f92015-10-27 16:35:27 -06004383 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004384 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004385 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004386 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4387 ds_type_count[0].descriptorCount = 1;
4388 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
4389 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004390
4391 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004392 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4393 ds_pool_ci.pNext = NULL;
4394 ds_pool_ci.maxSets = 1;
4395 ds_pool_ci.poolSizeCount = 2;
4396 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004397
4398 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004399 err =
4400 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004401 ASSERT_VK_SUCCESS(err);
4402 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004403 dsl_binding[0].binding = 0;
4404 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4405 dsl_binding[0].descriptorCount = 1;
4406 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4407 dsl_binding[0].pImmutableSamplers = NULL;
4408 dsl_binding[1].binding = 1;
4409 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4410 dsl_binding[1].descriptorCount = 1;
4411 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
4412 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004413
4414 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004415 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4416 ds_layout_ci.pNext = NULL;
4417 ds_layout_ci.bindingCount = 2;
4418 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004419
4420 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004421 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4422 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004423 ASSERT_VK_SUCCESS(err);
4424
4425 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004426 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004427 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004428 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004429 alloc_info.descriptorPool = ds_pool;
4430 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004431 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4432 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004433 ASSERT_VK_SUCCESS(err);
4434
4435 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004436 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4437 sampler_ci.pNext = NULL;
4438 sampler_ci.magFilter = VK_FILTER_NEAREST;
4439 sampler_ci.minFilter = VK_FILTER_NEAREST;
4440 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4441 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4442 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4443 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4444 sampler_ci.mipLodBias = 1.0;
4445 sampler_ci.anisotropyEnable = VK_FALSE;
4446 sampler_ci.maxAnisotropy = 1;
4447 sampler_ci.compareEnable = VK_FALSE;
4448 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4449 sampler_ci.minLod = 1.0;
4450 sampler_ci.maxLod = 1.0;
4451 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4452 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004453
4454 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004455 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004456 ASSERT_VK_SUCCESS(err);
4457
4458 VkDescriptorImageInfo info = {};
4459 info.sampler = sampler;
4460
4461 VkWriteDescriptorSet descriptor_write;
4462 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
4463 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004464 descriptor_write.dstSet = descriptorSet;
4465 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08004466 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004467 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4468 descriptor_write.pImageInfo = &info;
4469 // This write update should succeed
4470 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4471 // Now perform a copy update that fails due to type mismatch
4472 VkCopyDescriptorSet copy_ds_update;
4473 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4474 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4475 copy_ds_update.srcSet = descriptorSet;
4476 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004477 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004478 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08004479 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06004480 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4481
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004482 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004483 FAIL() << "Did not receive Error 'Copy descriptor update index 0, "
4484 "update count #1, has src update descriptor "
4485 "type_DESCRIPTOR_TYPE_SAMPLER'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004486 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis04356f92015-10-27 16:35:27 -06004487 }
4488 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07004489 m_errorMonitor->SetDesiredFailureMsg(
4490 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004491 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis04356f92015-10-27 16:35:27 -06004492 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4493 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4494 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004495 copy_ds_update.srcBinding =
4496 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004497 copy_ds_update.dstSet = descriptorSet;
4498 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004499 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06004500 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4501
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004502 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004503 FAIL() << "Did not receive Error 'Copy descriptor update 0 has "
4504 "srcBinding 3 which is out of bounds...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004505 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis04356f92015-10-27 16:35:27 -06004506 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004507
Tobin Ehlis04356f92015-10-27 16:35:27 -06004508 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07004509 m_errorMonitor->SetDesiredFailureMsg(
4510 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004511 "Copy descriptor src update is out of bounds for matching binding 1 ");
4512
Tobin Ehlis04356f92015-10-27 16:35:27 -06004513 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4514 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4515 copy_ds_update.srcSet = descriptorSet;
4516 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004517 copy_ds_update.dstSet = descriptorSet;
4518 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004519 copy_ds_update.descriptorCount =
4520 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06004521 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4522
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004523 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004524 FAIL() << "Did not receive Error 'Copy descriptor src update is out of "
4525 "bounds for matching binding 1...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004526 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis04356f92015-10-27 16:35:27 -06004527 }
4528
Chia-I Wuf7458c52015-10-26 21:10:41 +08004529 vkDestroySampler(m_device->device(), sampler, NULL);
4530 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4531 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004532}
4533
Karl Schultz6addd812016-02-02 17:17:23 -07004534TEST_F(VkLayerTest, NumSamplesMismatch) {
4535 // Create CommandBuffer where MSAA samples doesn't match RenderPass
4536 // sampleCount
4537 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004538
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004540 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004541
Tobin Ehlis3b780662015-05-28 12:11:26 -06004542 ASSERT_NO_FATAL_FAILURE(InitState());
4543 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004544 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06004545 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004546 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004547
4548 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004549 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4550 ds_pool_ci.pNext = NULL;
4551 ds_pool_ci.maxSets = 1;
4552 ds_pool_ci.poolSizeCount = 1;
4553 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004554
Tobin Ehlis3b780662015-05-28 12:11:26 -06004555 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004556 err =
4557 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004558 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004559
Tony Barboureb254902015-07-15 12:50:33 -06004560 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08004561 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06004562 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08004563 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004564 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4565 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004566
Tony Barboureb254902015-07-15 12:50:33 -06004567 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4568 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4569 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004570 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004571 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004572
Tobin Ehlis3b780662015-05-28 12:11:26 -06004573 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004574 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4575 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004576 ASSERT_VK_SUCCESS(err);
4577
4578 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004579 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004580 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004581 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004582 alloc_info.descriptorPool = ds_pool;
4583 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004584 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4585 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004586 ASSERT_VK_SUCCESS(err);
4587
Tony Barboureb254902015-07-15 12:50:33 -06004588 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004589 pipe_ms_state_ci.sType =
4590 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4591 pipe_ms_state_ci.pNext = NULL;
4592 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
4593 pipe_ms_state_ci.sampleShadingEnable = 0;
4594 pipe_ms_state_ci.minSampleShading = 1.0;
4595 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004596
Tony Barboureb254902015-07-15 12:50:33 -06004597 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004598 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4599 pipeline_layout_ci.pNext = NULL;
4600 pipeline_layout_ci.setLayoutCount = 1;
4601 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004602
4603 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004604 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4605 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004606 ASSERT_VK_SUCCESS(err);
4607
Karl Schultz6addd812016-02-02 17:17:23 -07004608 VkShaderObj vs(m_device, bindStateVertShaderText,
4609 VK_SHADER_STAGE_VERTEX_BIT, this);
4610 VkShaderObj fs(m_device, bindStateFragShaderText,
4611 VK_SHADER_STAGE_FRAGMENT_BIT,
4612 this); // TODO - We shouldn't need a fragment shader
4613 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004614 VkPipelineObj pipe(m_device);
4615 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004616 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004617 pipe.SetMSAA(&pipe_ms_state_ci);
4618 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06004619
Tony Barbourfe3351b2015-07-28 10:17:20 -06004620 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004621 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4622 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06004623
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004624 if (!m_errorMonitor->DesiredMsgFound()) {
4625 FAIL() << "Did not recieve Error 'Num samples mismatch!...'";
4626 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06004627 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004628
Chia-I Wuf7458c52015-10-26 21:10:41 +08004629 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4630 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4631 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004632}
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004633
Karl Schultz6addd812016-02-02 17:17:23 -07004634TEST_F(VkLayerTest, ClearCmdNoDraw) {
4635 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
4636 // to issuing a Draw
4637 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004638
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004639 // TODO: verify that this matches layer
Karl Schultz6addd812016-02-02 17:17:23 -07004640 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004641 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004642 "vkCmdClearAttachments() issued on CB object ");
4643
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004644 ASSERT_NO_FATAL_FAILURE(InitState());
4645 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06004646
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004647 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004648 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4649 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004650
4651 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004652 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4653 ds_pool_ci.pNext = NULL;
4654 ds_pool_ci.maxSets = 1;
4655 ds_pool_ci.poolSizeCount = 1;
4656 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004657
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004658 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004659 err =
4660 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004661 ASSERT_VK_SUCCESS(err);
4662
Tony Barboureb254902015-07-15 12:50:33 -06004663 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004664 dsl_binding.binding = 0;
4665 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4666 dsl_binding.descriptorCount = 1;
4667 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4668 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004669
Tony Barboureb254902015-07-15 12:50:33 -06004670 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004671 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4672 ds_layout_ci.pNext = NULL;
4673 ds_layout_ci.bindingCount = 1;
4674 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004675
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004676 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004677 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4678 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004679 ASSERT_VK_SUCCESS(err);
4680
4681 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004682 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004683 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004684 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004685 alloc_info.descriptorPool = ds_pool;
4686 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004687 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4688 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004689 ASSERT_VK_SUCCESS(err);
4690
Tony Barboureb254902015-07-15 12:50:33 -06004691 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004692 pipe_ms_state_ci.sType =
4693 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4694 pipe_ms_state_ci.pNext = NULL;
4695 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
4696 pipe_ms_state_ci.sampleShadingEnable = 0;
4697 pipe_ms_state_ci.minSampleShading = 1.0;
4698 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004699
Tony Barboureb254902015-07-15 12:50:33 -06004700 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004701 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4702 pipeline_layout_ci.pNext = NULL;
4703 pipeline_layout_ci.setLayoutCount = 1;
4704 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004705
4706 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004707 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4708 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004709 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004710
Karl Schultz6addd812016-02-02 17:17:23 -07004711 VkShaderObj vs(m_device, bindStateVertShaderText,
4712 VK_SHADER_STAGE_VERTEX_BIT, this);
4713 // TODO - We shouldn't need a fragment shader but add it to be able to run
4714 // on more devices
4715 VkShaderObj fs(m_device, bindStateFragShaderText,
4716 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004717
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004718 VkPipelineObj pipe(m_device);
4719 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004720 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004721 pipe.SetMSAA(&pipe_ms_state_ci);
4722 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06004723
4724 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004725
Karl Schultz6addd812016-02-02 17:17:23 -07004726 // Main thing we care about for this test is that the VkImage obj we're
4727 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004728 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004729 VkClearAttachment color_attachment;
4730 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4731 color_attachment.clearValue.color.float32[0] = 1.0;
4732 color_attachment.clearValue.color.float32[1] = 1.0;
4733 color_attachment.clearValue.color.float32[2] = 1.0;
4734 color_attachment.clearValue.color.float32[3] = 1.0;
4735 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004736 VkClearRect clear_rect = {
4737 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004738
Karl Schultz6addd812016-02-02 17:17:23 -07004739 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4740 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004741
4742 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004743 FAIL() << "Did not receive Error 'vkCommandClearAttachments() issued "
4744 "on CB object...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004745 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004746 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004747
Chia-I Wuf7458c52015-10-26 21:10:41 +08004748 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4749 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4750 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004751}
4752
Karl Schultz6addd812016-02-02 17:17:23 -07004753TEST_F(VkLayerTest, VtxBufferBadIndex) {
4754 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004755
Karl Schultz6addd812016-02-02 17:17:23 -07004756 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004757 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07004758 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004759
Tobin Ehlis502480b2015-06-24 15:53:07 -06004760 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06004761 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06004762 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06004763
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004764 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004765 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4766 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004767
4768 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004769 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4770 ds_pool_ci.pNext = NULL;
4771 ds_pool_ci.maxSets = 1;
4772 ds_pool_ci.poolSizeCount = 1;
4773 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004774
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004775 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004776 err =
4777 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004778 ASSERT_VK_SUCCESS(err);
4779
Tony Barboureb254902015-07-15 12:50:33 -06004780 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004781 dsl_binding.binding = 0;
4782 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4783 dsl_binding.descriptorCount = 1;
4784 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4785 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004786
Tony Barboureb254902015-07-15 12:50:33 -06004787 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004788 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4789 ds_layout_ci.pNext = NULL;
4790 ds_layout_ci.bindingCount = 1;
4791 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004792
Tobin Ehlis502480b2015-06-24 15:53:07 -06004793 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004794 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4795 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004796 ASSERT_VK_SUCCESS(err);
4797
4798 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004799 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004800 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004801 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004802 alloc_info.descriptorPool = ds_pool;
4803 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004804 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4805 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004806 ASSERT_VK_SUCCESS(err);
4807
Tony Barboureb254902015-07-15 12:50:33 -06004808 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004809 pipe_ms_state_ci.sType =
4810 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4811 pipe_ms_state_ci.pNext = NULL;
4812 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
4813 pipe_ms_state_ci.sampleShadingEnable = 0;
4814 pipe_ms_state_ci.minSampleShading = 1.0;
4815 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004816
Tony Barboureb254902015-07-15 12:50:33 -06004817 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004818 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4819 pipeline_layout_ci.pNext = NULL;
4820 pipeline_layout_ci.setLayoutCount = 1;
4821 pipeline_layout_ci.pSetLayouts = &ds_layout;
4822 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004823
Karl Schultz6addd812016-02-02 17:17:23 -07004824 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4825 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004826 ASSERT_VK_SUCCESS(err);
4827
Karl Schultz6addd812016-02-02 17:17:23 -07004828 VkShaderObj vs(m_device, bindStateVertShaderText,
4829 VK_SHADER_STAGE_VERTEX_BIT, this);
4830 VkShaderObj fs(m_device, bindStateFragShaderText,
4831 VK_SHADER_STAGE_FRAGMENT_BIT,
4832 this); // TODO - We shouldn't need a fragment shader
4833 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004834 VkPipelineObj pipe(m_device);
4835 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004836 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004837 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004838 pipe.SetViewport(m_viewports);
4839 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004840 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06004841
4842 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004843 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4844 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06004845 // Don't care about actual data, just need to get to draw to flag error
4846 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07004847 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
4848 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06004849 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06004850 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004851
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004852 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004853 FAIL() << "Did not receive Error 'Vtx Buffer Index 0 was bound, but no "
4854 "vtx buffers are attached to PSO.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004855 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis502480b2015-06-24 15:53:07 -06004856 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004857
Chia-I Wuf7458c52015-10-26 21:10:41 +08004858 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4859 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4860 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004861}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004862#endif // DRAW_STATE_TESTS
4863
Tobin Ehlis0788f522015-05-26 16:11:58 -06004864#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06004865#if GTEST_IS_THREADSAFE
4866struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004867 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004868 VkEvent event;
4869 bool bailout;
4870};
4871
Karl Schultz6addd812016-02-02 17:17:23 -07004872extern "C" void *AddToCommandBuffer(void *arg) {
4873 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004874
Karl Schultz6addd812016-02-02 17:17:23 -07004875 for (int i = 0; i < 10000; i++) {
4876 vkCmdSetEvent(data->commandBuffer, data->event,
4877 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004878 if (data->bailout) {
4879 break;
4880 }
4881 }
4882 return NULL;
4883}
4884
Karl Schultz6addd812016-02-02 17:17:23 -07004885TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004886 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004887
Karl Schultz6addd812016-02-02 17:17:23 -07004888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4889 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004890
Mike Stroyanaccf7692015-05-12 16:00:45 -06004891 ASSERT_NO_FATAL_FAILURE(InitState());
4892 ASSERT_NO_FATAL_FAILURE(InitViewport());
4893 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4894
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004895 // Calls AllocateCommandBuffers
4896 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06004897
4898 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004899 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004900
4901 VkEventCreateInfo event_info;
4902 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004903 VkResult err;
4904
4905 memset(&event_info, 0, sizeof(event_info));
4906 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4907
Chia-I Wuf7458c52015-10-26 21:10:41 +08004908 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004909 ASSERT_VK_SUCCESS(err);
4910
Mike Stroyanaccf7692015-05-12 16:00:45 -06004911 err = vkResetEvent(device(), event);
4912 ASSERT_VK_SUCCESS(err);
4913
4914 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004915 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004916 data.event = event;
4917 data.bailout = false;
4918 m_errorMonitor->SetBailout(&data.bailout);
4919 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004920 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004921 // Add many entries to command buffer from this thread at the same time.
4922 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06004923
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004924 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004925 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004926
Mike Stroyan10b8cb72016-01-22 15:22:03 -07004927 m_errorMonitor->SetBailout(NULL);
4928
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004929 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004930 FAIL() << "Did not receive Error 'THREADING ERROR' from using one "
4931 "VkCommandBufferObj in two threads";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004932 m_errorMonitor->DumpFailureMsgs();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004933 }
4934
Chia-I Wuf7458c52015-10-26 21:10:41 +08004935 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004936}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004937#endif // GTEST_IS_THREADSAFE
4938#endif // THREADING_TESTS
4939
Chris Forbes9f7ff632015-05-25 11:13:08 +12004940#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07004941TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004943 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004944
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004945 ASSERT_NO_FATAL_FAILURE(InitState());
4946 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4947
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004948 VkShaderModule module;
4949 VkShaderModuleCreateInfo moduleCreateInfo;
4950 struct icd_spv_header spv;
4951
4952 spv.magic = ICD_SPV_MAGIC;
4953 spv.version = ICD_SPV_VERSION;
4954 spv.gen_magic = 0;
4955
4956 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4957 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07004958 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004959 moduleCreateInfo.codeSize = 4;
4960 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004961 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004962
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004963 if (!m_errorMonitor->DesiredMsgFound()) {
4964 FAIL() << "Did not recieive Error 'Shader is not SPIR-V'";
4965 m_errorMonitor->DumpFailureMsgs();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004966 }
4967}
4968
Karl Schultz6addd812016-02-02 17:17:23 -07004969TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004971 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004972
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004973 ASSERT_NO_FATAL_FAILURE(InitState());
4974 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4975
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004976 VkShaderModule module;
4977 VkShaderModuleCreateInfo moduleCreateInfo;
4978 struct icd_spv_header spv;
4979
4980 spv.magic = ~ICD_SPV_MAGIC;
4981 spv.version = ICD_SPV_VERSION;
4982 spv.gen_magic = 0;
4983
4984 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4985 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07004986 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004987 moduleCreateInfo.codeSize = sizeof(spv) + 10;
4988 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004989 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004990
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004991 if (!m_errorMonitor->DesiredMsgFound()) {
4992 FAIL() << "Did not recieive Error 'Shader is not SPIR-V'";
4993 m_errorMonitor->DumpFailureMsgs();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004994 }
4995}
4996
Karl Schultz6addd812016-02-02 17:17:23 -07004997TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004999 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005000
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005001 ASSERT_NO_FATAL_FAILURE(InitState());
5002 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5003
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005004 VkShaderModule module;
5005 VkShaderModuleCreateInfo moduleCreateInfo;
5006 struct icd_spv_header spv;
5007
5008 spv.magic = ICD_SPV_MAGIC;
5009 spv.version = ~ICD_SPV_VERSION;
5010 spv.gen_magic = 0;
5011
5012 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
5013 moduleCreateInfo.pNext = NULL;
5014
Karl Schultz6addd812016-02-02 17:17:23 -07005015 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005016 moduleCreateInfo.codeSize = sizeof(spv) + 10;
5017 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005018 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005019
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005020 if (!m_errorMonitor->DesiredMsgFound()) {
5021 FAIL() << "Did not recieive Error 'Shader is not SPIR-V'";
5022 m_errorMonitor->DumpFailureMsgs();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005023 }
5024}
5025
Karl Schultz6addd812016-02-02 17:17:23 -07005026TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005028 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005029
Chris Forbes9f7ff632015-05-25 11:13:08 +12005030 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005031 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12005032
5033 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005034 "#version 400\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005035 "#extension GL_ARB_separate_shader_objects: require\n"
5036 "#extension GL_ARB_shading_language_420pack: require\n"
5037 "\n"
5038 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005039 "out gl_PerVertex {\n"
5040 " vec4 gl_Position;\n"
5041 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005042 "void main(){\n"
5043 " gl_Position = vec4(1);\n"
5044 " x = 0;\n"
5045 "}\n";
5046 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005047 "#version 400\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005048 "#extension GL_ARB_separate_shader_objects: require\n"
5049 "#extension GL_ARB_shading_language_420pack: require\n"
5050 "\n"
5051 "layout(location=0) out vec4 color;\n"
5052 "void main(){\n"
5053 " color = vec4(1);\n"
5054 "}\n";
5055
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005056 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5057 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12005058
5059 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005060 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12005061 pipe.AddShader(&vs);
5062 pipe.AddShader(&fs);
5063
Chris Forbes9f7ff632015-05-25 11:13:08 +12005064 VkDescriptorSetObj descriptorSet(m_device);
5065 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005066 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12005067
Tony Barbour5781e8f2015-08-04 16:23:11 -06005068 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12005069
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005070 if (!m_errorMonitor->DesiredMsgFound()) {
5071 FAIL() << "Did not receive Warning 'not consumed by fragment shader'";
5072 m_errorMonitor->DumpFailureMsgs();
Chris Forbes9f7ff632015-05-25 11:13:08 +12005073 }
5074}
Chris Forbes9f7ff632015-05-25 11:13:08 +12005075
Karl Schultz6addd812016-02-02 17:17:23 -07005076TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005078 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005079
Chris Forbes59cb88d2015-05-25 11:13:13 +12005080 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005081 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12005082
5083 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005084 "#version 400\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005085 "#extension GL_ARB_separate_shader_objects: require\n"
5086 "#extension GL_ARB_shading_language_420pack: require\n"
5087 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005088 "out gl_PerVertex {\n"
5089 " vec4 gl_Position;\n"
5090 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005091 "void main(){\n"
5092 " gl_Position = vec4(1);\n"
5093 "}\n";
5094 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005095 "#version 400\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005096 "#extension GL_ARB_separate_shader_objects: require\n"
5097 "#extension GL_ARB_shading_language_420pack: require\n"
5098 "\n"
5099 "layout(location=0) in float x;\n"
5100 "layout(location=0) out vec4 color;\n"
5101 "void main(){\n"
5102 " color = vec4(x);\n"
5103 "}\n";
5104
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005105 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5106 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12005107
5108 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005109 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12005110 pipe.AddShader(&vs);
5111 pipe.AddShader(&fs);
5112
Chris Forbes59cb88d2015-05-25 11:13:13 +12005113 VkDescriptorSetObj descriptorSet(m_device);
5114 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005115 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12005116
Tony Barbour5781e8f2015-08-04 16:23:11 -06005117 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12005118
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005119 if (!m_errorMonitor->DesiredMsgFound()) {
5120 FAIL() << "Did not receive Error 'not written by vertex shader'";
5121 m_errorMonitor->DumpFailureMsgs();
Chris Forbes59cb88d2015-05-25 11:13:13 +12005122 }
5123}
5124
Karl Schultz6addd812016-02-02 17:17:23 -07005125TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13005126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005127 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13005128
5129 ASSERT_NO_FATAL_FAILURE(InitState());
5130 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5131
5132 char const *vsSource =
5133 "#version 400\n"
5134 "#extension GL_ARB_separate_shader_objects: require\n"
5135 "#extension GL_ARB_shading_language_420pack: require\n"
5136 "\n"
5137 "out gl_PerVertex {\n"
5138 " vec4 gl_Position;\n"
5139 "};\n"
5140 "void main(){\n"
5141 " gl_Position = vec4(1);\n"
5142 "}\n";
5143 char const *fsSource =
5144 "#version 450\n"
5145 "#extension GL_ARB_separate_shader_objects: require\n"
5146 "#extension GL_ARB_shading_language_420pack: require\n"
5147 "\n"
5148 "in block { layout(location=0) float x; } ins;\n"
5149 "layout(location=0) out vec4 color;\n"
5150 "void main(){\n"
5151 " color = vec4(ins.x);\n"
5152 "}\n";
5153
5154 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5155 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5156
5157 VkPipelineObj pipe(m_device);
5158 pipe.AddColorAttachment();
5159 pipe.AddShader(&vs);
5160 pipe.AddShader(&fs);
5161
5162 VkDescriptorSetObj descriptorSet(m_device);
5163 descriptorSet.AppendDummy();
5164 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5165
5166 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5167
5168 if (!m_errorMonitor->DesiredMsgFound()) {
5169 FAIL() << "Did not receive Error 'not written by vertex shader'";
5170 m_errorMonitor->DumpFailureMsgs();
5171 }
5172}
5173
Karl Schultz6addd812016-02-02 17:17:23 -07005174TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13005175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13005176 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07005177 "output arr[2] of float32' vs 'ptr to "
5178 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13005179
5180 ASSERT_NO_FATAL_FAILURE(InitState());
5181 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5182
5183 char const *vsSource =
5184 "#version 400\n"
5185 "#extension GL_ARB_separate_shader_objects: require\n"
5186 "#extension GL_ARB_shading_language_420pack: require\n"
5187 "\n"
5188 "layout(location=0) out float x[2];\n"
5189 "out gl_PerVertex {\n"
5190 " vec4 gl_Position;\n"
5191 "};\n"
5192 "void main(){\n"
5193 " x[0] = 0; x[1] = 0;\n"
5194 " gl_Position = vec4(1);\n"
5195 "}\n";
5196 char const *fsSource =
5197 "#version 400\n"
5198 "#extension GL_ARB_separate_shader_objects: require\n"
5199 "#extension GL_ARB_shading_language_420pack: require\n"
5200 "\n"
5201 "layout(location=0) in float x[3];\n"
5202 "layout(location=0) out vec4 color;\n"
5203 "void main(){\n"
5204 " color = vec4(x[0] + x[1] + x[2]);\n"
5205 "}\n";
5206
5207 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5208 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5209
5210 VkPipelineObj pipe(m_device);
5211 pipe.AddColorAttachment();
5212 pipe.AddShader(&vs);
5213 pipe.AddShader(&fs);
5214
5215 VkDescriptorSetObj descriptorSet(m_device);
5216 descriptorSet.AppendDummy();
5217 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5218
5219 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5220
5221 if (!m_errorMonitor->DesiredMsgFound()) {
5222 m_errorMonitor->DumpFailureMsgs();
Chris Forbese9928822016-02-17 14:44:52 +13005223 FAIL() << "Did not receive Error 'Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07005224 "output arr[2] of float32' vs 'ptr to input arr[3] of "
5225 "float32''";
Chris Forbes0036fd12016-01-26 14:19:49 +13005226 }
5227}
5228
Karl Schultz6addd812016-02-02 17:17:23 -07005229TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005231 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005232
Chris Forbesb56af562015-05-25 11:13:17 +12005233 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005234 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12005235
5236 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005237 "#version 400\n"
Chris Forbesb56af562015-05-25 11:13:17 +12005238 "#extension GL_ARB_separate_shader_objects: require\n"
5239 "#extension GL_ARB_shading_language_420pack: require\n"
5240 "\n"
5241 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005242 "out gl_PerVertex {\n"
5243 " vec4 gl_Position;\n"
5244 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12005245 "void main(){\n"
5246 " x = 0;\n"
5247 " gl_Position = vec4(1);\n"
5248 "}\n";
5249 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005250 "#version 400\n"
Chris Forbesb56af562015-05-25 11:13:17 +12005251 "#extension GL_ARB_separate_shader_objects: require\n"
5252 "#extension GL_ARB_shading_language_420pack: require\n"
5253 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005254 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12005255 "layout(location=0) out vec4 color;\n"
5256 "void main(){\n"
5257 " color = vec4(x);\n"
5258 "}\n";
5259
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005260 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5261 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12005262
5263 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005264 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12005265 pipe.AddShader(&vs);
5266 pipe.AddShader(&fs);
5267
Chris Forbesb56af562015-05-25 11:13:17 +12005268 VkDescriptorSetObj descriptorSet(m_device);
5269 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005270 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12005271
Tony Barbour5781e8f2015-08-04 16:23:11 -06005272 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12005273
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005274 if (!m_errorMonitor->DesiredMsgFound()) {
5275 FAIL() << "Did not receive Error 'Type mismatch on location 0'";
5276 m_errorMonitor->DumpFailureMsgs();
Chris Forbesb56af562015-05-25 11:13:17 +12005277 }
5278}
5279
Karl Schultz6addd812016-02-02 17:17:23 -07005280TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13005281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005282 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13005283
5284 ASSERT_NO_FATAL_FAILURE(InitState());
5285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5286
5287 char const *vsSource =
5288 "#version 450\n"
5289 "#extension GL_ARB_separate_shader_objects: require\n"
5290 "#extension GL_ARB_shading_language_420pack: require\n"
5291 "\n"
5292 "out block { layout(location=0) int x; } outs;\n"
5293 "out gl_PerVertex {\n"
5294 " vec4 gl_Position;\n"
5295 "};\n"
5296 "void main(){\n"
5297 " outs.x = 0;\n"
5298 " gl_Position = vec4(1);\n"
5299 "}\n";
5300 char const *fsSource =
5301 "#version 450\n"
5302 "#extension GL_ARB_separate_shader_objects: require\n"
5303 "#extension GL_ARB_shading_language_420pack: require\n"
5304 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005305 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13005306 "layout(location=0) out vec4 color;\n"
5307 "void main(){\n"
5308 " color = vec4(ins.x);\n"
5309 "}\n";
5310
5311 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5312 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5313
5314 VkPipelineObj pipe(m_device);
5315 pipe.AddColorAttachment();
5316 pipe.AddShader(&vs);
5317 pipe.AddShader(&fs);
5318
5319 VkDescriptorSetObj descriptorSet(m_device);
5320 descriptorSet.AppendDummy();
5321 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5322
5323 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5324
5325 if (!m_errorMonitor->DesiredMsgFound()) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13005326 m_errorMonitor->DumpFailureMsgs();
Chris Forbese9928822016-02-17 14:44:52 +13005327 FAIL() << "Did not receive Error 'Type mismatch on location 0'";
5328 }
5329}
5330
5331TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
5332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5333 "location 0.0 which is not written by vertex shader");
5334
5335 ASSERT_NO_FATAL_FAILURE(InitState());
5336 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5337
5338 char const *vsSource =
5339 "#version 450\n"
5340 "#extension GL_ARB_separate_shader_objects: require\n"
5341 "#extension GL_ARB_shading_language_420pack: require\n"
5342 "\n"
5343 "out block { layout(location=1) float x; } outs;\n"
5344 "out gl_PerVertex {\n"
5345 " vec4 gl_Position;\n"
5346 "};\n"
5347 "void main(){\n"
5348 " outs.x = 0;\n"
5349 " gl_Position = vec4(1);\n"
5350 "}\n";
5351 char const *fsSource =
5352 "#version 450\n"
5353 "#extension GL_ARB_separate_shader_objects: require\n"
5354 "#extension GL_ARB_shading_language_420pack: require\n"
5355 "\n"
5356 "in block { layout(location=0) float x; } ins;\n"
5357 "layout(location=0) out vec4 color;\n"
5358 "void main(){\n"
5359 " color = vec4(ins.x);\n"
5360 "}\n";
5361
5362 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5363 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5364
5365 VkPipelineObj pipe(m_device);
5366 pipe.AddColorAttachment();
5367 pipe.AddShader(&vs);
5368 pipe.AddShader(&fs);
5369
5370 VkDescriptorSetObj descriptorSet(m_device);
5371 descriptorSet.AppendDummy();
5372 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5373
5374 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5375
5376 if (!m_errorMonitor->DesiredMsgFound()) {
5377 m_errorMonitor->DumpFailureMsgs();
5378 FAIL() << "Did not receive Error 'location 0.0 which is not written by vertex shader'";
5379 }
5380}
5381
5382TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
5383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5384 "location 0.1 which is not written by vertex shader");
5385
5386 ASSERT_NO_FATAL_FAILURE(InitState());
5387 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5388
5389 char const *vsSource =
5390 "#version 450\n"
5391 "#extension GL_ARB_separate_shader_objects: require\n"
5392 "#extension GL_ARB_shading_language_420pack: require\n"
5393 "\n"
5394 "out block { layout(location=0, component=0) float x; } outs;\n"
5395 "out gl_PerVertex {\n"
5396 " vec4 gl_Position;\n"
5397 "};\n"
5398 "void main(){\n"
5399 " outs.x = 0;\n"
5400 " gl_Position = vec4(1);\n"
5401 "}\n";
5402 char const *fsSource =
5403 "#version 450\n"
5404 "#extension GL_ARB_separate_shader_objects: require\n"
5405 "#extension GL_ARB_shading_language_420pack: require\n"
5406 "\n"
5407 "in block { layout(location=0, component=1) float x; } ins;\n"
5408 "layout(location=0) out vec4 color;\n"
5409 "void main(){\n"
5410 " color = vec4(ins.x);\n"
5411 "}\n";
5412
5413 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5414 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5415
5416 VkPipelineObj pipe(m_device);
5417 pipe.AddColorAttachment();
5418 pipe.AddShader(&vs);
5419 pipe.AddShader(&fs);
5420
5421 VkDescriptorSetObj descriptorSet(m_device);
5422 descriptorSet.AppendDummy();
5423 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5424
5425 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5426
5427 if (!m_errorMonitor->DesiredMsgFound()) {
5428 m_errorMonitor->DumpFailureMsgs();
5429 FAIL() << "Did not receive Error 'location 0.1 which is not written by vertex shader'";
Chris Forbesa3e85f62016-01-15 14:53:11 +13005430 }
5431}
5432
Karl Schultz6addd812016-02-02 17:17:23 -07005433TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005435 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005436
Chris Forbesde136e02015-05-25 11:13:28 +12005437 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005438 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12005439
5440 VkVertexInputBindingDescription input_binding;
5441 memset(&input_binding, 0, sizeof(input_binding));
5442
5443 VkVertexInputAttributeDescription input_attrib;
5444 memset(&input_attrib, 0, sizeof(input_attrib));
5445 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5446
5447 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005448 "#version 400\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005449 "#extension GL_ARB_separate_shader_objects: require\n"
5450 "#extension GL_ARB_shading_language_420pack: require\n"
5451 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005452 "out gl_PerVertex {\n"
5453 " vec4 gl_Position;\n"
5454 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005455 "void main(){\n"
5456 " gl_Position = vec4(1);\n"
5457 "}\n";
5458 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005459 "#version 400\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005460 "#extension GL_ARB_separate_shader_objects: require\n"
5461 "#extension GL_ARB_shading_language_420pack: require\n"
5462 "\n"
5463 "layout(location=0) out vec4 color;\n"
5464 "void main(){\n"
5465 " color = vec4(1);\n"
5466 "}\n";
5467
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005468 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5469 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12005470
5471 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005472 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12005473 pipe.AddShader(&vs);
5474 pipe.AddShader(&fs);
5475
5476 pipe.AddVertexInputBindings(&input_binding, 1);
5477 pipe.AddVertexInputAttribs(&input_attrib, 1);
5478
Chris Forbesde136e02015-05-25 11:13:28 +12005479 VkDescriptorSetObj descriptorSet(m_device);
5480 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005481 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12005482
Tony Barbour5781e8f2015-08-04 16:23:11 -06005483 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12005484
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005485 if (!m_errorMonitor->DesiredMsgFound()) {
5486 FAIL() << "Did not receive Warning 'location 0 not consumed by VS'";
5487 m_errorMonitor->DumpFailureMsgs();
Chris Forbesde136e02015-05-25 11:13:28 +12005488 }
5489}
5490
Karl Schultz6addd812016-02-02 17:17:23 -07005491TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005493 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13005494
5495 ASSERT_NO_FATAL_FAILURE(InitState());
5496 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5497
5498 VkVertexInputBindingDescription input_binding;
5499 memset(&input_binding, 0, sizeof(input_binding));
5500
5501 VkVertexInputAttributeDescription input_attrib;
5502 memset(&input_attrib, 0, sizeof(input_attrib));
5503 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5504
5505 char const *vsSource =
5506 "#version 400\n"
5507 "#extension GL_ARB_separate_shader_objects: require\n"
5508 "#extension GL_ARB_shading_language_420pack: require\n"
5509 "\n"
5510 "layout(location=1) in float x;\n"
5511 "out gl_PerVertex {\n"
5512 " vec4 gl_Position;\n"
5513 "};\n"
5514 "void main(){\n"
5515 " gl_Position = vec4(x);\n"
5516 "}\n";
5517 char const *fsSource =
5518 "#version 400\n"
5519 "#extension GL_ARB_separate_shader_objects: require\n"
5520 "#extension GL_ARB_shading_language_420pack: require\n"
5521 "\n"
5522 "layout(location=0) out vec4 color;\n"
5523 "void main(){\n"
5524 " color = vec4(1);\n"
5525 "}\n";
5526
5527 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5528 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5529
5530 VkPipelineObj pipe(m_device);
5531 pipe.AddColorAttachment();
5532 pipe.AddShader(&vs);
5533 pipe.AddShader(&fs);
5534
5535 pipe.AddVertexInputBindings(&input_binding, 1);
5536 pipe.AddVertexInputAttribs(&input_attrib, 1);
5537
5538 VkDescriptorSetObj descriptorSet(m_device);
5539 descriptorSet.AppendDummy();
5540 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5541
5542 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5543
5544 if (!m_errorMonitor->DesiredMsgFound()) {
5545 m_errorMonitor->DumpFailureMsgs();
5546 FAIL() << "Did not receive Warning 'location 0 not consumed by VS'";
5547 }
5548}
5549
Karl Schultz6addd812016-02-02 17:17:23 -07005550TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
5551 m_errorMonitor->SetDesiredFailureMsg(
5552 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005553 "VS consumes input at location 0 but not provided");
5554
Chris Forbes62e8e502015-05-25 11:13:29 +12005555 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005556 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12005557
5558 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005559 "#version 400\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005560 "#extension GL_ARB_separate_shader_objects: require\n"
5561 "#extension GL_ARB_shading_language_420pack: require\n"
5562 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005563 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07005564 "out gl_PerVertex {\n"
5565 " vec4 gl_Position;\n"
5566 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005567 "void main(){\n"
5568 " gl_Position = x;\n"
5569 "}\n";
5570 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005571 "#version 400\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005572 "#extension GL_ARB_separate_shader_objects: require\n"
5573 "#extension GL_ARB_shading_language_420pack: require\n"
5574 "\n"
5575 "layout(location=0) out vec4 color;\n"
5576 "void main(){\n"
5577 " color = vec4(1);\n"
5578 "}\n";
5579
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005580 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5581 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12005582
5583 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005584 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12005585 pipe.AddShader(&vs);
5586 pipe.AddShader(&fs);
5587
Chris Forbes62e8e502015-05-25 11:13:29 +12005588 VkDescriptorSetObj descriptorSet(m_device);
5589 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005590 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12005591
Tony Barbour5781e8f2015-08-04 16:23:11 -06005592 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12005593
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005594 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005595 FAIL() << "Did not receive Error 'VS consumes input at location 0 but "
5596 "not provided'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005597 m_errorMonitor->DumpFailureMsgs();
Chris Forbes62e8e502015-05-25 11:13:29 +12005598 }
5599}
5600
Karl Schultz6addd812016-02-02 17:17:23 -07005601TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
5602 m_errorMonitor->SetDesiredFailureMsg(
5603 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005604 "location 0 does not match VS input type");
5605
Chris Forbesc97d98e2015-05-25 11:13:31 +12005606 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005607 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12005608
5609 VkVertexInputBindingDescription input_binding;
5610 memset(&input_binding, 0, sizeof(input_binding));
5611
5612 VkVertexInputAttributeDescription input_attrib;
5613 memset(&input_attrib, 0, sizeof(input_attrib));
5614 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5615
5616 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005617 "#version 400\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005618 "#extension GL_ARB_separate_shader_objects: require\n"
5619 "#extension GL_ARB_shading_language_420pack: require\n"
5620 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005621 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07005622 "out gl_PerVertex {\n"
5623 " vec4 gl_Position;\n"
5624 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005625 "void main(){\n"
5626 " gl_Position = vec4(x);\n"
5627 "}\n";
5628 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005629 "#version 400\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005630 "#extension GL_ARB_separate_shader_objects: require\n"
5631 "#extension GL_ARB_shading_language_420pack: require\n"
5632 "\n"
5633 "layout(location=0) out vec4 color;\n"
5634 "void main(){\n"
5635 " color = vec4(1);\n"
5636 "}\n";
5637
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005638 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5639 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12005640
5641 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005642 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12005643 pipe.AddShader(&vs);
5644 pipe.AddShader(&fs);
5645
5646 pipe.AddVertexInputBindings(&input_binding, 1);
5647 pipe.AddVertexInputAttribs(&input_attrib, 1);
5648
Chris Forbesc97d98e2015-05-25 11:13:31 +12005649 VkDescriptorSetObj descriptorSet(m_device);
5650 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005651 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12005652
Tony Barbour5781e8f2015-08-04 16:23:11 -06005653 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12005654
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005655 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005656 FAIL() << "Did not receive Error 'location 0 does not match VS input "
5657 "type'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005658 m_errorMonitor->DumpFailureMsgs();
Chris Forbesc97d98e2015-05-25 11:13:31 +12005659 }
5660}
5661
Karl Schultz6addd812016-02-02 17:17:23 -07005662TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes2682b242015-11-24 11:13:14 +13005663 m_errorMonitor->SetDesiredFailureMsg(~0u, "");
5664
5665 ASSERT_NO_FATAL_FAILURE(InitState());
5666 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5667
5668 VkVertexInputBindingDescription input_binding;
5669 memset(&input_binding, 0, sizeof(input_binding));
5670
5671 VkVertexInputAttributeDescription input_attribs[2];
5672 memset(input_attribs, 0, sizeof(input_attribs));
5673
5674 for (int i = 0; i < 2; i++) {
5675 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
5676 input_attribs[i].location = i;
5677 }
5678
5679 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005680 "#version 400\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005681 "#extension GL_ARB_separate_shader_objects: require\n"
5682 "#extension GL_ARB_shading_language_420pack: require\n"
5683 "\n"
5684 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005685 "out gl_PerVertex {\n"
5686 " vec4 gl_Position;\n"
5687 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005688 "void main(){\n"
5689 " gl_Position = x[0] + x[1];\n"
5690 "}\n";
5691 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005692 "#version 400\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005693 "#extension GL_ARB_separate_shader_objects: require\n"
5694 "#extension GL_ARB_shading_language_420pack: require\n"
5695 "\n"
5696 "layout(location=0) out vec4 color;\n"
5697 "void main(){\n"
5698 " color = vec4(1);\n"
5699 "}\n";
5700
5701 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5702 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5703
5704 VkPipelineObj pipe(m_device);
5705 pipe.AddColorAttachment();
5706 pipe.AddShader(&vs);
5707 pipe.AddShader(&fs);
5708
5709 pipe.AddVertexInputBindings(&input_binding, 1);
5710 pipe.AddVertexInputAttribs(input_attribs, 2);
5711
5712 VkDescriptorSetObj descriptorSet(m_device);
5713 descriptorSet.AppendDummy();
5714 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5715
5716 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5717
5718 /* expect success */
5719 if (m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005720 FAIL() << "Expected to succeed but: "
5721 << m_errorMonitor->GetFailureMsg();
Chris Forbes2682b242015-11-24 11:13:14 +13005722 m_errorMonitor->DumpFailureMsgs();
5723 }
5724}
5725
5726/*
Karl Schultz6addd812016-02-02 17:17:23 -07005727 * Would work, but not supported by glslang! This is similar to the matrix case
5728above.
Chris Forbes2682b242015-11-24 11:13:14 +13005729 *
5730TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
5731{
5732 m_errorMonitor->SetDesiredFailureMsg(~0u, "");
5733
5734 ASSERT_NO_FATAL_FAILURE(InitState());
5735 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5736
5737 VkVertexInputBindingDescription input_binding;
5738 memset(&input_binding, 0, sizeof(input_binding));
5739
5740 VkVertexInputAttributeDescription input_attribs[2];
5741 memset(input_attribs, 0, sizeof(input_attribs));
5742
5743 for (int i = 0; i < 2; i++) {
5744 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
5745 input_attribs[i].location = i;
5746 }
5747
5748 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005749 "#version 400\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005750 "#extension GL_ARB_separate_shader_objects: require\n"
5751 "#extension GL_ARB_shading_language_420pack: require\n"
5752 "\n"
5753 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07005754 "out gl_PerVertex {\n"
5755 " vec4 gl_Position;\n"
5756 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005757 "void main(){\n"
5758 " gl_Position = x[0] + x[1];\n"
5759 "}\n";
5760 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005761 "#version 400\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005762 "#extension GL_ARB_separate_shader_objects: require\n"
5763 "#extension GL_ARB_shading_language_420pack: require\n"
5764 "\n"
5765 "layout(location=0) out vec4 color;\n"
5766 "void main(){\n"
5767 " color = vec4(1);\n"
5768 "}\n";
5769
5770 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5771 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5772
5773 VkPipelineObj pipe(m_device);
5774 pipe.AddColorAttachment();
5775 pipe.AddShader(&vs);
5776 pipe.AddShader(&fs);
5777
5778 pipe.AddVertexInputBindings(&input_binding, 1);
5779 pipe.AddVertexInputAttribs(input_attribs, 2);
5780
5781 VkDescriptorSetObj descriptorSet(m_device);
5782 descriptorSet.AppendDummy();
5783 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5784
5785 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5786
5787 if (m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005788 FAIL() << "Expected to succeed but: " <<
5789m_errorMonitor->GetFailureMsg();
Chris Forbes2682b242015-11-24 11:13:14 +13005790 m_errorMonitor->DumpFailureMsgs();
5791 }
5792}
5793*/
5794
Karl Schultz6addd812016-02-02 17:17:23 -07005795TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
5796 m_errorMonitor->SetDesiredFailureMsg(
5797 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005798 "Duplicate vertex input binding descriptions for binding 0");
5799
Chris Forbes280ba2c2015-06-12 11:16:41 +12005800 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005801 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12005802
5803 /* Two binding descriptions for binding 0 */
5804 VkVertexInputBindingDescription input_bindings[2];
5805 memset(input_bindings, 0, sizeof(input_bindings));
5806
5807 VkVertexInputAttributeDescription input_attrib;
5808 memset(&input_attrib, 0, sizeof(input_attrib));
5809 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5810
5811 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005812 "#version 400\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005813 "#extension GL_ARB_separate_shader_objects: require\n"
5814 "#extension GL_ARB_shading_language_420pack: require\n"
5815 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005816 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07005817 "out gl_PerVertex {\n"
5818 " vec4 gl_Position;\n"
5819 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005820 "void main(){\n"
5821 " gl_Position = vec4(x);\n"
5822 "}\n";
5823 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005824 "#version 400\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005825 "#extension GL_ARB_separate_shader_objects: require\n"
5826 "#extension GL_ARB_shading_language_420pack: require\n"
5827 "\n"
5828 "layout(location=0) out vec4 color;\n"
5829 "void main(){\n"
5830 " color = vec4(1);\n"
5831 "}\n";
5832
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005833 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5834 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12005835
5836 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005837 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12005838 pipe.AddShader(&vs);
5839 pipe.AddShader(&fs);
5840
5841 pipe.AddVertexInputBindings(input_bindings, 2);
5842 pipe.AddVertexInputAttribs(&input_attrib, 1);
5843
Chris Forbes280ba2c2015-06-12 11:16:41 +12005844 VkDescriptorSetObj descriptorSet(m_device);
5845 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005846 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12005847
Tony Barbour5781e8f2015-08-04 16:23:11 -06005848 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12005849
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005850 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005851 FAIL() << "Did not receive Error 'Duplicate vertex input binding "
5852 "descriptions for binding 0'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005853 m_errorMonitor->DumpFailureMsgs();
Chris Forbes280ba2c2015-06-12 11:16:41 +12005854 }
5855}
Chris Forbes8f68b562015-05-25 11:13:32 +12005856
Karl Schultz6addd812016-02-02 17:17:23 -07005857TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005859 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005860
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005861 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005862
5863 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005864 "#version 400\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005865 "#extension GL_ARB_separate_shader_objects: require\n"
5866 "#extension GL_ARB_shading_language_420pack: require\n"
5867 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005868 "out gl_PerVertex {\n"
5869 " vec4 gl_Position;\n"
5870 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005871 "void main(){\n"
5872 " gl_Position = vec4(1);\n"
5873 "}\n";
5874 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005875 "#version 400\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005876 "#extension GL_ARB_separate_shader_objects: require\n"
5877 "#extension GL_ARB_shading_language_420pack: require\n"
5878 "\n"
5879 "void main(){\n"
5880 "}\n";
5881
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005882 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5883 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005884
5885 VkPipelineObj pipe(m_device);
5886 pipe.AddShader(&vs);
5887 pipe.AddShader(&fs);
5888
Chia-I Wu08accc62015-07-07 11:50:03 +08005889 /* set up CB 0, not written */
5890 pipe.AddColorAttachment();
5891 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005892
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005893 VkDescriptorSetObj descriptorSet(m_device);
5894 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005895 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005896
Tony Barbour5781e8f2015-08-04 16:23:11 -06005897 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005898
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005899 if (!m_errorMonitor->DesiredMsgFound()) {
5900 FAIL() << "Did not receive Error 'Attachment 0 not written by FS'";
5901 m_errorMonitor->DumpFailureMsgs();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005902 }
5903}
5904
Karl Schultz6addd812016-02-02 17:17:23 -07005905TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005906 // TODO: verify that this matches layer
Karl Schultz6addd812016-02-02 17:17:23 -07005907 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005908 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005909 "FS writes to output location 1 with no matching attachment");
5910
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005911 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005912
5913 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005914 "#version 400\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005915 "#extension GL_ARB_separate_shader_objects: require\n"
5916 "#extension GL_ARB_shading_language_420pack: require\n"
5917 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005918 "out gl_PerVertex {\n"
5919 " vec4 gl_Position;\n"
5920 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005921 "void main(){\n"
5922 " gl_Position = vec4(1);\n"
5923 "}\n";
5924 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005925 "#version 400\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005926 "#extension GL_ARB_separate_shader_objects: require\n"
5927 "#extension GL_ARB_shading_language_420pack: require\n"
5928 "\n"
5929 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005930 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005931 "void main(){\n"
5932 " x = vec4(1);\n"
5933 " y = vec4(1);\n"
5934 "}\n";
5935
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005936 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5937 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005938
5939 VkPipelineObj pipe(m_device);
5940 pipe.AddShader(&vs);
5941 pipe.AddShader(&fs);
5942
Chia-I Wu08accc62015-07-07 11:50:03 +08005943 /* set up CB 0, not written */
5944 pipe.AddColorAttachment();
5945 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005946 /* FS writes CB 1, but we don't configure it */
5947
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005948 VkDescriptorSetObj descriptorSet(m_device);
5949 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005950 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005951
Tony Barbour5781e8f2015-08-04 16:23:11 -06005952 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005953
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005954 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005955 FAIL() << "Did not receive Error 'FS writes to output location 1 with "
5956 "no matching attachment'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005957 m_errorMonitor->DumpFailureMsgs();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005958 }
5959}
5960
Karl Schultz6addd812016-02-02 17:17:23 -07005961TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005962 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005963 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005964
Chris Forbesa36d69e2015-05-25 11:13:44 +12005965 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12005966
5967 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005968 "#version 400\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005969 "#extension GL_ARB_separate_shader_objects: require\n"
5970 "#extension GL_ARB_shading_language_420pack: require\n"
5971 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005972 "out gl_PerVertex {\n"
5973 " vec4 gl_Position;\n"
5974 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005975 "void main(){\n"
5976 " gl_Position = vec4(1);\n"
5977 "}\n";
5978 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005979 "#version 400\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005980 "#extension GL_ARB_separate_shader_objects: require\n"
5981 "#extension GL_ARB_shading_language_420pack: require\n"
5982 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005983 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12005984 "void main(){\n"
5985 " x = ivec4(1);\n"
5986 "}\n";
5987
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005988 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5989 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12005990
5991 VkPipelineObj pipe(m_device);
5992 pipe.AddShader(&vs);
5993 pipe.AddShader(&fs);
5994
Chia-I Wu08accc62015-07-07 11:50:03 +08005995 /* set up CB 0; type is UNORM by default */
5996 pipe.AddColorAttachment();
5997 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12005998
Chris Forbesa36d69e2015-05-25 11:13:44 +12005999 VkDescriptorSetObj descriptorSet(m_device);
6000 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006001 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12006002
Tony Barbour5781e8f2015-08-04 16:23:11 -06006003 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12006004
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006005 if (!m_errorMonitor->DesiredMsgFound()) {
6006 FAIL() << "Did not receive Error 'does not match FS output type'";
6007 m_errorMonitor->DumpFailureMsgs();
Chris Forbesa36d69e2015-05-25 11:13:44 +12006008 }
6009}
Chris Forbes7b1b8932015-06-05 14:43:36 +12006010
Karl Schultz6addd812016-02-02 17:17:23 -07006011TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006013 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006014
Chris Forbes556c76c2015-08-14 12:04:59 +12006015 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12006016
6017 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07006018 "#version 400\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12006019 "#extension GL_ARB_separate_shader_objects: require\n"
6020 "#extension GL_ARB_shading_language_420pack: require\n"
6021 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006022 "out gl_PerVertex {\n"
6023 " vec4 gl_Position;\n"
6024 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12006025 "void main(){\n"
6026 " gl_Position = vec4(1);\n"
6027 "}\n";
6028 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07006029 "#version 400\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12006030 "#extension GL_ARB_separate_shader_objects: require\n"
6031 "#extension GL_ARB_shading_language_420pack: require\n"
6032 "\n"
6033 "layout(location=0) out vec4 x;\n"
6034 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6035 "void main(){\n"
6036 " x = vec4(bar.y);\n"
6037 "}\n";
6038
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006039 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6040 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12006041
Chris Forbes556c76c2015-08-14 12:04:59 +12006042 VkPipelineObj pipe(m_device);
6043 pipe.AddShader(&vs);
6044 pipe.AddShader(&fs);
6045
6046 /* set up CB 0; type is UNORM by default */
6047 pipe.AddColorAttachment();
6048 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6049
6050 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006051 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12006052
6053 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6054
6055 /* should have generated an error -- pipeline layout does not
6056 * provide a uniform buffer in 0.0
6057 */
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006058 if (!m_errorMonitor->DesiredMsgFound()) {
6059 FAIL() << "Did not receive Error 'not declared in pipeline layout'";
6060 m_errorMonitor->DumpFailureMsgs();
Chris Forbes556c76c2015-08-14 12:04:59 +12006061 }
6062}
6063
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006064#endif // SHADER_CHECKER_TESTS
6065
6066#if DEVICE_LIMITS_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006067TEST_F(VkLayerTest, CreateImageLimitsViolationWidth) {
6068 m_errorMonitor->SetDesiredFailureMsg(
6069 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006070 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006071
6072 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006073
6074 // Create an image
6075 VkImage image;
6076
Karl Schultz6addd812016-02-02 17:17:23 -07006077 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6078 const int32_t tex_width = 32;
6079 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006080
6081 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006082 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6083 image_create_info.pNext = NULL;
6084 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6085 image_create_info.format = tex_format;
6086 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006087 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07006088 image_create_info.extent.depth = 1;
6089 image_create_info.mipLevels = 1;
6090 image_create_info.arrayLayers = 1;
6091 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6092 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6093 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6094 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006095
6096 // Introduce error by sending down a bogus width extent
6097 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006098 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006099
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006100 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006101 FAIL() << "Did not receive Error 'CreateImage extents exceed allowable "
6102 "limits for format'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006103 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006104 }
6105}
6106
Karl Schultz6addd812016-02-02 17:17:23 -07006107TEST_F(VkLayerTest, UpdateBufferAlignment) {
6108 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06006109
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006110 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006111 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006112
Mike Stroyana3082432015-09-25 13:39:21 -06006113 ASSERT_NO_FATAL_FAILURE(InitState());
6114
6115 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
6116 vk_testing::Buffer buffer;
6117 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
6118
6119 BeginCommandBuffer();
6120 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006121 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006122 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006123 FAIL() << "Did not receive Error 'vkCommandUpdateBuffer parameter, "
6124 "VkDeviceSize dstOffset, is not a multiple of 4'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006125 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006126 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006127
Mike Stroyana3082432015-09-25 13:39:21 -06006128 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006129 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006130 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006131
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006132 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006133
6134 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006135 FAIL() << "Did not receive Error 'vkCommandUpdateBuffer parameter, "
6136 "VkDeviceSize dataSize, is not a multiple of 4'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006137 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006138 }
6139 EndCommandBuffer();
6140}
6141
Karl Schultz6addd812016-02-02 17:17:23 -07006142TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006144 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06006145
6146 ASSERT_NO_FATAL_FAILURE(InitState());
6147
6148 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
6149 vk_testing::Buffer buffer;
6150 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
6151
6152 BeginCommandBuffer();
6153 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006154 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006155 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006156 FAIL() << "Did not receive Error 'vkCommandFillBuffer parameter, "
6157 "VkDeviceSize dstOffset, is not a multiple of 4'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006158 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006159 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006160
Mike Stroyana3082432015-09-25 13:39:21 -06006161 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006162 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006163 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006164
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006165 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006166
6167 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006168 FAIL() << "Did not receive Error 'vkCommandFillBuffer parameter, "
6169 "VkDeviceSize size, is not a multiple of 4'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006170 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006171 }
6172 EndCommandBuffer();
6173}
6174
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006175#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12006176
Tobin Ehliscde08892015-09-22 10:11:37 -06006177#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006178TEST_F(VkLayerTest, InvalidImageView) {
6179 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06006180
Karl Schultz6addd812016-02-02 17:17:23 -07006181 m_errorMonitor->SetDesiredFailureMsg(
6182 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006183 "vkCreateImageView called with baseMipLevel 10 ");
6184
Tobin Ehliscde08892015-09-22 10:11:37 -06006185 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06006186
Mike Stroyana3082432015-09-25 13:39:21 -06006187 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07006188 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06006189
Karl Schultz6addd812016-02-02 17:17:23 -07006190 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6191 const int32_t tex_width = 32;
6192 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06006193
6194 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006195 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6196 image_create_info.pNext = NULL;
6197 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6198 image_create_info.format = tex_format;
6199 image_create_info.extent.width = tex_width;
6200 image_create_info.extent.height = tex_height;
6201 image_create_info.extent.depth = 1;
6202 image_create_info.mipLevels = 1;
6203 image_create_info.arrayLayers = 1;
6204 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6205 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6206 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6207 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06006208
Chia-I Wuf7458c52015-10-26 21:10:41 +08006209 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06006210 ASSERT_VK_SUCCESS(err);
6211
6212 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006213 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6214 image_view_create_info.image = image;
6215 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6216 image_view_create_info.format = tex_format;
6217 image_view_create_info.subresourceRange.layerCount = 1;
6218 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
6219 image_view_create_info.subresourceRange.levelCount = 1;
6220 image_view_create_info.subresourceRange.aspectMask =
6221 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06006222
6223 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07006224 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6225 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06006226
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006227 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006228 FAIL() << "Did not receive Error 'vkCreateImageView called with "
6229 "baseMipLevel 10...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006230 m_errorMonitor->DumpFailureMsgs();
Tobin Ehliscde08892015-09-22 10:11:37 -06006231 }
6232}
Mike Stroyana3082432015-09-25 13:39:21 -06006233
Karl Schultz6addd812016-02-02 17:17:23 -07006234TEST_F(VkLayerTest, InvalidImageViewAspect) {
6235 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006236
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006238 "vkCreateImageView: Color image "
6239 "formats must have ONLY the "
6240 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006241
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006242 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006243
6244 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07006245 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006246
Karl Schultz6addd812016-02-02 17:17:23 -07006247 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6248 const int32_t tex_width = 32;
6249 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006250
6251 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006252 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6253 image_create_info.pNext = NULL;
6254 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6255 image_create_info.format = tex_format;
6256 image_create_info.extent.width = tex_width;
6257 image_create_info.extent.height = tex_height;
6258 image_create_info.extent.depth = 1;
6259 image_create_info.mipLevels = 1;
6260 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6261 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6262 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6263 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006264
Chia-I Wuf7458c52015-10-26 21:10:41 +08006265 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006266 ASSERT_VK_SUCCESS(err);
6267
6268 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006269 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6270 image_view_create_info.image = image;
6271 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6272 image_view_create_info.format = tex_format;
6273 image_view_create_info.subresourceRange.baseMipLevel = 0;
6274 image_view_create_info.subresourceRange.levelCount = 1;
6275 // Cause an error by setting an invalid image aspect
6276 image_view_create_info.subresourceRange.aspectMask =
6277 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006278
6279 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07006280 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6281 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006282
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006283 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006284 FAIL() << "Did not receive Error 'VkCreateImageView: Color image "
6285 "formats must have ...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006286 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006287 }
6288}
6289
Karl Schultz6addd812016-02-02 17:17:23 -07006290TEST_F(VkLayerTest, CopyImageTypeMismatch) {
6291 VkResult err;
6292 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006293
Karl Schultz6addd812016-02-02 17:17:23 -07006294 m_errorMonitor->SetDesiredFailureMsg(
6295 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006296 "vkCmdCopyImage called with unmatched source and dest image types");
6297
Mike Stroyana3082432015-09-25 13:39:21 -06006298 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006299
6300 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006301 VkImage srcImage;
6302 VkImage dstImage;
6303 VkDeviceMemory srcMem;
6304 VkDeviceMemory destMem;
6305 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006306
6307 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006308 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6309 image_create_info.pNext = NULL;
6310 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6311 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6312 image_create_info.extent.width = 32;
6313 image_create_info.extent.height = 32;
6314 image_create_info.extent.depth = 1;
6315 image_create_info.mipLevels = 1;
6316 image_create_info.arrayLayers = 1;
6317 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6318 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6319 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6320 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006321
Karl Schultz6addd812016-02-02 17:17:23 -07006322 err =
6323 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006324 ASSERT_VK_SUCCESS(err);
6325
Karl Schultz6addd812016-02-02 17:17:23 -07006326 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6327 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006328
Karl Schultz6addd812016-02-02 17:17:23 -07006329 err =
6330 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006331 ASSERT_VK_SUCCESS(err);
6332
6333 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006334 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006335 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6336 memAlloc.pNext = NULL;
6337 memAlloc.allocationSize = 0;
6338 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006339
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006340 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006341 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006342 pass =
6343 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006344 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006345 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006346 ASSERT_VK_SUCCESS(err);
6347
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006348 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006349 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006350 pass =
6351 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006352 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006353 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006354 ASSERT_VK_SUCCESS(err);
6355
6356 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6357 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006358 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006359 ASSERT_VK_SUCCESS(err);
6360
6361 BeginCommandBuffer();
6362 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006363 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006364 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006365 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006366 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006367 copyRegion.srcOffset.x = 0;
6368 copyRegion.srcOffset.y = 0;
6369 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006370 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006371 copyRegion.dstSubresource.mipLevel = 0;
6372 copyRegion.dstSubresource.baseArrayLayer = 0;
6373 copyRegion.dstSubresource.layerCount = 0;
6374 copyRegion.dstOffset.x = 0;
6375 copyRegion.dstOffset.y = 0;
6376 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006377 copyRegion.extent.width = 1;
6378 copyRegion.extent.height = 1;
6379 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006380 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6381 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006382 EndCommandBuffer();
6383
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006384 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006385 FAIL() << "Did not receive Error 'vkCmdCopyImage called with unmatched "
6386 "source and dest image types'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006387 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006388 }
6389
Chia-I Wuf7458c52015-10-26 21:10:41 +08006390 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006391 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006392 vkFreeMemory(m_device->device(), srcMem, NULL);
6393 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006394}
6395
Karl Schultz6addd812016-02-02 17:17:23 -07006396TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
6397 // TODO : Create two images with different format sizes and vkCmdCopyImage
6398 // between them
Mike Stroyana3082432015-09-25 13:39:21 -06006399}
6400
Karl Schultz6addd812016-02-02 17:17:23 -07006401TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
6402 VkResult err;
6403 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006404
Karl Schultz6addd812016-02-02 17:17:23 -07006405 m_errorMonitor->SetDesiredFailureMsg(
6406 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006407 "vkCmdCopyImage called with unmatched source and dest image types");
6408
Mike Stroyana3082432015-09-25 13:39:21 -06006409 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006410
6411 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006412 VkImage srcImage;
6413 VkImage dstImage;
6414 VkDeviceMemory srcMem;
6415 VkDeviceMemory destMem;
6416 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006417
6418 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006419 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6420 image_create_info.pNext = NULL;
6421 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6422 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6423 image_create_info.extent.width = 32;
6424 image_create_info.extent.height = 32;
6425 image_create_info.extent.depth = 1;
6426 image_create_info.mipLevels = 1;
6427 image_create_info.arrayLayers = 1;
6428 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6429 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6430 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6431 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006432
Karl Schultz6addd812016-02-02 17:17:23 -07006433 err =
6434 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006435 ASSERT_VK_SUCCESS(err);
6436
Karl Schultz6addd812016-02-02 17:17:23 -07006437 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6438 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6439 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006440
Karl Schultz6addd812016-02-02 17:17:23 -07006441 err =
6442 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006443 ASSERT_VK_SUCCESS(err);
6444
6445 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006446 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006447 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6448 memAlloc.pNext = NULL;
6449 memAlloc.allocationSize = 0;
6450 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006451
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006452 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006453 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006454 pass =
6455 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006456 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006457 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006458 ASSERT_VK_SUCCESS(err);
6459
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006460 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006461 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006462 pass =
6463 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006464 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006465 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006466 ASSERT_VK_SUCCESS(err);
6467
6468 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6469 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006470 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006471 ASSERT_VK_SUCCESS(err);
6472
6473 BeginCommandBuffer();
6474 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006475 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006476 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006477 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006478 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006479 copyRegion.srcOffset.x = 0;
6480 copyRegion.srcOffset.y = 0;
6481 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006482 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006483 copyRegion.dstSubresource.mipLevel = 0;
6484 copyRegion.dstSubresource.baseArrayLayer = 0;
6485 copyRegion.dstSubresource.layerCount = 0;
6486 copyRegion.dstOffset.x = 0;
6487 copyRegion.dstOffset.y = 0;
6488 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006489 copyRegion.extent.width = 1;
6490 copyRegion.extent.height = 1;
6491 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006492 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6493 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006494 EndCommandBuffer();
6495
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006496 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006497 FAIL() << "Did not receive Error 'vkCmdCopyImage called with unmatched "
6498 "source and dest image types'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006499 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006500 }
6501
Chia-I Wuf7458c52015-10-26 21:10:41 +08006502 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006503 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006504 vkFreeMemory(m_device->device(), srcMem, NULL);
6505 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006506}
6507
Karl Schultz6addd812016-02-02 17:17:23 -07006508TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
6509 VkResult err;
6510 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006511
Karl Schultz6addd812016-02-02 17:17:23 -07006512 m_errorMonitor->SetDesiredFailureMsg(
6513 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006514 "vkCmdResolveImage called with source sample count less than 2.");
6515
Mike Stroyana3082432015-09-25 13:39:21 -06006516 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006517
6518 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07006519 VkImage srcImage;
6520 VkImage dstImage;
6521 VkDeviceMemory srcMem;
6522 VkDeviceMemory destMem;
6523 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006524
6525 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006526 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6527 image_create_info.pNext = NULL;
6528 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6529 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6530 image_create_info.extent.width = 32;
6531 image_create_info.extent.height = 1;
6532 image_create_info.extent.depth = 1;
6533 image_create_info.mipLevels = 1;
6534 image_create_info.arrayLayers = 1;
6535 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6536 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6537 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6538 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006539
Karl Schultz6addd812016-02-02 17:17:23 -07006540 err =
6541 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006542 ASSERT_VK_SUCCESS(err);
6543
Karl Schultz6addd812016-02-02 17:17:23 -07006544 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6545 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006546
Karl Schultz6addd812016-02-02 17:17:23 -07006547 err =
6548 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006549 ASSERT_VK_SUCCESS(err);
6550
6551 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006552 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006553 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6554 memAlloc.pNext = NULL;
6555 memAlloc.allocationSize = 0;
6556 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006557
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006558 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006559 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006560 pass =
6561 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006562 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006563 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006564 ASSERT_VK_SUCCESS(err);
6565
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006566 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006567 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006568 pass =
6569 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006570 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006571 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006572 ASSERT_VK_SUCCESS(err);
6573
6574 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6575 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006576 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006577 ASSERT_VK_SUCCESS(err);
6578
6579 BeginCommandBuffer();
6580 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006581 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6582 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006583 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006584 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006585 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006586 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006587 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006588 resolveRegion.srcOffset.x = 0;
6589 resolveRegion.srcOffset.y = 0;
6590 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006591 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006592 resolveRegion.dstSubresource.mipLevel = 0;
6593 resolveRegion.dstSubresource.baseArrayLayer = 0;
6594 resolveRegion.dstSubresource.layerCount = 0;
6595 resolveRegion.dstOffset.x = 0;
6596 resolveRegion.dstOffset.y = 0;
6597 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006598 resolveRegion.extent.width = 1;
6599 resolveRegion.extent.height = 1;
6600 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006601 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6602 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006603 EndCommandBuffer();
6604
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006605 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006606 FAIL() << "Did not receive Error 'vkCmdResolveImage called with source "
6607 "sample count less than 2.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006608 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006609 }
6610
Chia-I Wuf7458c52015-10-26 21:10:41 +08006611 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006612 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006613 vkFreeMemory(m_device->device(), srcMem, NULL);
6614 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006615}
6616
Karl Schultz6addd812016-02-02 17:17:23 -07006617TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
6618 VkResult err;
6619 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006620
Karl Schultz6addd812016-02-02 17:17:23 -07006621 m_errorMonitor->SetDesiredFailureMsg(
6622 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006623 "vkCmdResolveImage called with dest sample count greater than 1.");
6624
Mike Stroyana3082432015-09-25 13:39:21 -06006625 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006626
6627 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07006628 VkImage srcImage;
6629 VkImage dstImage;
6630 VkDeviceMemory srcMem;
6631 VkDeviceMemory destMem;
6632 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006633
6634 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006635 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6636 image_create_info.pNext = NULL;
6637 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6638 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6639 image_create_info.extent.width = 32;
6640 image_create_info.extent.height = 1;
6641 image_create_info.extent.depth = 1;
6642 image_create_info.mipLevels = 1;
6643 image_create_info.arrayLayers = 1;
6644 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6645 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6646 // Note: Some implementations expect color attachment usage for any
6647 // multisample surface
6648 image_create_info.usage =
6649 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6650 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006651
Karl Schultz6addd812016-02-02 17:17:23 -07006652 err =
6653 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006654 ASSERT_VK_SUCCESS(err);
6655
Karl Schultz6addd812016-02-02 17:17:23 -07006656 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6657 // Note: Some implementations expect color attachment usage for any
6658 // multisample surface
6659 image_create_info.usage =
6660 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006661
Karl Schultz6addd812016-02-02 17:17:23 -07006662 err =
6663 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006664 ASSERT_VK_SUCCESS(err);
6665
6666 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006667 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006668 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6669 memAlloc.pNext = NULL;
6670 memAlloc.allocationSize = 0;
6671 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006672
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006673 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006674 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006675 pass =
6676 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006677 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006678 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006679 ASSERT_VK_SUCCESS(err);
6680
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006681 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006682 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006683 pass =
6684 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006685 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006686 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006687 ASSERT_VK_SUCCESS(err);
6688
6689 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6690 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006691 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006692 ASSERT_VK_SUCCESS(err);
6693
6694 BeginCommandBuffer();
6695 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006696 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6697 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006698 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006699 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006700 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006701 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006702 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006703 resolveRegion.srcOffset.x = 0;
6704 resolveRegion.srcOffset.y = 0;
6705 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006706 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006707 resolveRegion.dstSubresource.mipLevel = 0;
6708 resolveRegion.dstSubresource.baseArrayLayer = 0;
6709 resolveRegion.dstSubresource.layerCount = 0;
6710 resolveRegion.dstOffset.x = 0;
6711 resolveRegion.dstOffset.y = 0;
6712 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006713 resolveRegion.extent.width = 1;
6714 resolveRegion.extent.height = 1;
6715 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006716 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6717 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006718 EndCommandBuffer();
6719
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006720 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006721 FAIL() << "Did not receive Error 'vkCmdResolveImage called with dest "
6722 "sample count greater than 1.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006723 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006724 }
6725
Chia-I Wuf7458c52015-10-26 21:10:41 +08006726 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006727 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006728 vkFreeMemory(m_device->device(), srcMem, NULL);
6729 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006730}
6731
Karl Schultz6addd812016-02-02 17:17:23 -07006732TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
6733 VkResult err;
6734 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006735
Karl Schultz6addd812016-02-02 17:17:23 -07006736 m_errorMonitor->SetDesiredFailureMsg(
6737 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006738 "vkCmdResolveImage called with unmatched source and dest formats.");
6739
Mike Stroyana3082432015-09-25 13:39:21 -06006740 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006741
6742 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006743 VkImage srcImage;
6744 VkImage dstImage;
6745 VkDeviceMemory srcMem;
6746 VkDeviceMemory destMem;
6747 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006748
6749 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006750 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6751 image_create_info.pNext = NULL;
6752 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6753 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6754 image_create_info.extent.width = 32;
6755 image_create_info.extent.height = 1;
6756 image_create_info.extent.depth = 1;
6757 image_create_info.mipLevels = 1;
6758 image_create_info.arrayLayers = 1;
6759 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6760 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6761 // Note: Some implementations expect color attachment usage for any
6762 // multisample surface
6763 image_create_info.usage =
6764 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6765 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006766
Karl Schultz6addd812016-02-02 17:17:23 -07006767 err =
6768 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006769 ASSERT_VK_SUCCESS(err);
6770
Karl Schultz6addd812016-02-02 17:17:23 -07006771 // Set format to something other than source image
6772 image_create_info.format = VK_FORMAT_R32_SFLOAT;
6773 // Note: Some implementations expect color attachment usage for any
6774 // multisample surface
6775 image_create_info.usage =
6776 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6777 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006778
Karl Schultz6addd812016-02-02 17:17:23 -07006779 err =
6780 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006781 ASSERT_VK_SUCCESS(err);
6782
6783 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006784 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006785 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6786 memAlloc.pNext = NULL;
6787 memAlloc.allocationSize = 0;
6788 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006789
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006790 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006791 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006792 pass =
6793 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006794 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006795 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006796 ASSERT_VK_SUCCESS(err);
6797
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006798 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006799 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006800 pass =
6801 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006802 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006803 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006804 ASSERT_VK_SUCCESS(err);
6805
6806 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6807 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006808 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006809 ASSERT_VK_SUCCESS(err);
6810
6811 BeginCommandBuffer();
6812 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006813 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6814 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006815 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006816 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006817 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006818 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006819 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006820 resolveRegion.srcOffset.x = 0;
6821 resolveRegion.srcOffset.y = 0;
6822 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006823 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006824 resolveRegion.dstSubresource.mipLevel = 0;
6825 resolveRegion.dstSubresource.baseArrayLayer = 0;
6826 resolveRegion.dstSubresource.layerCount = 0;
6827 resolveRegion.dstOffset.x = 0;
6828 resolveRegion.dstOffset.y = 0;
6829 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006830 resolveRegion.extent.width = 1;
6831 resolveRegion.extent.height = 1;
6832 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006833 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6834 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006835 EndCommandBuffer();
6836
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006837 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006838 FAIL() << "Did not receive Error 'vkCmdResolveImage called with "
6839 "unmatched source and dest formats.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006840 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006841 }
6842
Chia-I Wuf7458c52015-10-26 21:10:41 +08006843 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006844 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006845 vkFreeMemory(m_device->device(), srcMem, NULL);
6846 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006847}
6848
Karl Schultz6addd812016-02-02 17:17:23 -07006849TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
6850 VkResult err;
6851 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006852
Karl Schultz6addd812016-02-02 17:17:23 -07006853 m_errorMonitor->SetDesiredFailureMsg(
6854 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006855 "vkCmdResolveImage called with unmatched source and dest image types.");
6856
Mike Stroyana3082432015-09-25 13:39:21 -06006857 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006858
6859 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006860 VkImage srcImage;
6861 VkImage dstImage;
6862 VkDeviceMemory srcMem;
6863 VkDeviceMemory destMem;
6864 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006865
6866 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006867 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6868 image_create_info.pNext = NULL;
6869 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6870 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6871 image_create_info.extent.width = 32;
6872 image_create_info.extent.height = 1;
6873 image_create_info.extent.depth = 1;
6874 image_create_info.mipLevels = 1;
6875 image_create_info.arrayLayers = 1;
6876 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6877 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6878 // Note: Some implementations expect color attachment usage for any
6879 // multisample surface
6880 image_create_info.usage =
6881 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6882 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006883
Karl Schultz6addd812016-02-02 17:17:23 -07006884 err =
6885 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006886 ASSERT_VK_SUCCESS(err);
6887
Karl Schultz6addd812016-02-02 17:17:23 -07006888 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6889 // Note: Some implementations expect color attachment usage for any
6890 // multisample surface
6891 image_create_info.usage =
6892 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6893 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006894
Karl Schultz6addd812016-02-02 17:17:23 -07006895 err =
6896 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006897 ASSERT_VK_SUCCESS(err);
6898
6899 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006900 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006901 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6902 memAlloc.pNext = NULL;
6903 memAlloc.allocationSize = 0;
6904 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006905
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006906 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006907 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006908 pass =
6909 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006910 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006911 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006912 ASSERT_VK_SUCCESS(err);
6913
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006914 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006915 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006916 pass =
6917 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006918 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006919 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006920 ASSERT_VK_SUCCESS(err);
6921
6922 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6923 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006924 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006925 ASSERT_VK_SUCCESS(err);
6926
6927 BeginCommandBuffer();
6928 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006929 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6930 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006931 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006932 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006933 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006934 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006935 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006936 resolveRegion.srcOffset.x = 0;
6937 resolveRegion.srcOffset.y = 0;
6938 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006939 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006940 resolveRegion.dstSubresource.mipLevel = 0;
6941 resolveRegion.dstSubresource.baseArrayLayer = 0;
6942 resolveRegion.dstSubresource.layerCount = 0;
6943 resolveRegion.dstOffset.x = 0;
6944 resolveRegion.dstOffset.y = 0;
6945 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006946 resolveRegion.extent.width = 1;
6947 resolveRegion.extent.height = 1;
6948 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006949 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6950 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006951 EndCommandBuffer();
6952
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006953 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006954 FAIL() << "Did not receive Error 'vkCmdResolveImage called with "
6955 "unmatched source and dest image types.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006956 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006957 }
6958
Chia-I Wuf7458c52015-10-26 21:10:41 +08006959 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006960 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006961 vkFreeMemory(m_device->device(), srcMem, NULL);
6962 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006963}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006964
Karl Schultz6addd812016-02-02 17:17:23 -07006965TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006966 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07006967 // to using a DS format, then cause it to hit error due to COLOR_BIT not
6968 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006969 // The image format check comes 2nd in validation so we trigger it first,
6970 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07006971 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006972
Karl Schultz6addd812016-02-02 17:17:23 -07006973 m_errorMonitor->SetDesiredFailureMsg(
6974 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006975 "Combination depth/stencil image formats can have only the ");
6976
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006977 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006978
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006979 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006980 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6981 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006982
6983 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006984 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6985 ds_pool_ci.pNext = NULL;
6986 ds_pool_ci.maxSets = 1;
6987 ds_pool_ci.poolSizeCount = 1;
6988 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006989
6990 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006991 err =
6992 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06006993 ASSERT_VK_SUCCESS(err);
6994
6995 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006996 dsl_binding.binding = 0;
6997 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6998 dsl_binding.descriptorCount = 1;
6999 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7000 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007001
7002 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007003 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7004 ds_layout_ci.pNext = NULL;
7005 ds_layout_ci.bindingCount = 1;
7006 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007007 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007008 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7009 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007010 ASSERT_VK_SUCCESS(err);
7011
7012 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007013 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007014 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007015 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007016 alloc_info.descriptorPool = ds_pool;
7017 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007018 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7019 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007020 ASSERT_VK_SUCCESS(err);
7021
Karl Schultz6addd812016-02-02 17:17:23 -07007022 VkImage image_bad;
7023 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007024 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07007025 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007026 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07007027 const int32_t tex_width = 32;
7028 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007029
7030 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007031 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7032 image_create_info.pNext = NULL;
7033 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7034 image_create_info.format = tex_format_bad;
7035 image_create_info.extent.width = tex_width;
7036 image_create_info.extent.height = tex_height;
7037 image_create_info.extent.depth = 1;
7038 image_create_info.mipLevels = 1;
7039 image_create_info.arrayLayers = 1;
7040 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7041 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7042 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
7043 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
7044 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007045
Karl Schultz6addd812016-02-02 17:17:23 -07007046 err =
7047 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007048 ASSERT_VK_SUCCESS(err);
7049 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07007050 image_create_info.usage =
7051 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7052 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
7053 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007054 ASSERT_VK_SUCCESS(err);
7055
7056 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007057 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7058 image_view_create_info.image = image_bad;
7059 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7060 image_view_create_info.format = tex_format_bad;
7061 image_view_create_info.subresourceRange.baseArrayLayer = 0;
7062 image_view_create_info.subresourceRange.baseMipLevel = 0;
7063 image_view_create_info.subresourceRange.layerCount = 1;
7064 image_view_create_info.subresourceRange.levelCount = 1;
7065 image_view_create_info.subresourceRange.aspectMask =
7066 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007067
7068 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007069 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7070 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007071
7072 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07007073 FAIL() << "Did not receive Error 'Combination depth-stencil image "
7074 "formats can have only the....'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007075 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007076 }
7077
Chia-I Wuf7458c52015-10-26 21:10:41 +08007078 vkDestroyImage(m_device->device(), image_bad, NULL);
7079 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007080 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7081 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007082}
Tobin Ehliscde08892015-09-22 10:11:37 -06007083#endif // IMAGE_TESTS
7084
Tony Barbour300a6082015-04-07 13:44:53 -06007085int main(int argc, char **argv) {
7086 int result;
7087
7088 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06007089 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06007090
7091 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
7092
7093 result = RUN_ALL_TESTS();
7094
Tony Barbour6918cd52015-04-09 12:58:51 -06007095 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06007096 return result;
7097}