blob: a6d2ee2822775ca6b93716921f4e14703d62ecf2 [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
Cody Northrop8e54a402016-03-08 22:25:52 -070035#ifdef ANDROID
36#include "vulkan_wrapper.h"
37#else
David Pinedo9316d3b2015-11-06 12:54:48 -070038#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070039#endif
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060040#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060041#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060042#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070043#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060044
Mark Lobodzinski3780e142015-05-14 15:08:13 -050045#define GLM_FORCE_RADIANS
46#include "glm/glm.hpp"
47#include <glm/gtc/matrix_transform.hpp>
48
Tobin Ehlis0788f522015-05-26 16:11:58 -060049#define MEM_TRACKER_TESTS 1
50#define OBJ_TRACKER_TESTS 1
51#define DRAW_STATE_TESTS 1
52#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120053#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060054#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060055#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060056
Mark Lobodzinski3780e142015-05-14 15:08:13 -050057//--------------------------------------------------------------------------------------
58// Mesh and VertexFormat Data
59//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070060struct Vertex {
61 float posX, posY, posZ, posW; // Position data
62 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050063};
64
Karl Schultz6addd812016-02-02 17:17:23 -070065#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050066
67typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070068 BsoFailNone = 0x00000000,
69 BsoFailLineWidth = 0x00000001,
70 BsoFailDepthBias = 0x00000002,
71 BsoFailViewport = 0x00000004,
72 BsoFailScissor = 0x00000008,
73 BsoFailBlend = 0x00000010,
74 BsoFailDepthBounds = 0x00000020,
75 BsoFailStencilReadMask = 0x00000040,
76 BsoFailStencilWriteMask = 0x00000080,
77 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050078} BsoFailSelect;
79
80struct vktriangle_vs_uniform {
81 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070082 float mvp[4][4];
83 float position[3][4];
84 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050085};
86
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050087static const char bindStateVertShaderText[] =
Karl Schultz6addd812016-02-02 17:17:23 -070088 "#version 400\n"
89 "#extension GL_ARB_separate_shader_objects : require\n"
90 "#extension GL_ARB_shading_language_420pack : require\n"
91 "vec2 vertices[3];\n"
92 "out gl_PerVertex {\n"
93 " vec4 gl_Position;\n"
94 "};\n"
95 "void main() {\n"
96 " vertices[0] = vec2(-1.0, -1.0);\n"
97 " vertices[1] = vec2( 1.0, -1.0);\n"
98 " vertices[2] = vec2( 0.0, 1.0);\n"
99 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
100 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500101
Mark Lobodzinski75a97e62015-06-02 09:41:30 -0500102static const char bindStateFragShaderText[] =
Karl Schultz6addd812016-02-02 17:17:23 -0700103 "#version 400\n"
104 "#extension GL_ARB_separate_shader_objects: require\n"
105 "#extension GL_ARB_shading_language_420pack: require\n"
106 "\n"
107 "layout(location = 0) out vec4 uFragColor;\n"
108 "void main(){\n"
109 " uFragColor = vec4(0,1,0,1);\n"
110 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500111
Karl Schultz6addd812016-02-02 17:17:23 -0700112static VKAPI_ATTR VkBool32 VKAPI_CALL
113myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
114 uint64_t srcObject, size_t location, int32_t msgCode,
115 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -0600116
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600117// ********************************************************
118// ErrorMonitor Usage:
119//
120// Call SetDesiredFailureMsg with a string to be compared against all
121// encountered log messages. Passing NULL will match all log messages.
122// logMsg will return true for skipCall only if msg is matched or NULL.
123//
124// Call DesiredMsgFound to determine if the desired failure message
125// was encountered.
126
Tony Barbour300a6082015-04-07 13:44:53 -0600127class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700128 public:
129 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600130 test_platform_thread_create_mutex(&m_mutex);
131 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700132 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700133 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600134 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600135 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600136
Karl Schultz6addd812016-02-02 17:17:23 -0700137 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600138 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600139 m_desiredMsg.clear();
140 m_failureMsg.clear();
141 m_otherMsgs.clear();
142 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700143 m_msgFound = VK_FALSE;
144 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600145 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600146 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600147
Karl Schultz6addd812016-02-02 17:17:23 -0700148 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600149 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600150 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600151 if (m_bailout != NULL) {
152 *m_bailout = true;
153 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600154 string errorString(msgString);
155 if (msgFlags & m_msgFlags) {
156 if (errorString.find(m_desiredMsg) != string::npos) {
157 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700158 m_msgFound = VK_TRUE;
159 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600160 } else {
161 m_otherMsgs.push_back(errorString);
162 }
163 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600164 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600166 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600167
Karl Schultz6addd812016-02-02 17:17:23 -0700168 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600169
Karl Schultz6addd812016-02-02 17:17:23 -0700170 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600171
Karl Schultz6addd812016-02-02 17:17:23 -0700172 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600173
Karl Schultz6addd812016-02-02 17:17:23 -0700174 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600175
Karl Schultz6addd812016-02-02 17:17:23 -0700176 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600177 vector<string> otherMsgs = GetOtherFailureMsgs();
178 cout << "Other error messages logged for this test were:" << endl;
179 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
180 cout << " " << *iter << endl;
181 }
182 }
183
Karl Schultz6addd812016-02-02 17:17:23 -0700184 private:
185 VkFlags m_msgFlags;
186 string m_desiredMsg;
187 string m_failureMsg;
188 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600189 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700190 bool *m_bailout;
191 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600192};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500193
Karl Schultz6addd812016-02-02 17:17:23 -0700194static VKAPI_ATTR VkBool32 VKAPI_CALL
195myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
196 uint64_t srcObject, size_t location, int32_t msgCode,
197 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
198 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700199 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700200 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600201 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600202 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600203 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600204 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600205}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500206
Karl Schultz6addd812016-02-02 17:17:23 -0700207class VkLayerTest : public VkRenderFramework {
208 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800209 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
210 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700211 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
212 BsoFailSelect failMask);
213 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
214 VkPipelineObj &pipelineobj,
215 VkDescriptorSetObj &descriptorSet,
216 BsoFailSelect failMask);
217 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
218 VkDescriptorSetObj &descriptorSet,
219 BsoFailSelect failMask) {
220 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
221 failMask);
222 }
Tony Barbour300a6082015-04-07 13:44:53 -0600223
Tony Barbourfe3351b2015-07-28 10:17:20 -0600224 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700225 VkResult BeginCommandBuffer() {
226 return BeginCommandBuffer(*m_commandBuffer);
227 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800228 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700229 void Draw(uint32_t vertexCount, uint32_t instanceCount,
230 uint32_t firstVertex, uint32_t firstInstance) {
231 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
232 firstInstance);
233 }
234 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
235 uint32_t firstIndex, int32_t vertexOffset,
236 uint32_t firstInstance) {
237 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
238 vertexOffset, firstInstance);
239 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800240 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700241 void QueueCommandBuffer(const VkFence &fence) {
242 m_commandBuffer->QueueCommandBuffer(fence);
243 }
244 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
245 VkDeviceSize offset, uint32_t binding) {
246 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
247 }
248 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
249 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
250 }
251
252 protected:
253 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600254
255 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600256 std::vector<const char *> instance_layer_names;
257 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600258 std::vector<const char *> instance_extension_names;
259 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600260
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700261 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600262 /*
263 * Since CreateDbgMsgCallback is an instance level extension call
264 * any extension / layer that utilizes that feature also needs
265 * to be enabled at create instance time.
266 */
Karl Schultz6addd812016-02-02 17:17:23 -0700267 // Use Threading layer first to protect others from
268 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700269 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600270 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800271 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700272 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800273 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
274 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700275 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600276
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700277 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600278 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800279 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700280 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800281 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
282 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700283 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600284
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600285 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600286 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800287 this->app_info.pApplicationName = "layer_tests";
288 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600289 this->app_info.pEngineName = "unittest";
290 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600291 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600292
Tony Barbour15524c32015-04-29 17:34:29 -0600293 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600294 InitFramework(instance_layer_names, device_layer_names,
295 instance_extension_names, device_extension_names,
296 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600297 }
298
299 virtual void TearDown() {
300 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600301 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600302 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600303 }
304};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500305
Karl Schultz6addd812016-02-02 17:17:23 -0700306VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600307 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600308
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800309 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600310
311 /*
312 * For render test all drawing happens in a single render pass
313 * on a single command buffer.
314 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200315 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800316 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600317 }
318
319 return result;
320}
321
Karl Schultz6addd812016-02-02 17:17:23 -0700322VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600323 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600324
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200325 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800326 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200327 }
Tony Barbour300a6082015-04-07 13:44:53 -0600328
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800329 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600330
331 return result;
332}
333
Karl Schultz6addd812016-02-02 17:17:23 -0700334void VkLayerTest::VKTriangleTest(const char *vertShaderText,
335 const char *fragShaderText,
336 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500337 // Create identity matrix
338 int i;
339 struct vktriangle_vs_uniform data;
340
341 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700342 glm::mat4 View = glm::mat4(1.0f);
343 glm::mat4 Model = glm::mat4(1.0f);
344 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500345 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700346 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500347
348 memcpy(&data.mvp, &MVP[0][0], matrixSize);
349
Karl Schultz6addd812016-02-02 17:17:23 -0700350 static const Vertex tri_data[] = {
351 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
352 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
353 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500354 };
355
Karl Schultz6addd812016-02-02 17:17:23 -0700356 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500357 data.position[i][0] = tri_data[i].posX;
358 data.position[i][1] = tri_data[i].posY;
359 data.position[i][2] = tri_data[i].posZ;
360 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700361 data.color[i][0] = tri_data[i].r;
362 data.color[i][1] = tri_data[i].g;
363 data.color[i][2] = tri_data[i].b;
364 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500365 }
366
367 ASSERT_NO_FATAL_FAILURE(InitState());
368 ASSERT_NO_FATAL_FAILURE(InitViewport());
369
Karl Schultz6addd812016-02-02 17:17:23 -0700370 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
371 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500372
Karl Schultz6addd812016-02-02 17:17:23 -0700373 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
374 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
375 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500376
377 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800378 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500379 pipelineobj.AddShader(&vs);
380 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600381 if (failMask & BsoFailLineWidth) {
382 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
383 }
384 if (failMask & BsoFailDepthBias) {
385 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
386 }
Karl Schultz6addd812016-02-02 17:17:23 -0700387 // Viewport and scissors must stay in synch or other errors will occur than
388 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600389 if (failMask & BsoFailViewport) {
390 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600391 m_viewports.clear();
392 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600393 }
394 if (failMask & BsoFailScissor) {
395 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600396 m_scissors.clear();
397 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600398 }
399 if (failMask & BsoFailBlend) {
400 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
401 }
402 if (failMask & BsoFailDepthBounds) {
403 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
404 }
405 if (failMask & BsoFailStencilReadMask) {
406 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
407 }
408 if (failMask & BsoFailStencilWriteMask) {
409 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
410 }
411 if (failMask & BsoFailStencilReference) {
412 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
413 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500414
415 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700416 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
417 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500418
419 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600420 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500421
Tony Barbourfe3351b2015-07-28 10:17:20 -0600422 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500423
424 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600425 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500426
427 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600428 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500429
Tony Barbourfe3351b2015-07-28 10:17:20 -0600430 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500431}
432
Karl Schultz6addd812016-02-02 17:17:23 -0700433void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
434 VkPipelineObj &pipelineobj,
435 VkDescriptorSetObj &descriptorSet,
436 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500437 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700438 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
439 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500440 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700441 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
442 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500443 }
444
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800445 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700446 // Make sure depthWriteEnable is set so that Depth fail test will work
447 // correctly
448 // Make sure stencilTestEnable is set so that Stencil fail test will work
449 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600450 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800451 stencil.failOp = VK_STENCIL_OP_KEEP;
452 stencil.passOp = VK_STENCIL_OP_KEEP;
453 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
454 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600455
456 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
457 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600458 ds_ci.pNext = NULL;
459 ds_ci.depthTestEnable = VK_FALSE;
460 ds_ci.depthWriteEnable = VK_TRUE;
461 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
462 ds_ci.depthBoundsTestEnable = VK_FALSE;
463 ds_ci.stencilTestEnable = VK_TRUE;
464 ds_ci.front = stencil;
465 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600466
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600467 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600468 pipelineobj.SetViewport(m_viewports);
469 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800470 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700471 VkResult err = pipelineobj.CreateVKPipeline(
472 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600473 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800474 commandBuffer->BindPipeline(pipelineobj);
475 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500476}
477
478// ********************************************************************************************************************
479// ********************************************************************************************************************
480// ********************************************************************************************************************
481// ********************************************************************************************************************
Tobin Ehlis0788f522015-05-26 16:11:58 -0600482#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700483#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800484TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500485{
486 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500487 VkFenceCreateInfo fenceInfo = {};
488 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
489 fenceInfo.pNext = NULL;
490 fenceInfo.flags = 0;
491
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600493
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500494 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600495
496 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
497 vk_testing::Buffer buffer;
498 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500499
Tony Barbourfe3351b2015-07-28 10:17:20 -0600500 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800501 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600502 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500503
504 testFence.init(*m_device, fenceInfo);
505
506 // Bypass framework since it does the waits automatically
507 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600508 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800509 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
510 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800511 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600512 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700513 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800514 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800515 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800516 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600517 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600518
519 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500520 ASSERT_VK_SUCCESS( err );
521
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500522 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800523 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500524
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600525 if (!m_errorMonitor->DesiredMsgFound()) {
526 FAIL() << "Did not receive Error 'Resetting CB (0xaddress) before it has completed. You must check CB flag before.'";
527 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500528 }
529}
530
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800531TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500532{
533 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500534 VkFenceCreateInfo fenceInfo = {};
535 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
536 fenceInfo.pNext = NULL;
537 fenceInfo.flags = 0;
538
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600540
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500541 ASSERT_NO_FATAL_FAILURE(InitState());
542 ASSERT_NO_FATAL_FAILURE(InitViewport());
543 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
544
Tony Barbourfe3351b2015-07-28 10:17:20 -0600545 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800546 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600547 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500548
549 testFence.init(*m_device, fenceInfo);
550
551 // Bypass framework since it does the waits automatically
552 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600553 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800554 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
555 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800556 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600557 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700558 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800559 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800560 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800561 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600562 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600563
564 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500565 ASSERT_VK_SUCCESS( err );
566
Jon Ashburnf19916e2016-01-11 13:12:43 -0700567 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800568 VkCommandBufferBeginInfo info = {};
569 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
570 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600571 info.renderPass = VK_NULL_HANDLE;
572 info.subpass = 0;
573 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800574 info.occlusionQueryEnable = VK_FALSE;
575 info.queryFlags = 0;
576 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600577
578 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800579 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500580
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600581 if (!m_errorMonitor->DesiredMsgFound()) {
582 FAIL() << "Did not receive Error 'Calling vkBeginCommandBuffer() on an active CB (0xaddress) before it has completed'";
583 m_errorMonitor->DumpFailureMsgs();
584
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500585 }
586}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700587#endif
Karl Schultz6addd812016-02-02 17:17:23 -0700588TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
589 VkResult err;
590 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500591
Karl Schultz6addd812016-02-02 17:17:23 -0700592 m_errorMonitor->SetDesiredFailureMsg(
593 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600594 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
595
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500596 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500597
598 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700599 VkImage image;
600 VkDeviceMemory mem;
601 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500602
Karl Schultz6addd812016-02-02 17:17:23 -0700603 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
604 const int32_t tex_width = 32;
605 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500606
Tony Barboureb254902015-07-15 12:50:33 -0600607 VkImageCreateInfo image_create_info = {};
608 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700609 image_create_info.pNext = NULL;
610 image_create_info.imageType = VK_IMAGE_TYPE_2D;
611 image_create_info.format = tex_format;
612 image_create_info.extent.width = tex_width;
613 image_create_info.extent.height = tex_height;
614 image_create_info.extent.depth = 1;
615 image_create_info.mipLevels = 1;
616 image_create_info.arrayLayers = 1;
617 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
618 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
619 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
620 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600621
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800622 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800623 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700624 mem_alloc.pNext = NULL;
625 mem_alloc.allocationSize = 0;
626 // Introduce failure, do NOT set memProps to
627 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
628 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500629
Chia-I Wuf7458c52015-10-26 21:10:41 +0800630 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500631 ASSERT_VK_SUCCESS(err);
632
Karl Schultz6addd812016-02-02 17:17:23 -0700633 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500634
Mark Lobodzinski23065352015-05-29 09:32:35 -0500635 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500636
Karl Schultz6addd812016-02-02 17:17:23 -0700637 pass =
638 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
639 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
640 if (!pass) { // If we can't find any unmappable memory this test doesn't
641 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +0800642 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -0600643 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -0600644 }
Mike Stroyan713b2d72015-08-04 10:49:29 -0600645
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500646 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800647 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500648 ASSERT_VK_SUCCESS(err);
649
650 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -0600651 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500652 ASSERT_VK_SUCCESS(err);
653
654 // Map memory as if to initialize the image
655 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -0700656 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
657 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500658
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600659 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700660 FAIL() << "Did not receive Error 'Error received did not match "
661 "expected error message from vkMapMemory in MemTracker'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600662 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500663 }
Mike Stroyand1c84a52015-08-18 14:40:24 -0600664
Chia-I Wuf7458c52015-10-26 21:10:41 +0800665 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500666}
667
Karl Schultz6addd812016-02-02 17:17:23 -0700668// TODO : Is this test still valid. Not sure it is with updates to memory
669// binding model
Tobin Ehlis2717d132015-07-10 18:25:07 -0600670// Verify and delete the test of fix the check
Karl Schultz6addd812016-02-02 17:17:23 -0700671// TEST_F(VkLayerTest, FreeBoundMemory)
Tobin Ehlis2717d132015-07-10 18:25:07 -0600672//{
Tobin Ehlis2717d132015-07-10 18:25:07 -0600673// VkResult err;
674//
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700675// m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600676// "Freeing memory object while it still has references");
Tobin Ehlis2717d132015-07-10 18:25:07 -0600677//
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600678// ASSERT_NO_FATAL_FAILURE(InitState());
679
Tobin Ehlis2717d132015-07-10 18:25:07 -0600680// // Create an image, allocate memory, free it, and then try to bind it
681// VkImage image;
682// VkDeviceMemory mem;
683// VkMemoryRequirements mem_reqs;
684//
685// const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
686// const int32_t tex_width = 32;
687// const int32_t tex_height = 32;
688//
689// const VkImageCreateInfo image_create_info = {
690// .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
691// .pNext = NULL,
692// .imageType = VK_IMAGE_TYPE_2D,
693// .format = tex_format,
694// .extent = { tex_width, tex_height, 1 },
695// .mipLevels = 1,
696// .arraySize = 1,
Chia-I Wu5c17c962015-10-31 00:31:16 +0800697// .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlis2717d132015-07-10 18:25:07 -0600698// .tiling = VK_IMAGE_TILING_LINEAR,
699// .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
700// .flags = 0,
701// };
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800702// VkMemoryAllocateInfo mem_alloc = {
Chia-I Wu00ce5402015-11-10 16:21:09 +0800703// .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
Tobin Ehlis2717d132015-07-10 18:25:07 -0600704// .pNext = NULL,
705// .allocationSize = 0,
706// .memoryTypeIndex = 0,
707// };
708//
Chia-I Wuf7458c52015-10-26 21:10:41 +0800709// err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis2717d132015-07-10 18:25:07 -0600710// ASSERT_VK_SUCCESS(err);
711//
712// err = vkGetImageMemoryRequirements(m_device->device(),
713// image,
714// &mem_reqs);
715// ASSERT_VK_SUCCESS(err);
716//
717// mem_alloc.allocationSize = mem_reqs.size;
718//
Karl Schultz6addd812016-02-02 17:17:23 -0700719// err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
720// 0);
Tobin Ehlis2717d132015-07-10 18:25:07 -0600721// ASSERT_VK_SUCCESS(err);
722//
723// // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800724// err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis2717d132015-07-10 18:25:07 -0600725// ASSERT_VK_SUCCESS(err);
726//
727// // Bind memory to Image object
728// err = vkBindImageMemory(m_device->device(), image, mem, 0);
729// ASSERT_VK_SUCCESS(err);
730//
731// // Introduce validation failure, free memory while still bound to object
Chia-I Wuf7458c52015-10-26 21:10:41 +0800732// vkFreeMemory(m_device->device(), mem, NULL);
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600733//
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600734// if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700735// FAIL() << "Did not receive Warning 'Freeing memory object while it
736// still has references'");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600737// m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis2717d132015-07-10 18:25:07 -0600738// }
739//}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500740
Karl Schultz6addd812016-02-02 17:17:23 -0700741TEST_F(VkLayerTest, RebindMemory) {
742 VkResult err;
743 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500744
Karl Schultz6addd812016-02-02 17:17:23 -0700745 m_errorMonitor->SetDesiredFailureMsg(
746 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600747 "which has already been bound to mem object");
748
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500749 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500750
751 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700752 VkImage image;
753 VkDeviceMemory mem1;
754 VkDeviceMemory mem2;
755 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500756
Karl Schultz6addd812016-02-02 17:17:23 -0700757 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
758 const int32_t tex_width = 32;
759 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500760
Tony Barboureb254902015-07-15 12:50:33 -0600761 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700762 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
763 image_create_info.pNext = NULL;
764 image_create_info.imageType = VK_IMAGE_TYPE_2D;
765 image_create_info.format = tex_format;
766 image_create_info.extent.width = tex_width;
767 image_create_info.extent.height = tex_height;
768 image_create_info.extent.depth = 1;
769 image_create_info.mipLevels = 1;
770 image_create_info.arrayLayers = 1;
771 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
772 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
773 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
774 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500775
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800776 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700777 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
778 mem_alloc.pNext = NULL;
779 mem_alloc.allocationSize = 0;
780 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -0600781
Karl Schultz6addd812016-02-02 17:17:23 -0700782 // Introduce failure, do NOT set memProps to
783 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -0600784 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800785 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500786 ASSERT_VK_SUCCESS(err);
787
Karl Schultz6addd812016-02-02 17:17:23 -0700788 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500789
790 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -0700791 pass =
792 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -0600793 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500794
795 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800796 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500797 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800798 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500799 ASSERT_VK_SUCCESS(err);
800
801 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -0600802 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500803 ASSERT_VK_SUCCESS(err);
804
Karl Schultz6addd812016-02-02 17:17:23 -0700805 // Introduce validation failure, try to bind a different memory object to
806 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -0600807 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500808
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600809 if (!m_errorMonitor->DesiredMsgFound()) {
810 FAIL() << "Did not receive Error when rebinding memory to an object";
811 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500812 }
Mike Stroyand1c84a52015-08-18 14:40:24 -0600813
Chia-I Wuf7458c52015-10-26 21:10:41 +0800814 vkDestroyImage(m_device->device(), image, NULL);
815 vkFreeMemory(m_device->device(), mem1, NULL);
816 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500817}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500818
Karl Schultz6addd812016-02-02 17:17:23 -0700819TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600820 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600821
Karl Schultz6addd812016-02-02 17:17:23 -0700822 m_errorMonitor->SetDesiredFailureMsg(
823 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
824 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600825
826 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600827 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
828 fenceInfo.pNext = NULL;
829 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -0600830
Tony Barbour300a6082015-04-07 13:44:53 -0600831 ASSERT_NO_FATAL_FAILURE(InitState());
832 ASSERT_NO_FATAL_FAILURE(InitViewport());
833 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
834
Tony Barbourfe3351b2015-07-28 10:17:20 -0600835 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700836 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
837 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600838 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600839
840 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600841
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600842 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800843 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
844 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800845 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600846 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700847 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800848 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800849 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800850 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600851 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600852
853 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -0700854 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600855
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600856 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700857 FAIL() << "Did not receive Error 'VkQueueSubmit with fence in "
858 "SIGNALED_STATE'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600859 m_errorMonitor->DumpFailureMsgs();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600860 }
Tony Barbour0b4d9562015-04-09 10:48:04 -0600861}
862
Karl Schultz6addd812016-02-02 17:17:23 -0700863TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600864 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600865 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600866 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
867 fenceInfo.pNext = NULL;
868
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700869 // TODO: verify that this matches layer
Karl Schultz6addd812016-02-02 17:17:23 -0700870 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700871 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600872 "submitted to VkResetFences in UNSIGNALED STATE");
873
Tony Barbour0b4d9562015-04-09 10:48:04 -0600874 ASSERT_NO_FATAL_FAILURE(InitState());
875 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +0800876 VkFence fences[1] = {testFence.handle()};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600877 vkResetFences(m_device->device(), 1, fences);
Tony Barbour300a6082015-04-07 13:44:53 -0600878
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600879 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700880 FAIL() << "Did not receive Error 'VkResetFences with fence in "
881 "UNSIGNALED_STATE'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600882 m_errorMonitor->DumpFailureMsgs();
883 }
Tony Barbour300a6082015-04-07 13:44:53 -0600884}
Tobin Ehlis41376e12015-07-03 08:45:14 -0600885
Chia-I Wu08accc62015-07-07 11:50:03 +0800886/* TODO: Update for changes due to bug-14075 tiling across render passes */
887#if 0
Tobin Ehlis41376e12015-07-03 08:45:14 -0600888TEST_F(VkLayerTest, InvalidUsageBits)
889{
890 // Initiate Draw w/o a PSO bound
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600891
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600893 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -0600894
895 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800896 VkCommandBufferObj commandBuffer(m_device);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600897 BeginCommandBuffer();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600898
899 const VkExtent3D e3d = {
900 .width = 128,
901 .height = 128,
902 .depth = 1,
903 };
904 const VkImageCreateInfo ici = {
905 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
906 .pNext = NULL,
907 .imageType = VK_IMAGE_TYPE_2D,
908 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
909 .extent = e3d,
910 .mipLevels = 1,
911 .arraySize = 1,
Chia-I Wu5c17c962015-10-31 00:31:16 +0800912 .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600913 .tiling = VK_IMAGE_TILING_LINEAR,
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600914 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
Tobin Ehlis41376e12015-07-03 08:45:14 -0600915 .flags = 0,
916 };
917
918 VkImage dsi;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800919 vkCreateImage(m_device->device(), &ici, NULL, &dsi);
Tobin Ehlis41376e12015-07-03 08:45:14 -0600920 VkDepthStencilView dsv;
921 const VkDepthStencilViewCreateInfo dsvci = {
922 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
923 .pNext = NULL,
924 .image = dsi,
925 .mipLevel = 0,
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -0600926 .baseArrayLayer = 0,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600927 .arraySize = 1,
928 .flags = 0,
929 };
Chia-I Wuf7458c52015-10-26 21:10:41 +0800930 vkCreateDepthStencilView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600931
932 if (!m_errorMonitor->DesiredMsgFound()) {
Tobin Ehlis41376e12015-07-03 08:45:14 -0600933 FAIL() << "Error received was not 'Invalid usage flag for image...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600934 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600935 }
936}
Mark Lobodzinski209b5292015-09-17 09:44:05 -0600937#endif // 0
938#endif // MEM_TRACKER_TESTS
939
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600940#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -0700941TEST_F(VkLayerTest, PipelineNotBound) {
942 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600943
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -0700945 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600946
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600947 ASSERT_NO_FATAL_FAILURE(InitState());
948 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600949
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800950 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700951 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
952 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600953
954 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700955 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
956 ds_pool_ci.pNext = NULL;
957 ds_pool_ci.maxSets = 1;
958 ds_pool_ci.poolSizeCount = 1;
959 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600960
961 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -0700962 err =
963 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600964 ASSERT_VK_SUCCESS(err);
965
966 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700967 dsl_binding.binding = 0;
968 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
969 dsl_binding.descriptorCount = 1;
970 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
971 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600972
973 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700974 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
975 ds_layout_ci.pNext = NULL;
976 ds_layout_ci.bindingCount = 1;
977 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600978
979 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700980 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
981 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600982 ASSERT_VK_SUCCESS(err);
983
984 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800985 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800986 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -0700987 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -0600988 alloc_info.descriptorPool = ds_pool;
989 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700990 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
991 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600992 ASSERT_VK_SUCCESS(err);
993
994 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700995 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
996 pipeline_layout_ci.pNext = NULL;
997 pipeline_layout_ci.setLayoutCount = 1;
998 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600999
1000 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001001 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1002 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001003 ASSERT_VK_SUCCESS(err);
1004
Mark Youngad779052016-01-06 14:26:04 -07001005 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001006
1007 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001008 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1009 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001010
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001011 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001012 FAIL()
1013 << "Error received was not 'Invalid VkPipeline Object 0xbaadb1be'"
1014 << endl;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001015 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisec598302015-09-15 15:02:17 -06001016 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06001017
Chia-I Wuf7458c52015-10-26 21:10:41 +08001018 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1019 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1020 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001021}
1022
Karl Schultz6addd812016-02-02 17:17:23 -07001023TEST_F(VkLayerTest, BindInvalidMemory) {
1024 VkResult err;
1025 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001026
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001028 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001029
Tobin Ehlisec598302015-09-15 15:02:17 -06001030 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001031
1032 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001033 VkImage image;
1034 VkDeviceMemory mem;
1035 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001036
Karl Schultz6addd812016-02-02 17:17:23 -07001037 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1038 const int32_t tex_width = 32;
1039 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001040
1041 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001042 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1043 image_create_info.pNext = NULL;
1044 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1045 image_create_info.format = tex_format;
1046 image_create_info.extent.width = tex_width;
1047 image_create_info.extent.height = tex_height;
1048 image_create_info.extent.depth = 1;
1049 image_create_info.mipLevels = 1;
1050 image_create_info.arrayLayers = 1;
1051 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1052 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1053 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1054 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001055
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001056 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001057 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1058 mem_alloc.pNext = NULL;
1059 mem_alloc.allocationSize = 0;
1060 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001061
Chia-I Wuf7458c52015-10-26 21:10:41 +08001062 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001063 ASSERT_VK_SUCCESS(err);
1064
Karl Schultz6addd812016-02-02 17:17:23 -07001065 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001066
1067 mem_alloc.allocationSize = mem_reqs.size;
1068
Karl Schultz6addd812016-02-02 17:17:23 -07001069 pass =
1070 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001071 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001072
1073 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001074 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001075 ASSERT_VK_SUCCESS(err);
1076
1077 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001078 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001079
1080 // Try to bind free memory that has been freed
1081 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1082 // This may very well return an error.
1083 (void)err;
1084
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001085 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001086 FAIL() << "Did not receive Error 'Invalid VkDeviceMemory Object "
1087 "0x<handle>'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001088 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisec598302015-09-15 15:02:17 -06001089 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06001090
Chia-I Wuf7458c52015-10-26 21:10:41 +08001091 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001092}
1093
Karl Schultz6addd812016-02-02 17:17:23 -07001094TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1095 VkResult err;
1096 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001097
Karl Schultz6addd812016-02-02 17:17:23 -07001098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1099 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001100
Tobin Ehlisec598302015-09-15 15:02:17 -06001101 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001102
Karl Schultz6addd812016-02-02 17:17:23 -07001103 // Create an image object, allocate memory, destroy the object and then try
1104 // to bind it
1105 VkImage image;
1106 VkDeviceMemory mem;
1107 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001108
Karl Schultz6addd812016-02-02 17:17:23 -07001109 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1110 const int32_t tex_width = 32;
1111 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001112
1113 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001114 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1115 image_create_info.pNext = NULL;
1116 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1117 image_create_info.format = tex_format;
1118 image_create_info.extent.width = tex_width;
1119 image_create_info.extent.height = tex_height;
1120 image_create_info.extent.depth = 1;
1121 image_create_info.mipLevels = 1;
1122 image_create_info.arrayLayers = 1;
1123 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1124 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1125 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1126 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001127
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001128 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001129 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1130 mem_alloc.pNext = NULL;
1131 mem_alloc.allocationSize = 0;
1132 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001133
Chia-I Wuf7458c52015-10-26 21:10:41 +08001134 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001135 ASSERT_VK_SUCCESS(err);
1136
Karl Schultz6addd812016-02-02 17:17:23 -07001137 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001138
1139 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001140 pass =
1141 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001142 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001143
1144 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001145 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001146 ASSERT_VK_SUCCESS(err);
1147
1148 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001149 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001150 ASSERT_VK_SUCCESS(err);
1151
1152 // Now Try to bind memory to this destroyed object
1153 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1154 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001155 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001156
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001157 if (!m_errorMonitor->DesiredMsgFound()) {
1158 FAIL() << "Did not receive Error 'Invalid VkImage Object 0x<handle>'";
1159 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001160 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06001161
Chia-I Wuf7458c52015-10-26 21:10:41 +08001162 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001163}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001164
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001165#endif // OBJ_TRACKER_TESTS
1166
Tobin Ehlis0788f522015-05-26 16:11:58 -06001167#if DRAW_STATE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07001168TEST_F(VkLayerTest, LineWidthStateNotBound) {
1169 m_errorMonitor->SetDesiredFailureMsg(
1170 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001171 "Dynamic line width state not set for this command buffer");
1172
Karl Schultz6addd812016-02-02 17:17:23 -07001173 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line "
1174 "width state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001175
Karl Schultz6addd812016-02-02 17:17:23 -07001176 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1177 BsoFailLineWidth);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001178
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001179 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001180 FAIL() << "Did not receive Error 'Dynamic line width state not set for "
1181 "this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001182 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001183 }
1184}
1185
Karl Schultz6addd812016-02-02 17:17:23 -07001186TEST_F(VkLayerTest, DepthBiasStateNotBound) {
1187 m_errorMonitor->SetDesiredFailureMsg(
1188 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001189 "Dynamic depth bias state not set for this command buffer");
1190
Karl Schultz6addd812016-02-02 17:17:23 -07001191 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1192 "bias state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001193
Karl Schultz6addd812016-02-02 17:17:23 -07001194 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1195 BsoFailDepthBias);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001196
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001197 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001198 FAIL() << "Did not receive Error 'Dynamic depth bias state not set for "
1199 "this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001200 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001201 }
1202}
1203
Karl Schultz6addd812016-02-02 17:17:23 -07001204// Disable these two tests until we can sort out how to track multiple layer
1205// errors
1206TEST_F(VkLayerTest, ViewportStateNotBound) {
1207 m_errorMonitor->SetDesiredFailureMsg(
1208 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001209 "Dynamic viewport state not set for this command buffer");
1210
Karl Schultz6addd812016-02-02 17:17:23 -07001211 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1212 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001213
Karl Schultz6addd812016-02-02 17:17:23 -07001214 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1215 BsoFailViewport);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001216
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001217 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001218 FAIL() << "Did not recieve Error 'Dynamic scissor state not set for "
1219 "this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001220 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001221 }
1222}
1223
Karl Schultz6addd812016-02-02 17:17:23 -07001224TEST_F(VkLayerTest, ScissorStateNotBound) {
1225 m_errorMonitor->SetDesiredFailureMsg(
1226 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001227 "Dynamic scissor state not set for this command buffer");
1228
Karl Schultz6addd812016-02-02 17:17:23 -07001229 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1230 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001231
Karl Schultz6addd812016-02-02 17:17:23 -07001232 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1233 BsoFailScissor);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001234
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001235 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001236 FAIL() << "Did not recieve Error ' Expected: 'Dynamic scissor state "
1237 "not set for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001238 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001239 }
1240}
1241
Karl Schultz6addd812016-02-02 17:17:23 -07001242TEST_F(VkLayerTest, BlendStateNotBound) {
1243 m_errorMonitor->SetDesiredFailureMsg(
1244 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001245 "Dynamic blend object state not set for this command buffer");
1246
Karl Schultz6addd812016-02-02 17:17:23 -07001247 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend "
1248 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001249
Karl Schultz6addd812016-02-02 17:17:23 -07001250 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1251 BsoFailBlend);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001252
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001253 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001254 FAIL() << "Did not recieve Error 'Dynamic blend object state not set "
1255 "for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001256 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001257 }
1258}
1259
Karl Schultz6addd812016-02-02 17:17:23 -07001260TEST_F(VkLayerTest, DepthBoundsStateNotBound) {
1261 m_errorMonitor->SetDesiredFailureMsg(
1262 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001263 "Dynamic depth bounds state not set for this command buffer");
1264
Karl Schultz6addd812016-02-02 17:17:23 -07001265 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1266 "bounds state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001267
Karl Schultz6addd812016-02-02 17:17:23 -07001268 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1269 BsoFailDepthBounds);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001270
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001271 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001272 FAIL() << "Did not receive Error 'Dynamic depth bounds state not set "
1273 "for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001274 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001275 }
1276}
1277
Karl Schultz6addd812016-02-02 17:17:23 -07001278TEST_F(VkLayerTest, StencilReadMaskNotSet) {
1279 m_errorMonitor->SetDesiredFailureMsg(
1280 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001281 "Dynamic stencil read mask state not set for this command buffer");
1282
Tobin Ehlis963a4042015-09-29 08:18:34 -06001283 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001284
Karl Schultz6addd812016-02-02 17:17:23 -07001285 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1286 "read mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001287
Karl Schultz6addd812016-02-02 17:17:23 -07001288 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1289 BsoFailStencilReadMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001290
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001291 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001292 FAIL() << "Did not receive Error 'Dynamic stencil read mask state not "
1293 "set for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001294 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001295 }
1296}
1297
Karl Schultz6addd812016-02-02 17:17:23 -07001298TEST_F(VkLayerTest, StencilWriteMaskNotSet) {
1299 m_errorMonitor->SetDesiredFailureMsg(
1300 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001301 "Dynamic stencil write mask state not set for this command buffer");
1302
Tobin Ehlis963a4042015-09-29 08:18:34 -06001303 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001304
Karl Schultz6addd812016-02-02 17:17:23 -07001305 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1306 "write mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001307
Karl Schultz6addd812016-02-02 17:17:23 -07001308 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1309 BsoFailStencilWriteMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001310
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001311 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001312 FAIL() << "Did not receive Error 'Dynamic stencil write mask state not "
1313 "set for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001314 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001315 }
1316}
1317
Karl Schultz6addd812016-02-02 17:17:23 -07001318TEST_F(VkLayerTest, StencilReferenceNotSet) {
1319 m_errorMonitor->SetDesiredFailureMsg(
1320 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001321 "Dynamic stencil reference state not set for this command buffer");
1322
Karl Schultz6addd812016-02-02 17:17:23 -07001323 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
1324 "reference is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001325
Karl Schultz6addd812016-02-02 17:17:23 -07001326 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1327 BsoFailStencilReference);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001328
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001329 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001330 FAIL() << "Did not receive Error 'Dynamic stencil reference state not "
1331 "set for this command buffer'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001332 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001333 }
1334}
1335
Karl Schultz6addd812016-02-02 17:17:23 -07001336TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001337 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001338
Karl Schultz6addd812016-02-02 17:17:23 -07001339 m_errorMonitor->SetDesiredFailureMsg(
1340 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1341 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
1342 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001343
1344 VkFenceCreateInfo fenceInfo = {};
1345 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1346 fenceInfo.pNext = NULL;
1347 fenceInfo.flags = 0;
1348
1349 ASSERT_NO_FATAL_FAILURE(InitState());
1350 ASSERT_NO_FATAL_FAILURE(InitViewport());
1351 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1352
Karl Schultz6addd812016-02-02 17:17:23 -07001353 // We luck out b/c by default the framework creates CB w/ the
1354 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001355 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001356 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
1357 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001358 EndCommandBuffer();
1359
1360 testFence.init(*m_device, fenceInfo);
1361
1362 // Bypass framework since it does the waits automatically
1363 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001364 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001365 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1366 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001367 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001368 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001369 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001370 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001371 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001372 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001373 submit_info.pSignalSemaphores = NULL;
1374
Karl Schultz6addd812016-02-02 17:17:23 -07001375 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
1376 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001377
Karl Schultz6addd812016-02-02 17:17:23 -07001378 // Cause validation error by re-submitting cmd buffer that should only be
1379 // submitted once
1380 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001381
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001382 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001383 FAIL() << "Did not receive Error 'CB (0xaddress) was created w/ "
1384 "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001385 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06001386 }
1387}
1388
Karl Schultz6addd812016-02-02 17:17:23 -07001389TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001390 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07001391 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001392
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001394 "Unable to allocate 1 descriptors of "
1395 "type "
1396 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001397
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001398 ASSERT_NO_FATAL_FAILURE(InitState());
1399 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001400
Karl Schultz6addd812016-02-02 17:17:23 -07001401 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
1402 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001403 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001404 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
1405 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001406
1407 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001408 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1409 ds_pool_ci.pNext = NULL;
1410 ds_pool_ci.flags = 0;
1411 ds_pool_ci.maxSets = 1;
1412 ds_pool_ci.poolSizeCount = 1;
1413 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001414
1415 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001416 err =
1417 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001418 ASSERT_VK_SUCCESS(err);
1419
1420 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001421 dsl_binding.binding = 0;
1422 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1423 dsl_binding.descriptorCount = 1;
1424 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1425 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001426
1427 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001428 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1429 ds_layout_ci.pNext = NULL;
1430 ds_layout_ci.bindingCount = 1;
1431 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001432
1433 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001434 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1435 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001436 ASSERT_VK_SUCCESS(err);
1437
1438 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001439 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001440 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001441 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001442 alloc_info.descriptorPool = ds_pool;
1443 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001444 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1445 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001446
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001447 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001448 FAIL() << "Did not receive Error 'Unable to allocate 1 descriptors of "
1449 "type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001450 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001451 }
1452
Chia-I Wuf7458c52015-10-26 21:10:41 +08001453 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1454 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06001455}
1456
Karl Schultz6addd812016-02-02 17:17:23 -07001457TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
1458 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06001459
Karl Schultz6addd812016-02-02 17:17:23 -07001460 m_errorMonitor->SetDesiredFailureMsg(
1461 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1462 "It is invalid to call vkFreeDescriptorSets() with a pool created "
1463 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001464
Tobin Ehlise735c692015-10-08 13:13:50 -06001465 ASSERT_NO_FATAL_FAILURE(InitState());
1466 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06001467
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001468 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001469 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1470 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06001471
1472 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001473 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1474 ds_pool_ci.pNext = NULL;
1475 ds_pool_ci.maxSets = 1;
1476 ds_pool_ci.poolSizeCount = 1;
1477 ds_pool_ci.flags = 0;
1478 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
1479 // app can only call vkResetDescriptorPool on this pool.;
1480 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06001481
1482 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001483 err =
1484 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06001485 ASSERT_VK_SUCCESS(err);
1486
1487 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001488 dsl_binding.binding = 0;
1489 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1490 dsl_binding.descriptorCount = 1;
1491 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1492 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06001493
1494 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001495 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1496 ds_layout_ci.pNext = NULL;
1497 ds_layout_ci.bindingCount = 1;
1498 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06001499
1500 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001501 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1502 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06001503 ASSERT_VK_SUCCESS(err);
1504
1505 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001506 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001507 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001508 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001509 alloc_info.descriptorPool = ds_pool;
1510 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001511 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1512 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06001513 ASSERT_VK_SUCCESS(err);
1514
1515 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001516 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001517 FAIL() << "Did not receive Error 'It is invalid to call "
1518 "vkFreeDescriptorSets() with a pool created with...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001519 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlise735c692015-10-08 13:13:50 -06001520 }
1521
Chia-I Wuf7458c52015-10-26 21:10:41 +08001522 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1523 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06001524}
1525
Karl Schultz6addd812016-02-02 17:17:23 -07001526TEST_F(VkLayerTest, InvalidDescriptorPool) {
1527 // TODO : Simple check for bad object should be added to ObjectTracker to
1528 // catch this case
1529 // The DS check for this is after driver has been called to validate DS
1530 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001531 // Attempt to clear DS Pool with bad object
Karl Schultz6addd812016-02-02 17:17:23 -07001532 /*
1533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1534 "Unable to find pool node for pool 0xbaad6001 specified in
1535 vkResetDescriptorPool() call");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001536
Karl Schultz6addd812016-02-02 17:17:23 -07001537 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
1538 vkResetDescriptorPool(device(), badPool);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001539
Karl Schultz6addd812016-02-02 17:17:23 -07001540 if (!m_errorMonitor->DesiredMsgFound()) {
1541 FAIL() << "Did not receive Error 'Unable to find pool node for pool
1542 0xbaad6001 specified in vkResetDescriptorPool() call'";
1543 m_errorMonitor->DumpFailureMsgs();
1544 }*/
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001545}
1546
Karl Schultz6addd812016-02-02 17:17:23 -07001547TEST_F(VkLayerTest, InvalidDescriptorSet) {
1548 // TODO : Simple check for bad object should be added to ObjectTracker to
1549 // catch this case
1550 // The DS check for this is after driver has been called to validate DS
1551 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001552 // Create a valid cmd buffer
1553 // call vkCmdBindDescriptorSets w/ false DS
1554}
1555
Karl Schultz6addd812016-02-02 17:17:23 -07001556TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
1557 // TODO : Simple check for bad object should be added to ObjectTracker to
1558 // catch this case
1559 // The DS check for this is after driver has been called to validate DS
1560 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001561}
1562
Karl Schultz6addd812016-02-02 17:17:23 -07001563TEST_F(VkLayerTest, InvalidPipeline) {
1564 // TODO : Simple check for bad object should be added to ObjectTracker to
1565 // catch this case
1566 // The DS check for this is after driver has been called to validate DS
1567 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001568 // Create a valid cmd buffer
1569 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultz6addd812016-02-02 17:17:23 -07001570 //
1571 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1572 // "Attempt to bind Pipeline ");
1573 //
1574 // ASSERT_NO_FATAL_FAILURE(InitState());
1575 // VkCommandBufferObj commandBuffer(m_device);
1576 // BeginCommandBuffer();
1577 // VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
1578 // vkCmdBindPipeline(commandBuffer.GetBufferHandle(),
1579 // VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
1580 //
1581 // if (!m_errorMonitor->DesiredMsgFound()) {
1582 // FAIL() << "Did not receive Error 'Attempt to bind Pipeline
1583 // 0xbaadb1be that doesn't exist!'";
1584 // m_errorMonitor->DumpFailureMsgs();
1585 // }
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06001586}
1587
Karl Schultz6addd812016-02-02 17:17:23 -07001588TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
1589 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
1590 // CommandBuffer
1591 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001592
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001593 // TODO: verify that this matches layer
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07001594 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001595 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001596
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001597 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06001598 ASSERT_NO_FATAL_FAILURE(InitViewport());
1599 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001600 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001601 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1602 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06001603
1604 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001605 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1606 ds_pool_ci.pNext = NULL;
1607 ds_pool_ci.maxSets = 1;
1608 ds_pool_ci.poolSizeCount = 1;
1609 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06001610
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001611 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001612 err =
1613 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001614 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001615
Tony Barboureb254902015-07-15 12:50:33 -06001616 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001617 dsl_binding.binding = 0;
1618 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1619 dsl_binding.descriptorCount = 1;
1620 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1621 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001622
Tony Barboureb254902015-07-15 12:50:33 -06001623 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001624 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1625 ds_layout_ci.pNext = NULL;
1626 ds_layout_ci.bindingCount = 1;
1627 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001628 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001629 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1630 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001631 ASSERT_VK_SUCCESS(err);
1632
1633 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001634 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001635 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001636 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06001637 alloc_info.descriptorPool = ds_pool;
1638 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001639 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1640 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001641 ASSERT_VK_SUCCESS(err);
1642
Tony Barboureb254902015-07-15 12:50:33 -06001643 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001644 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1645 pipeline_layout_ci.pNext = NULL;
1646 pipeline_layout_ci.setLayoutCount = 1;
1647 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001648
1649 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001650 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1651 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001652 ASSERT_VK_SUCCESS(err);
1653
Karl Schultz6addd812016-02-02 17:17:23 -07001654 VkShaderObj vs(m_device, bindStateVertShaderText,
1655 VK_SHADER_STAGE_VERTEX_BIT, this);
1656 // TODO - We shouldn't need a fragment shader but add it to be able to run
1657 // on more devices
1658 VkShaderObj fs(m_device, bindStateFragShaderText,
1659 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001660
Tony Barbourc95e4ac2015-08-04 17:05:26 -06001661 VkPipelineObj pipe(m_device);
1662 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06001663 pipe.AddShader(&fs);
Tony Barbourc95e4ac2015-08-04 17:05:26 -06001664 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06001665
1666 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001667 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1668 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
1669 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1670 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1671 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06001672
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001673 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001674 FAIL() << "Did not recieve Warning 'DS <blah> bound but it was never "
1675 "updated. You may want to either update it or not bind it.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001676 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06001677 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06001678
Chia-I Wuf7458c52015-10-26 21:10:41 +08001679 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1680 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1681 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06001682}
1683
Karl Schultz6addd812016-02-02 17:17:23 -07001684TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001685 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07001686 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001687
Karl Schultz6addd812016-02-02 17:17:23 -07001688 m_errorMonitor->SetDesiredFailureMsg(
1689 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001690 "Attempt to update descriptor with invalid bufferView ");
1691
1692 ASSERT_NO_FATAL_FAILURE(InitState());
1693 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001694 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1695 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001696
1697 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001698 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1699 ds_pool_ci.pNext = NULL;
1700 ds_pool_ci.maxSets = 1;
1701 ds_pool_ci.poolSizeCount = 1;
1702 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001703
1704 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001705 err =
1706 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001707 ASSERT_VK_SUCCESS(err);
1708
1709 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001710 dsl_binding.binding = 0;
1711 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1712 dsl_binding.descriptorCount = 1;
1713 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1714 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001715
1716 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001717 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1718 ds_layout_ci.pNext = NULL;
1719 ds_layout_ci.bindingCount = 1;
1720 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001721 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001722 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1723 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001724 ASSERT_VK_SUCCESS(err);
1725
1726 VkDescriptorSet descriptorSet;
1727 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001728 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001729 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001730 alloc_info.descriptorPool = ds_pool;
1731 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001732 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1733 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001734 ASSERT_VK_SUCCESS(err);
1735
Karl Schultz6addd812016-02-02 17:17:23 -07001736 VkBufferView view =
1737 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001738 VkWriteDescriptorSet descriptor_write;
1739 memset(&descriptor_write, 0, sizeof(descriptor_write));
1740 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1741 descriptor_write.dstSet = descriptorSet;
1742 descriptor_write.dstBinding = 0;
1743 descriptor_write.descriptorCount = 1;
1744 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1745 descriptor_write.pTexelBufferView = &view;
1746
1747 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1748
1749 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001750 FAIL() << "Did not receive Error 'Attempt to update descriptor with "
1751 "invalid bufferView'";
Tobin Ehlisba31cab2015-11-02 15:24:32 -07001752 m_errorMonitor->DumpFailureMsgs();
1753 }
1754
1755 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1756 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1757}
1758
Karl Schultz6addd812016-02-02 17:17:23 -07001759TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
1760 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
1761 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07001762 // 1. No dynamicOffset supplied
1763 // 2. Too many dynamicOffsets supplied
1764 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07001765 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07001767 " requires 1 dynamicOffsets, but only "
1768 "0 dynamicOffsets are left in "
1769 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001770
1771 ASSERT_NO_FATAL_FAILURE(InitState());
1772 ASSERT_NO_FATAL_FAILURE(InitViewport());
1773 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1774
1775 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001776 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1777 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001778
1779 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001780 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1781 ds_pool_ci.pNext = NULL;
1782 ds_pool_ci.maxSets = 1;
1783 ds_pool_ci.poolSizeCount = 1;
1784 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001785
1786 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07001787 err =
1788 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001789 ASSERT_VK_SUCCESS(err);
1790
1791 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001792 dsl_binding.binding = 0;
1793 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1794 dsl_binding.descriptorCount = 1;
1795 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1796 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001797
1798 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001799 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1800 ds_layout_ci.pNext = NULL;
1801 ds_layout_ci.bindingCount = 1;
1802 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001803 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001804 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1805 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001806 ASSERT_VK_SUCCESS(err);
1807
1808 VkDescriptorSet descriptorSet;
1809 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001810 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001811 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001812 alloc_info.descriptorPool = ds_pool;
1813 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001814 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1815 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001816 ASSERT_VK_SUCCESS(err);
1817
1818 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001819 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1820 pipeline_layout_ci.pNext = NULL;
1821 pipeline_layout_ci.setLayoutCount = 1;
1822 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001823
1824 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07001825 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1826 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001827 ASSERT_VK_SUCCESS(err);
1828
1829 // Create a buffer to update the descriptor with
1830 uint32_t qfi = 0;
1831 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001832 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1833 buffCI.size = 1024;
1834 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1835 buffCI.queueFamilyIndexCount = 1;
1836 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001837
1838 VkBuffer dyub;
1839 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
1840 ASSERT_VK_SUCCESS(err);
1841 // Correctly update descriptor to avoid "NOT_UPDATED" error
1842 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001843 buffInfo.buffer = dyub;
1844 buffInfo.offset = 0;
1845 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001846
1847 VkWriteDescriptorSet descriptor_write;
1848 memset(&descriptor_write, 0, sizeof(descriptor_write));
1849 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1850 descriptor_write.dstSet = descriptorSet;
1851 descriptor_write.dstBinding = 0;
1852 descriptor_write.descriptorCount = 1;
1853 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
1854 descriptor_write.pBufferInfo = &buffInfo;
1855
1856 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1857
1858 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07001859 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1860 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1861 1, &descriptorSet, 0, NULL);
Tobin Ehlisf6585052015-12-17 11:48:42 -07001862 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001863 FAIL() << "Error received was not 'descriptorSet #0 (0x<ADDR>) "
1864 "requires 1 dynamicOffsets, but only 0 dynamicOffsets are "
1865 "left in pDynamicOffsets array...'";
Tobin Ehlisf6585052015-12-17 11:48:42 -07001866 m_errorMonitor->DumpFailureMsgs();
1867 }
1868 uint32_t pDynOff[2] = {512, 756};
1869 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07001870 m_errorMonitor->SetDesiredFailureMsg(
1871 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07001872 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07001873 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1874 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1875 1, &descriptorSet, 2, pDynOff);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001876 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001877 FAIL() << "Error received was not 'Attempting to bind 1 descriptorSets "
1878 "with 1 dynamic descriptors, but dynamicOffsetCount is 0...'";
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001879 m_errorMonitor->DumpFailureMsgs();
1880 }
Tobin Ehlisf6585052015-12-17 11:48:42 -07001881 // Finally cause error due to dynamicOffset being too big
Karl Schultz6addd812016-02-02 17:17:23 -07001882 m_errorMonitor->SetDesiredFailureMsg(
1883 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07001884 " from its update, this oversteps its buffer (");
1885 // Create PSO to be used for draw-time errors below
1886 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07001887 "#version 400\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07001888 "#extension GL_ARB_separate_shader_objects: require\n"
1889 "#extension GL_ARB_shading_language_420pack: require\n"
1890 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07001891 "out gl_PerVertex { \n"
1892 " vec4 gl_Position;\n"
1893 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07001894 "void main(){\n"
1895 " gl_Position = vec4(1);\n"
1896 "}\n";
1897 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07001898 "#version 400\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07001899 "#extension GL_ARB_separate_shader_objects: require\n"
1900 "#extension GL_ARB_shading_language_420pack: require\n"
1901 "\n"
1902 "layout(location=0) out vec4 x;\n"
1903 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
1904 "void main(){\n"
1905 " x = vec4(bar.y);\n"
1906 "}\n";
1907 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
1908 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1909 VkPipelineObj pipe(m_device);
1910 pipe.AddShader(&vs);
1911 pipe.AddShader(&fs);
1912 pipe.AddColorAttachment();
1913 pipe.CreateVKPipeline(pipeline_layout, renderPass());
1914
Karl Schultz6addd812016-02-02 17:17:23 -07001915 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
1916 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
1917 // This update should succeed, but offset size of 512 will overstep buffer
1918 // /w range 1024 & size 1024
1919 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
1920 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
1921 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07001922 Draw(1, 0, 0, 0);
1923 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07001924 FAIL() << "Error received was not 'VkDescriptorSet (0x<ADDR>) bound as "
1925 "set #0 has dynamic offset 512. Combined with offet 0 and "
1926 "range 1024 from its update, this oversteps...'";
Tobin Ehlisf6585052015-12-17 11:48:42 -07001927 m_errorMonitor->DumpFailureMsgs();
1928 }
Tobin Ehlis49f903e2015-11-04 13:30:34 -07001929
1930 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1931 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1932}
1933
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07001934TEST_F(VkLayerTest, InvalidPushConstants) {
1935 // Hit push constant error cases:
1936 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
1937 // 2. Incorrectly set push constant size to 0
1938 // 3. Incorrectly set push constant size to non-multiple of 4
1939 // 4. Attempt push constant update that exceeds maxPushConstantSize
1940 VkResult err;
1941 m_errorMonitor->SetDesiredFailureMsg(
1942 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1943 "vkCreatePipelineLayout() call has push constants with offset ");
1944
1945 ASSERT_NO_FATAL_FAILURE(InitState());
1946 ASSERT_NO_FATAL_FAILURE(InitViewport());
1947 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1948
1949 VkPushConstantRange pc_range = {};
1950 pc_range.size = 0xFFFFFFFFu;
1951 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
1952 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1953 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1954 pipeline_layout_ci.pushConstantRangeCount = 1;
1955 pipeline_layout_ci.pPushConstantRanges = &pc_range;
1956
1957 VkPipelineLayout pipeline_layout;
1958 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1959 &pipeline_layout);
1960
1961 if (!m_errorMonitor->DesiredMsgFound()) {
1962 FAIL() << "Error received was not 'vkCreatePipelineLayout() call has "
1963 "push constants with offset 0...'";
1964 m_errorMonitor->DumpFailureMsgs();
1965 }
1966 // Now cause errors due to size 0 and non-4 byte aligned size
1967 pc_range.size = 0;
1968 m_errorMonitor->SetDesiredFailureMsg(
1969 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1970 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
1971 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1972 &pipeline_layout);
1973 if (!m_errorMonitor->DesiredMsgFound()) {
1974 FAIL() << "Error received was not 'vkCreatePipelineLayout() call has "
1975 "push constant index 0 with size 0...'";
1976 m_errorMonitor->DumpFailureMsgs();
1977 }
1978 pc_range.size = 1;
1979 m_errorMonitor->SetDesiredFailureMsg(
1980 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1981 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
1982 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1983 &pipeline_layout);
1984 if (!m_errorMonitor->DesiredMsgFound()) {
1985 FAIL() << "Error received was not 'vkCreatePipelineLayout() call has "
1986 "push constant index 0 with size 0...'";
1987 m_errorMonitor->DumpFailureMsgs();
1988 }
1989 // Cause error due to bad size in vkCmdPushConstants() call
1990 m_errorMonitor->SetDesiredFailureMsg(
1991 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1992 "vkCmdPushConstants() call has push constants with offset ");
1993 pipeline_layout_ci.pushConstantRangeCount = 0;
1994 pipeline_layout_ci.pPushConstantRanges = NULL;
1995 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1996 &pipeline_layout);
1997 ASSERT_VK_SUCCESS(err);
1998 BeginCommandBuffer();
1999 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
2000 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
2001 if (!m_errorMonitor->DesiredMsgFound()) {
2002 FAIL() << "Error received was not 'vkCmdPushConstants() call has push "
2003 "constants with offset 0...'";
2004 m_errorMonitor->DumpFailureMsgs();
2005 }
2006 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2007}
2008
Karl Schultz6addd812016-02-02 17:17:23 -07002009TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002010 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07002011 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002012
2013 ASSERT_NO_FATAL_FAILURE(InitState());
2014 ASSERT_NO_FATAL_FAILURE(InitViewport());
2015 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2016
2017 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
2018 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002019 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2020 ds_type_count[0].descriptorCount = 10;
2021 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2022 ds_type_count[1].descriptorCount = 2;
2023 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2024 ds_type_count[2].descriptorCount = 2;
2025 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
2026 ds_type_count[3].descriptorCount = 5;
2027 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
2028 // type
2029 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
2030 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
2031 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002032
2033 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002034 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2035 ds_pool_ci.pNext = NULL;
2036 ds_pool_ci.maxSets = 5;
2037 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
2038 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002039
2040 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002041 err =
2042 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002043 ASSERT_VK_SUCCESS(err);
2044
2045 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
2046 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002047 dsl_binding[0].binding = 0;
2048 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2049 dsl_binding[0].descriptorCount = 5;
2050 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
2051 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002052
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002053 // Create layout identical to set0 layout but w/ different stageFlags
2054 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002055 dsl_fs_stage_only.binding = 0;
2056 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2057 dsl_fs_stage_only.descriptorCount = 5;
2058 dsl_fs_stage_only.stageFlags =
2059 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
2060 // bind time
2061 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002062 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002063 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2064 ds_layout_ci.pNext = NULL;
2065 ds_layout_ci.bindingCount = 1;
2066 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002067 static const uint32_t NUM_LAYOUTS = 4;
2068 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002069 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002070 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
2071 // layout for error case
2072 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2073 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002074 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002075 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002076 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2077 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002078 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002079 dsl_binding[0].binding = 0;
2080 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002081 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002082 dsl_binding[1].binding = 1;
2083 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2084 dsl_binding[1].descriptorCount = 2;
2085 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
2086 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002087 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002088 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07002089 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2090 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002091 ASSERT_VK_SUCCESS(err);
2092 dsl_binding[0].binding = 0;
2093 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002094 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002095 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07002096 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2097 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002098 ASSERT_VK_SUCCESS(err);
2099 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002100 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07002101 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2102 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002103 ASSERT_VK_SUCCESS(err);
2104
2105 static const uint32_t NUM_SETS = 4;
2106 VkDescriptorSet descriptorSet[NUM_SETS] = {};
2107 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002108 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002109 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002110 alloc_info.descriptorPool = ds_pool;
2111 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002112 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2113 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002114 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002115 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002116 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002117 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002118 err =
2119 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002120 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002121
2122 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002123 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2124 pipeline_layout_ci.pNext = NULL;
2125 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
2126 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002127
2128 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002129 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2130 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002131 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002132 // Create pipelineLayout with only one setLayout
2133 pipeline_layout_ci.setLayoutCount = 1;
2134 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002135 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2136 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002137 ASSERT_VK_SUCCESS(err);
2138 // Create pipelineLayout with 2 descriptor setLayout at index 0
2139 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
2140 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07002141 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2142 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002143 ASSERT_VK_SUCCESS(err);
2144 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
2145 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
2146 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07002147 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2148 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002149 ASSERT_VK_SUCCESS(err);
2150 // Create pipelineLayout with UB type, but stageFlags for FS only
2151 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
2152 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002153 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2154 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002155 ASSERT_VK_SUCCESS(err);
2156 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
2157 VkDescriptorSetLayout pl_bad_s0[2] = {};
2158 pl_bad_s0[0] = ds_layout_fs_only;
2159 pl_bad_s0[1] = ds_layout[1];
2160 pipeline_layout_ci.setLayoutCount = 2;
2161 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
2162 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07002163 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2164 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002165 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002166
2167 // Create a buffer to update the descriptor with
2168 uint32_t qfi = 0;
2169 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002170 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2171 buffCI.size = 1024;
2172 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2173 buffCI.queueFamilyIndexCount = 1;
2174 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002175
2176 VkBuffer dyub;
2177 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2178 ASSERT_VK_SUCCESS(err);
2179 // Correctly update descriptor to avoid "NOT_UPDATED" error
2180 static const uint32_t NUM_BUFFS = 5;
2181 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002182 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002183 buffInfo[i].buffer = dyub;
2184 buffInfo[i].offset = 0;
2185 buffInfo[i].range = 1024;
2186 }
Karl Schultz6addd812016-02-02 17:17:23 -07002187 VkImage image;
2188 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2189 const int32_t tex_width = 32;
2190 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002191 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002192 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2193 image_create_info.pNext = NULL;
2194 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2195 image_create_info.format = tex_format;
2196 image_create_info.extent.width = tex_width;
2197 image_create_info.extent.height = tex_height;
2198 image_create_info.extent.depth = 1;
2199 image_create_info.mipLevels = 1;
2200 image_create_info.arrayLayers = 1;
2201 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2202 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2203 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2204 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002205 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2206 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002207
Karl Schultz6addd812016-02-02 17:17:23 -07002208 VkMemoryRequirements memReqs;
2209 VkDeviceMemory imageMem;
2210 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002211 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002212 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2213 memAlloc.pNext = NULL;
2214 memAlloc.allocationSize = 0;
2215 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002216 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
2217 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002218 pass =
2219 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002220 ASSERT_TRUE(pass);
2221 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
2222 ASSERT_VK_SUCCESS(err);
2223 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
2224 ASSERT_VK_SUCCESS(err);
2225
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002226 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002227 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2228 image_view_create_info.image = image;
2229 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
2230 image_view_create_info.format = tex_format;
2231 image_view_create_info.subresourceRange.layerCount = 1;
2232 image_view_create_info.subresourceRange.baseMipLevel = 0;
2233 image_view_create_info.subresourceRange.levelCount = 1;
2234 image_view_create_info.subresourceRange.aspectMask =
2235 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002236
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002237 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07002238 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
2239 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002240 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002241 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002242 imageInfo[0].imageView = view;
2243 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2244 imageInfo[1].imageView = view;
2245 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002246 imageInfo[2].imageView = view;
2247 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2248 imageInfo[3].imageView = view;
2249 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002250
2251 static const uint32_t NUM_SET_UPDATES = 3;
2252 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
2253 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2254 descriptor_write[0].dstSet = descriptorSet[0];
2255 descriptor_write[0].dstBinding = 0;
2256 descriptor_write[0].descriptorCount = 5;
2257 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2258 descriptor_write[0].pBufferInfo = buffInfo;
2259 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2260 descriptor_write[1].dstSet = descriptorSet[1];
2261 descriptor_write[1].dstBinding = 0;
2262 descriptor_write[1].descriptorCount = 2;
2263 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2264 descriptor_write[1].pImageInfo = imageInfo;
2265 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2266 descriptor_write[2].dstSet = descriptorSet[1];
2267 descriptor_write[2].dstBinding = 1;
2268 descriptor_write[2].descriptorCount = 2;
2269 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002270 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002271
2272 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002273
Tobin Ehlis88452832015-12-03 09:40:56 -07002274 // Create PSO to be used for draw-time errors below
2275 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07002276 "#version 400\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002277 "#extension GL_ARB_separate_shader_objects: require\n"
2278 "#extension GL_ARB_shading_language_420pack: require\n"
2279 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002280 "out gl_PerVertex {\n"
2281 " vec4 gl_Position;\n"
2282 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002283 "void main(){\n"
2284 " gl_Position = vec4(1);\n"
2285 "}\n";
2286 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07002287 "#version 400\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002288 "#extension GL_ARB_separate_shader_objects: require\n"
2289 "#extension GL_ARB_shading_language_420pack: require\n"
2290 "\n"
2291 "layout(location=0) out vec4 x;\n"
2292 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2293 "void main(){\n"
2294 " x = vec4(bar.y);\n"
2295 "}\n";
2296 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2297 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002298 VkPipelineObj pipe(m_device);
2299 pipe.AddShader(&vs);
2300 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07002301 pipe.AddColorAttachment();
2302 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07002303
2304 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07002305
Karl Schultz6addd812016-02-02 17:17:23 -07002306 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2307 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2308 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
2309 // of PSO
2310 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
2311 // cmd_pipeline.c
2312 // due to the fact that cmd_alloc_dset_data() has not been called in
2313 // cmd_bind_graphics_pipeline()
2314 // TODO : Want to cause various binding incompatibility issues here to test
2315 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07002316 // First cause various verify_layout_compatibility() fails
2317 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002318 // verify_set_layout_compatibility fail cases:
2319 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07002320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2321 " due to: invalid VkPipelineLayout ");
2322 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2323 VK_PIPELINE_BIND_POINT_GRAPHICS,
2324 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
2325 &descriptorSet[0], 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002326 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002327 FAIL() << "Did not receive correct error msg when attempting to bind "
2328 "descriptorSets with invalid VkPipelineLayout.";
Tobin Ehlis559c6382015-11-05 09:52:49 -07002329 m_errorMonitor->DumpFailureMsgs();
2330 }
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002331 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07002332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2333 " attempting to bind set to index 1");
2334 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2335 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
2336 0, 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002337 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002338 FAIL() << "Did not receive correct error msg when attempting to bind "
2339 "descriptorSet to index 1 when pipelineLayout only has index "
2340 "0.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002341 m_errorMonitor->DumpFailureMsgs();
2342 }
2343 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002344 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
2345 // descriptors
2346 m_errorMonitor->SetDesiredFailureMsg(
2347 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2348 ", but corresponding set being bound has 5 descriptors.");
2349 vkCmdBindDescriptorSets(
2350 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2351 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002352 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002353 FAIL() << "Did not receive correct error msg when attempting to bind "
2354 "descriptorSet w/ 5 descriptors to pipelineLayout with only "
2355 "2 descriptors.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002356 m_errorMonitor->DumpFailureMsgs();
2357 }
2358 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
2359 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07002360 m_errorMonitor->SetDesiredFailureMsg(
2361 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2362 " descriptor from pipelineLayout is type 'VK_DESCRIPTOR_TYPE_SAMPLER'");
2363 vkCmdBindDescriptorSets(
2364 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2365 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002366 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002367 FAIL() << "Did not receive correct error msg when attempting to bind "
2368 "UNIFORM_BUFFER descriptorSet to pipelineLayout with "
2369 "overlapping SAMPLER type.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002370 m_errorMonitor->DumpFailureMsgs();
2371 }
2372 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
2373 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07002374 m_errorMonitor->SetDesiredFailureMsg(
2375 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2376 " descriptor from pipelineLayout has stageFlags ");
2377 vkCmdBindDescriptorSets(
2378 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2379 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002380 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002381 FAIL() << "Did not receive correct error msg when attempting to bind "
2382 "UNIFORM_BUFFER descriptorSet with ALL stageFlags to "
2383 "pipelineLayout with FS-only stageFlags.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002384 m_errorMonitor->DumpFailureMsgs();
2385 }
2386 // Cause INFO messages due to disturbing previously bound Sets
2387 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07002388 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2389 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2390 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002391 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07002392 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002393 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002394 " previously bound as set #0 was disturbed ");
2395 vkCmdBindDescriptorSets(
2396 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2397 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002398 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002399 FAIL() << "Did not receive correct info msg when binding Set1 w/ "
2400 "pipelineLayout that should disturb Set0.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002401 m_errorMonitor->DumpFailureMsgs();
2402 }
Karl Schultz6addd812016-02-02 17:17:23 -07002403 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2404 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2405 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002406 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002408 " newly bound as set #0 so set #1 and "
2409 "any subsequent sets were disturbed ");
2410 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2411 VK_PIPELINE_BIND_POINT_GRAPHICS,
2412 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 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 info msg when re-binding Set0 w/ "
2415 "pipelineLayout that should disturb Set1.";
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002416 m_errorMonitor->DumpFailureMsgs();
2417 }
Tobin Ehlis88452832015-12-03 09:40:56 -07002418 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07002419 // 1. Error due to not binding required set (we actually use same code as
2420 // above to disturb set0)
2421 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2422 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2423 2, &descriptorSet[0], 0, NULL);
2424 vkCmdBindDescriptorSets(
2425 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2426 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
2427 m_errorMonitor->SetDesiredFailureMsg(
2428 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2429 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07002430 Draw(1, 0, 0, 0);
2431 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002432 FAIL() << "Did not receive correct error msg when attempting draw "
2433 "requiring Set0 but Set0 is not bound.";
Tobin Ehlis88452832015-12-03 09:40:56 -07002434 m_errorMonitor->DumpFailureMsgs();
2435 }
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002436 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002437 // 2. Error due to bound set not being compatible with PSO's
2438 // VkPipelineLayout (diff stageFlags in this case)
2439 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2440 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2441 2, &descriptorSet[0], 0, NULL);
2442 m_errorMonitor->SetDesiredFailureMsg(
2443 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2444 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07002445 Draw(1, 0, 0, 0);
2446 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002447 FAIL() << "Did not receive correct error msg when attempted draw where "
2448 "bound Set0 layout is not compatible PSO Set0 layout.";
Tobin Ehlis88452832015-12-03 09:40:56 -07002449 m_errorMonitor->DumpFailureMsgs();
2450 }
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002451 // Remaining clean-up
2452 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07002453 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002454 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
2455 }
2456 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
2457 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
2458 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002459 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2460 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2461}
Tobin Ehlis559c6382015-11-05 09:52:49 -07002462
Karl Schultz6addd812016-02-02 17:17:23 -07002463TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002464
Karl Schultz6addd812016-02-02 17:17:23 -07002465 m_errorMonitor->SetDesiredFailureMsg(
2466 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002467 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002468
2469 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002470 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002471 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002472 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002473
2474 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002475 FAIL() << "Did not recieve Error 'You must call vkBeginCommandBuffer() "
2476 "before this call to vkEndCommandBuffer()'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002477 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002478 }
2479}
2480
Karl Schultz6addd812016-02-02 17:17:23 -07002481TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
2482 VkResult err;
2483 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002484
Karl Schultz6addd812016-02-02 17:17:23 -07002485 m_errorMonitor->SetDesiredFailureMsg(
2486 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07002487 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002488
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002489 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002490
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002491 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002492 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06002493 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002494 cmd.commandPool = m_commandPool;
2495 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002496 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06002497
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002498 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06002499 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002500
2501 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002502 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002503 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002504 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06002505 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002506 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
2507 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002508 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002509
2510 // The error should be caught by validation of the BeginCommandBuffer call
2511 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
2512
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002513 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002514 FAIL() << "Did not receive Error 'vkBeginCommandBuffer(): Secondary "
2515 "Command Buffers (0x<ADDR>) must specify a valid renderpass "
2516 "parameter.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002517 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002518 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002519 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06002520}
2521
Karl Schultz6addd812016-02-02 17:17:23 -07002522TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002523 // Cause error due to Begin while recording CB
2524 // Then cause 2 errors for attempting to reset CB w/o having
2525 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
2526 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002528 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002529
2530 ASSERT_NO_FATAL_FAILURE(InitState());
2531
2532 // Calls AllocateCommandBuffers
2533 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
2534
Karl Schultz6addd812016-02-02 17:17:23 -07002535 // Force the failure by setting the Renderpass and Framebuffer fields with
2536 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002537 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002538 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002539 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2540 cmd_buf_info.pNext = NULL;
2541 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002542 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002543
2544 // Begin CB to transition to recording state
2545 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
2546 // Can't re-begin. This should trigger error
2547 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
2548 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002549 FAIL() << "Did not receive Error 'Cannot call Begin on CB (0x<ADDR>) "
2550 "in the RECORDING state...'";
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002551 m_errorMonitor->DumpFailureMsgs();
2552 }
Karl Schultz6addd812016-02-02 17:17:23 -07002553 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2554 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002555 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
2556 // Reset attempt will trigger error due to incorrect CommandPool state
2557 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
2558 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002559 FAIL() << "Did not receive Error 'Attempt to reset command buffer "
2560 "(0x<ADDR>) created from command pool...'";
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002561 m_errorMonitor->DumpFailureMsgs();
2562 }
Karl Schultz6addd812016-02-02 17:17:23 -07002563 m_errorMonitor->SetDesiredFailureMsg(
2564 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2565 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002566 // Transition CB to RECORDED state
2567 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
2568 // Now attempting to Begin will implicitly reset, which triggers error
2569 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
2570 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002571 FAIL() << "Did not receive Error 'Call to vkBeginCommandBuffer() on "
2572 "command buffer (0x<ADDR>) attempts to implicitly reset...'";
Tobin Ehlisac0ef842015-12-14 13:46:38 -07002573 m_errorMonitor->DumpFailureMsgs();
2574 }
2575}
2576
Karl Schultz6addd812016-02-02 17:17:23 -07002577TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002578 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07002579 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002580
Karl Schultz6addd812016-02-02 17:17:23 -07002581 m_errorMonitor->SetDesiredFailureMsg(
2582 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002583 "Invalid Pipeline CreateInfo State: Vtx Shader required");
2584
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002585 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002586 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002587
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002588 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002589 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2590 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002591
2592 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002593 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2594 ds_pool_ci.pNext = NULL;
2595 ds_pool_ci.maxSets = 1;
2596 ds_pool_ci.poolSizeCount = 1;
2597 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002598
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002599 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002600 err =
2601 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002602 ASSERT_VK_SUCCESS(err);
2603
Tony Barboureb254902015-07-15 12:50:33 -06002604 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002605 dsl_binding.binding = 0;
2606 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2607 dsl_binding.descriptorCount = 1;
2608 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2609 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002610
Tony Barboureb254902015-07-15 12:50:33 -06002611 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002612 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2613 ds_layout_ci.pNext = NULL;
2614 ds_layout_ci.bindingCount = 1;
2615 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06002616
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002617 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002618 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2619 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002620 ASSERT_VK_SUCCESS(err);
2621
2622 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002623 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002624 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002625 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002626 alloc_info.descriptorPool = ds_pool;
2627 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002628 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2629 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002630 ASSERT_VK_SUCCESS(err);
2631
Tony Barboureb254902015-07-15 12:50:33 -06002632 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002633 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2634 pipeline_layout_ci.setLayoutCount = 1;
2635 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002636
2637 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002638 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2639 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002640 ASSERT_VK_SUCCESS(err);
2641
Tobin Ehlise68360f2015-10-01 11:15:13 -06002642 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07002643 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06002644
2645 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002646 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2647 vp_state_ci.scissorCount = 1;
2648 vp_state_ci.pScissors = &sc;
2649 vp_state_ci.viewportCount = 1;
2650 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002651
Karl Schultzdfdb8d42016-03-08 10:30:21 -07002652 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
2653 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
2654 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
2655 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
2656 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
2657 rs_state_ci.depthClampEnable = VK_FALSE;
2658 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
2659 rs_state_ci.depthBiasEnable = VK_FALSE;
2660
Tony Barboureb254902015-07-15 12:50:33 -06002661 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002662 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2663 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07002664 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07002665 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2666 gp_ci.layout = pipeline_layout;
2667 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06002668
2669 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002670 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2671 pc_ci.initialDataSize = 0;
2672 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002673
2674 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06002675 VkPipelineCache pipelineCache;
2676
Karl Schultz6addd812016-02-02 17:17:23 -07002677 err =
2678 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06002679 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002680 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2681 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002682
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002683 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002684 FAIL() << "Did not receive Error 'Invalid Pipeline CreateInfo State: "
2685 "Vtx Shader required'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002686 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002687 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06002688
Chia-I Wuf7458c52015-10-26 21:10:41 +08002689 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2690 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2691 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2692 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002693}
Tobin Ehlis912df022015-09-17 08:46:18 -06002694/*// TODO : This test should be good, but needs Tess support in compiler to run
2695TEST_F(VkLayerTest, InvalidPatchControlPoints)
2696{
2697 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06002698 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002699
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002700 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002701 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
2702primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002703
Tobin Ehlis912df022015-09-17 08:46:18 -06002704 ASSERT_NO_FATAL_FAILURE(InitState());
2705 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06002706
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002707 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06002708 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002709 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002710
2711 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2712 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2713 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002714 ds_pool_ci.poolSizeCount = 1;
2715 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06002716
2717 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002718 err = vkCreateDescriptorPool(m_device->device(),
2719VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06002720 ASSERT_VK_SUCCESS(err);
2721
2722 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08002723 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06002724 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08002725 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002726 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2727 dsl_binding.pImmutableSamplers = NULL;
2728
2729 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002730 ds_layout_ci.sType =
2731VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06002732 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002733 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002734 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06002735
2736 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002737 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2738&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06002739 ASSERT_VK_SUCCESS(err);
2740
2741 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07002742 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
2743VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06002744 ASSERT_VK_SUCCESS(err);
2745
2746 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002747 pipeline_layout_ci.sType =
2748VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06002749 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002750 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06002751 pipeline_layout_ci.pSetLayouts = &ds_layout;
2752
2753 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002754 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2755&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06002756 ASSERT_VK_SUCCESS(err);
2757
2758 VkPipelineShaderStageCreateInfo shaderStages[3];
2759 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
2760
Karl Schultz6addd812016-02-02 17:17:23 -07002761 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
2762this);
Tobin Ehlis912df022015-09-17 08:46:18 -06002763 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07002764 VkShaderObj
2765tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
2766this);
2767 VkShaderObj
2768te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
2769this);
Tobin Ehlis912df022015-09-17 08:46:18 -06002770
Karl Schultz6addd812016-02-02 17:17:23 -07002771 shaderStages[0].sType =
2772VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002773 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002774 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07002775 shaderStages[1].sType =
2776VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002777 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002778 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07002779 shaderStages[2].sType =
2780VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06002781 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06002782 shaderStages[2].shader = te.handle();
2783
2784 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002785 iaCI.sType =
2786VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08002787 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06002788
2789 VkPipelineTessellationStateCreateInfo tsCI = {};
2790 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
2791 tsCI.patchControlPoints = 0; // This will cause an error
2792
2793 VkGraphicsPipelineCreateInfo gp_ci = {};
2794 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2795 gp_ci.pNext = NULL;
2796 gp_ci.stageCount = 3;
2797 gp_ci.pStages = shaderStages;
2798 gp_ci.pVertexInputState = NULL;
2799 gp_ci.pInputAssemblyState = &iaCI;
2800 gp_ci.pTessellationState = &tsCI;
2801 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002802 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06002803 gp_ci.pMultisampleState = NULL;
2804 gp_ci.pDepthStencilState = NULL;
2805 gp_ci.pColorBlendState = NULL;
2806 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2807 gp_ci.layout = pipeline_layout;
2808 gp_ci.renderPass = renderPass();
2809
2810 VkPipelineCacheCreateInfo pc_ci = {};
2811 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2812 pc_ci.pNext = NULL;
2813 pc_ci.initialSize = 0;
2814 pc_ci.initialData = 0;
2815 pc_ci.maxSize = 0;
2816
2817 VkPipeline pipeline;
2818 VkPipelineCache pipelineCache;
2819
Karl Schultz6addd812016-02-02 17:17:23 -07002820 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
2821&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06002822 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002823 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2824&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06002825
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002826 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002827 FAIL() << "Did not receive Error 'Invalid Pipeline CreateInfo State:
2828VK_PRIMITIVE_TOPOLOGY_PATCH primitive...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002829 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis912df022015-09-17 08:46:18 -06002830 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06002831
Chia-I Wuf7458c52015-10-26 21:10:41 +08002832 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2833 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2834 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2835 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06002836}
2837*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06002838// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07002839TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06002840 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07002841 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002842
Karl Schultz6addd812016-02-02 17:17:23 -07002843 m_errorMonitor->SetDesiredFailureMsg(
2844 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002845 "Gfx Pipeline viewport count (1) must match scissor count (0).");
2846
Tobin Ehlise68360f2015-10-01 11:15:13 -06002847 ASSERT_NO_FATAL_FAILURE(InitState());
2848 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06002849
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002850 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002851 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2852 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002853
2854 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002855 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2856 ds_pool_ci.maxSets = 1;
2857 ds_pool_ci.poolSizeCount = 1;
2858 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002859
2860 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002861 err =
2862 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002863 ASSERT_VK_SUCCESS(err);
2864
2865 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002866 dsl_binding.binding = 0;
2867 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2868 dsl_binding.descriptorCount = 1;
2869 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002870
2871 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002872 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2873 ds_layout_ci.bindingCount = 1;
2874 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002875
2876 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002877 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2878 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002879 ASSERT_VK_SUCCESS(err);
2880
2881 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002882 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002883 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002884 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002885 alloc_info.descriptorPool = ds_pool;
2886 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002887 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2888 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002889 ASSERT_VK_SUCCESS(err);
2890
2891 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002892 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2893 pipeline_layout_ci.setLayoutCount = 1;
2894 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002895
2896 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002897 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2898 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002899 ASSERT_VK_SUCCESS(err);
2900
2901 VkViewport vp = {}; // Just need dummy vp to point to
2902
2903 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002904 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2905 vp_state_ci.scissorCount = 0;
2906 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
2907 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002908
Karl Schultzdfdb8d42016-03-08 10:30:21 -07002909 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
2910 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
2911 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
2912 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
2913 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
2914 rs_state_ci.depthClampEnable = VK_FALSE;
2915 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
2916 rs_state_ci.depthBiasEnable = VK_FALSE;
2917
Cody Northropeb3a6c12015-10-05 14:44:45 -06002918 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07002919 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06002920
Karl Schultz6addd812016-02-02 17:17:23 -07002921 VkShaderObj vs(m_device, bindStateVertShaderText,
2922 VK_SHADER_STAGE_VERTEX_BIT, this);
2923 VkShaderObj fs(m_device, bindStateFragShaderText,
2924 VK_SHADER_STAGE_FRAGMENT_BIT,
2925 this); // TODO - We shouldn't need a fragment shader
2926 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08002927 shaderStages[0] = vs.GetStageCreateInfo();
2928 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002929
2930 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002931 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
2932 gp_ci.stageCount = 2;
2933 gp_ci.pStages = shaderStages;
2934 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07002935 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07002936 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2937 gp_ci.layout = pipeline_layout;
2938 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002939
2940 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002941 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002942
2943 VkPipeline pipeline;
2944 VkPipelineCache pipelineCache;
2945
Karl Schultz6addd812016-02-02 17:17:23 -07002946 err =
2947 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002948 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07002949 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
2950 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002951
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002952 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07002953 FAIL() << "Did not receive Error 'Gfx Pipeline viewport count (1) must "
2954 "match scissor count (0).'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002955 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlise68360f2015-10-01 11:15:13 -06002956 }
2957
Chia-I Wuf7458c52015-10-26 21:10:41 +08002958 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
2959 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2960 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2961 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002962}
Karl Schultz6addd812016-02-02 17:17:23 -07002963// Don't set viewport state in PSO. This is an error b/c we always need this
2964// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06002965// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07002966TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06002967 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07002968 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002969
Karl Schultz6addd812016-02-02 17:17:23 -07002970 m_errorMonitor->SetDesiredFailureMsg(
2971 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002972 "Gfx Pipeline pViewportState is null. Even if ");
2973
Tobin Ehlise68360f2015-10-01 11:15:13 -06002974 ASSERT_NO_FATAL_FAILURE(InitState());
2975 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06002976
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002977 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002978 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2979 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002980
2981 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002982 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2983 ds_pool_ci.maxSets = 1;
2984 ds_pool_ci.poolSizeCount = 1;
2985 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002986
2987 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002988 err =
2989 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06002990 ASSERT_VK_SUCCESS(err);
2991
2992 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002993 dsl_binding.binding = 0;
2994 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2995 dsl_binding.descriptorCount = 1;
2996 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06002997
2998 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002999 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3000 ds_layout_ci.bindingCount = 1;
3001 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003002
3003 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003004 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3005 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003006 ASSERT_VK_SUCCESS(err);
3007
3008 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003009 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003010 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003011 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003012 alloc_info.descriptorPool = ds_pool;
3013 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003014 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3015 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003016 ASSERT_VK_SUCCESS(err);
3017
3018 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003019 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3020 pipeline_layout_ci.setLayoutCount = 1;
3021 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003022
3023 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003024 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3025 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003026 ASSERT_VK_SUCCESS(err);
3027
3028 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3029 // Set scissor as dynamic to avoid second error
3030 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003031 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3032 dyn_state_ci.dynamicStateCount = 1;
3033 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003034
Cody Northropeb3a6c12015-10-05 14:44:45 -06003035 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003036 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003037
Karl Schultz6addd812016-02-02 17:17:23 -07003038 VkShaderObj vs(m_device, bindStateVertShaderText,
3039 VK_SHADER_STAGE_VERTEX_BIT, this);
3040 VkShaderObj fs(m_device, bindStateFragShaderText,
3041 VK_SHADER_STAGE_FRAGMENT_BIT,
3042 this); // TODO - We shouldn't need a fragment shader
3043 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003044 shaderStages[0] = vs.GetStageCreateInfo();
3045 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003046
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003047
3048 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3049 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3050 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3051 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3052 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3053 rs_state_ci.depthClampEnable = VK_FALSE;
3054 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3055 rs_state_ci.depthBiasEnable = VK_FALSE;
3056
Tobin Ehlise68360f2015-10-01 11:15:13 -06003057 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003058 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3059 gp_ci.stageCount = 2;
3060 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003061 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003062 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
3063 // should cause validation error
3064 gp_ci.pDynamicState = &dyn_state_ci;
3065 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3066 gp_ci.layout = pipeline_layout;
3067 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003068
3069 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003070 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003071
3072 VkPipeline pipeline;
3073 VkPipelineCache pipelineCache;
3074
Karl Schultz6addd812016-02-02 17:17:23 -07003075 err =
3076 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003077 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003078 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3079 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003080
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003081 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003082 FAIL() << "Did not receive Error 'Gfx Pipeline pViewportState is null. "
3083 "Even if...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003084 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003085 }
3086
Chia-I Wuf7458c52015-10-26 21:10:41 +08003087 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3088 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3089 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3090 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003091}
3092// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07003093// Then run second test where dynamic scissor count doesn't match PSO scissor
3094// count
3095TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
3096 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003097
Karl Schultz6addd812016-02-02 17:17:23 -07003098 m_errorMonitor->SetDesiredFailureMsg(
3099 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003100 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
3101
Tobin Ehlise68360f2015-10-01 11:15:13 -06003102 ASSERT_NO_FATAL_FAILURE(InitState());
3103 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003104
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003105 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003106 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3107 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003108
3109 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003110 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3111 ds_pool_ci.maxSets = 1;
3112 ds_pool_ci.poolSizeCount = 1;
3113 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003114
3115 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003116 err =
3117 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003118 ASSERT_VK_SUCCESS(err);
3119
3120 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003121 dsl_binding.binding = 0;
3122 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3123 dsl_binding.descriptorCount = 1;
3124 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003125
3126 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003127 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3128 ds_layout_ci.bindingCount = 1;
3129 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003130
3131 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003132 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3133 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003134 ASSERT_VK_SUCCESS(err);
3135
3136 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003137 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003138 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003139 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003140 alloc_info.descriptorPool = ds_pool;
3141 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003142 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3143 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003144 ASSERT_VK_SUCCESS(err);
3145
3146 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003147 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3148 pipeline_layout_ci.setLayoutCount = 1;
3149 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003150
3151 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003152 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3153 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003154 ASSERT_VK_SUCCESS(err);
3155
3156 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003157 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3158 vp_state_ci.viewportCount = 1;
3159 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
3160 vp_state_ci.scissorCount = 1;
3161 vp_state_ci.pScissors =
3162 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06003163
3164 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3165 // Set scissor as dynamic to avoid that error
3166 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003167 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3168 dyn_state_ci.dynamicStateCount = 1;
3169 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003170
Cody Northropeb3a6c12015-10-05 14:44:45 -06003171 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003172 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003173
Karl Schultz6addd812016-02-02 17:17:23 -07003174 VkShaderObj vs(m_device, bindStateVertShaderText,
3175 VK_SHADER_STAGE_VERTEX_BIT, this);
3176 VkShaderObj fs(m_device, bindStateFragShaderText,
3177 VK_SHADER_STAGE_FRAGMENT_BIT,
3178 this); // TODO - We shouldn't need a fragment shader
3179 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003180 shaderStages[0] = vs.GetStageCreateInfo();
3181 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003182
Cody Northropf6622dc2015-10-06 10:33:21 -06003183 VkPipelineVertexInputStateCreateInfo vi_ci = {};
3184 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3185 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003186 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06003187 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003188 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06003189 vi_ci.pVertexAttributeDescriptions = nullptr;
3190
3191 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
3192 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
3193 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3194
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003195 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003196 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06003197 rs_ci.pNext = nullptr;
3198
3199 VkPipelineColorBlendStateCreateInfo cb_ci = {};
3200 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
3201 cb_ci.pNext = nullptr;
3202
Tobin Ehlise68360f2015-10-01 11:15:13 -06003203 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003204 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3205 gp_ci.stageCount = 2;
3206 gp_ci.pStages = shaderStages;
3207 gp_ci.pVertexInputState = &vi_ci;
3208 gp_ci.pInputAssemblyState = &ia_ci;
3209 gp_ci.pViewportState = &vp_state_ci;
3210 gp_ci.pRasterizationState = &rs_ci;
3211 gp_ci.pColorBlendState = &cb_ci;
3212 gp_ci.pDynamicState = &dyn_state_ci;
3213 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3214 gp_ci.layout = pipeline_layout;
3215 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003216
3217 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003218 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003219
3220 VkPipeline pipeline;
3221 VkPipelineCache pipelineCache;
3222
Karl Schultz6addd812016-02-02 17:17:23 -07003223 err =
3224 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003225 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003226 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3227 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003228
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003229 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003230 FAIL() << "Did not recieve Error 'Gfx Pipeline viewportCount is 1, but "
3231 "pViewports is NULL...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003232 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003233 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003234
Tobin Ehlisd332f282015-10-02 11:00:56 -06003235 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07003236 // First need to successfully create the PSO from above by setting
3237 // pViewports
3238 m_errorMonitor->SetDesiredFailureMsg(
3239 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3240 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
3241 "scissorCount is 1. These counts must match.");
3242
3243 VkViewport vp = {}; // Just need dummy vp to point to
3244 vp_state_ci.pViewports = &vp;
3245 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3246 &gp_ci, NULL, &pipeline);
3247 ASSERT_VK_SUCCESS(err);
3248 BeginCommandBuffer();
3249 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3250 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3251 VkRect2D scissors[2] = {}; // don't care about data
3252 // Count of 2 doesn't match PSO count of 1
3253 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
3254 Draw(1, 0, 0, 0);
3255
3256 if (!m_errorMonitor->DesiredMsgFound()) {
3257 FAIL() << "Did not receive Error 'Dynamic scissorCount from "
3258 "vkCmdSetScissor() is 2, but PSO scissorCount is 1...'";
3259 m_errorMonitor->DumpFailureMsgs();
3260 }
3261
3262 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3263 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3264 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3265 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3266}
3267// Create PSO w/o non-zero scissorCount but no scissor data
3268// Then run second test where dynamic viewportCount doesn't match PSO
3269// viewportCount
3270TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
3271 VkResult err;
3272
3273 m_errorMonitor->SetDesiredFailureMsg(
3274 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3275 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
3276
3277 ASSERT_NO_FATAL_FAILURE(InitState());
3278 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3279
3280 VkDescriptorPoolSize ds_type_count = {};
3281 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3282 ds_type_count.descriptorCount = 1;
3283
3284 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3285 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3286 ds_pool_ci.maxSets = 1;
3287 ds_pool_ci.poolSizeCount = 1;
3288 ds_pool_ci.pPoolSizes = &ds_type_count;
3289
3290 VkDescriptorPool ds_pool;
3291 err =
3292 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
3293 ASSERT_VK_SUCCESS(err);
3294
3295 VkDescriptorSetLayoutBinding dsl_binding = {};
3296 dsl_binding.binding = 0;
3297 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3298 dsl_binding.descriptorCount = 1;
3299 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3300
3301 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3302 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3303 ds_layout_ci.bindingCount = 1;
3304 ds_layout_ci.pBindings = &dsl_binding;
3305
3306 VkDescriptorSetLayout ds_layout;
3307 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3308 &ds_layout);
3309 ASSERT_VK_SUCCESS(err);
3310
3311 VkDescriptorSet descriptorSet;
3312 VkDescriptorSetAllocateInfo alloc_info = {};
3313 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3314 alloc_info.descriptorSetCount = 1;
3315 alloc_info.descriptorPool = ds_pool;
3316 alloc_info.pSetLayouts = &ds_layout;
3317 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3318 &descriptorSet);
3319 ASSERT_VK_SUCCESS(err);
3320
3321 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3322 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3323 pipeline_layout_ci.setLayoutCount = 1;
3324 pipeline_layout_ci.pSetLayouts = &ds_layout;
3325
3326 VkPipelineLayout pipeline_layout;
3327 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3328 &pipeline_layout);
3329 ASSERT_VK_SUCCESS(err);
3330
3331 VkPipelineViewportStateCreateInfo vp_state_ci = {};
3332 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3333 vp_state_ci.scissorCount = 1;
3334 vp_state_ci.pScissors =
3335 NULL; // Null scissor w/ count of 1 should cause error
3336 vp_state_ci.viewportCount = 1;
3337 vp_state_ci.pViewports =
3338 NULL; // vp is dynamic (below) so this won't cause error
3339
3340 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
3341 // Set scissor as dynamic to avoid that error
3342 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
3343 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3344 dyn_state_ci.dynamicStateCount = 1;
3345 dyn_state_ci.pDynamicStates = &vp_state;
3346
3347 VkPipelineShaderStageCreateInfo shaderStages[2];
3348 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
3349
3350 VkShaderObj vs(m_device, bindStateVertShaderText,
3351 VK_SHADER_STAGE_VERTEX_BIT, this);
3352 VkShaderObj fs(m_device, bindStateFragShaderText,
3353 VK_SHADER_STAGE_FRAGMENT_BIT,
3354 this); // TODO - We shouldn't need a fragment shader
3355 // but add it to be able to run on more devices
3356 shaderStages[0] = vs.GetStageCreateInfo();
3357 shaderStages[1] = fs.GetStageCreateInfo();
3358
3359 VkPipelineVertexInputStateCreateInfo vi_ci = {};
3360 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3361 vi_ci.pNext = nullptr;
3362 vi_ci.vertexBindingDescriptionCount = 0;
3363 vi_ci.pVertexBindingDescriptions = nullptr;
3364 vi_ci.vertexAttributeDescriptionCount = 0;
3365 vi_ci.pVertexAttributeDescriptions = nullptr;
3366
3367 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
3368 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
3369 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3370
3371 VkPipelineRasterizationStateCreateInfo rs_ci = {};
3372 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3373 rs_ci.pNext = nullptr;
3374
3375 VkPipelineColorBlendStateCreateInfo cb_ci = {};
3376 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
3377 cb_ci.pNext = nullptr;
3378
3379 VkGraphicsPipelineCreateInfo gp_ci = {};
3380 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3381 gp_ci.stageCount = 2;
3382 gp_ci.pStages = shaderStages;
3383 gp_ci.pVertexInputState = &vi_ci;
3384 gp_ci.pInputAssemblyState = &ia_ci;
3385 gp_ci.pViewportState = &vp_state_ci;
3386 gp_ci.pRasterizationState = &rs_ci;
3387 gp_ci.pColorBlendState = &cb_ci;
3388 gp_ci.pDynamicState = &dyn_state_ci;
3389 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3390 gp_ci.layout = pipeline_layout;
3391 gp_ci.renderPass = renderPass();
3392
3393 VkPipelineCacheCreateInfo pc_ci = {};
3394 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3395
3396 VkPipeline pipeline;
3397 VkPipelineCache pipelineCache;
3398
3399 err =
3400 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
3401 ASSERT_VK_SUCCESS(err);
3402 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3403 &gp_ci, NULL, &pipeline);
3404
3405 if (!m_errorMonitor->DesiredMsgFound()) {
3406 FAIL() << "Did not recieve Error 'Gfx Pipeline scissorCount is 1, but "
3407 "pScissors is NULL...'";
3408 m_errorMonitor->DumpFailureMsgs();
3409 }
3410
3411 // Now hit second fail case where we set scissor w/ different count than PSO
3412 // First need to successfully create the PSO from above by setting
3413 // pViewports
3414 m_errorMonitor->SetDesiredFailureMsg(
3415 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3416 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
3417 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003418
Tobin Ehlisd332f282015-10-02 11:00:56 -06003419 VkRect2D sc = {}; // Just need dummy vp to point to
3420 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07003421 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3422 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003423 ASSERT_VK_SUCCESS(err);
3424 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003425 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3426 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003427 VkViewport viewports[2] = {}; // don't care about data
3428 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07003429 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06003430 Draw(1, 0, 0, 0);
3431
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003432 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003433 FAIL() << "Did not receive Error 'Dynamic viewportCount from "
3434 "vkCmdSetViewport() is 2, but PSO viewportCount is 1...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003435 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisd332f282015-10-02 11:00:56 -06003436 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06003437
Chia-I Wuf7458c52015-10-26 21:10:41 +08003438 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3439 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3440 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3441 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003442}
3443
Karl Schultz6addd812016-02-02 17:17:23 -07003444TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003445 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003446 m_errorMonitor->SetDesiredFailureMsg(
3447 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003448 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003449
3450 ASSERT_NO_FATAL_FAILURE(InitState());
3451 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003452
Tony Barbourfe3351b2015-07-28 10:17:20 -06003453 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003454 // Don't care about RenderPass handle b/c error should be flagged before
3455 // that
3456 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
3457 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003458
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003459 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003460 FAIL() << "Did not receive Error 'You cannot use a NULL RenderPass "
3461 "object in vkCmdBeginRenderPass()'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003462 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06003463 }
3464}
3465
Karl Schultz6addd812016-02-02 17:17:23 -07003466TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003467 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003468 m_errorMonitor->SetDesiredFailureMsg(
3469 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003470 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003471
3472 ASSERT_NO_FATAL_FAILURE(InitState());
3473 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003474
Tony Barbourfe3351b2015-07-28 10:17:20 -06003475 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003476 // Just create a dummy Renderpass that's non-NULL so we can get to the
3477 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06003478 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003479 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
3480 rp_begin.pNext = NULL;
3481 rp_begin.renderPass = renderPass();
3482 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003483
Karl Schultz6addd812016-02-02 17:17:23 -07003484 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
3485 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003486
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003487 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003488 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3489 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003490 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003491 }
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003492}
3493
Karl Schultz6addd812016-02-02 17:17:23 -07003494TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003495 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07003496 m_errorMonitor->SetDesiredFailureMsg(
3497 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003498 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003499
3500 ASSERT_NO_FATAL_FAILURE(InitState());
3501 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003502
3503 // Renderpass is started here
3504 BeginCommandBuffer();
3505
3506 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003507 vk_testing::Buffer dstBuffer;
3508 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003509
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003510 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003511
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003512 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003513 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3514 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003515 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003516 }
3517}
3518
Karl Schultz6addd812016-02-02 17:17:23 -07003519TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003520 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07003521 m_errorMonitor->SetDesiredFailureMsg(
3522 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003523 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003524
3525 ASSERT_NO_FATAL_FAILURE(InitState());
3526 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003527
3528 // Renderpass is started here
3529 BeginCommandBuffer();
3530
3531 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003532 vk_testing::Buffer dstBuffer;
3533 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003534
Karl Schultz6addd812016-02-02 17:17:23 -07003535 VkDeviceSize dstOffset = 0;
3536 VkDeviceSize dataSize = 1024;
3537 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003538
Karl Schultz6addd812016-02-02 17:17:23 -07003539 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
3540 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003541
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003542 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003543 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3544 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003545 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003546 }
3547}
3548
Karl Schultz6addd812016-02-02 17:17:23 -07003549TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003550 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003551 m_errorMonitor->SetDesiredFailureMsg(
3552 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003553 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003554
3555 ASSERT_NO_FATAL_FAILURE(InitState());
3556 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003557
3558 // Renderpass is started here
3559 BeginCommandBuffer();
3560
Michael Lentine0a369f62016-02-03 16:51:46 -06003561 VkClearColorValue clear_color;
3562 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07003563 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
3564 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3565 const int32_t tex_width = 32;
3566 const int32_t tex_height = 32;
3567 VkImageCreateInfo image_create_info = {};
3568 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3569 image_create_info.pNext = NULL;
3570 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3571 image_create_info.format = tex_format;
3572 image_create_info.extent.width = tex_width;
3573 image_create_info.extent.height = tex_height;
3574 image_create_info.extent.depth = 1;
3575 image_create_info.mipLevels = 1;
3576 image_create_info.arrayLayers = 1;
3577 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3578 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3579 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003580
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003581 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07003582 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
3583 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003584
Karl Schultz6addd812016-02-02 17:17:23 -07003585 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
3586 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003587
Karl Schultz6addd812016-02-02 17:17:23 -07003588 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
3589 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003590
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003591 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003592 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3593 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003594 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003595 }
3596}
3597
Karl Schultz6addd812016-02-02 17:17:23 -07003598TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003599 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003600 m_errorMonitor->SetDesiredFailureMsg(
3601 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003602 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003603
3604 ASSERT_NO_FATAL_FAILURE(InitState());
3605 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003606
3607 // Renderpass is started here
3608 BeginCommandBuffer();
3609
3610 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07003611 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07003612 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
3613 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3614 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
3615 image_create_info.extent.width = 64;
3616 image_create_info.extent.height = 64;
3617 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3618 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003619
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003620 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07003621 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
3622 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003623
Karl Schultz6addd812016-02-02 17:17:23 -07003624 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
3625 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003626
Karl Schultz6addd812016-02-02 17:17:23 -07003627 vkCmdClearDepthStencilImage(
3628 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
3629 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
3630 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003631
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003632 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003633 FAIL() << "Did not receive Error 'It is invalid to issue this call "
3634 "inside an active render pass...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003635 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003636 }
3637}
3638
Karl Schultz6addd812016-02-02 17:17:23 -07003639TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06003640 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003641 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003642
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003644 "vkCmdClearAttachments: This call "
3645 "must be issued inside an active "
3646 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003647
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003648 ASSERT_NO_FATAL_FAILURE(InitState());
3649 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003650
3651 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003652 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003653 ASSERT_VK_SUCCESS(err);
3654
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06003655 VkClearAttachment color_attachment;
3656 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3657 color_attachment.clearValue.color.float32[0] = 0;
3658 color_attachment.clearValue.color.float32[1] = 0;
3659 color_attachment.clearValue.color.float32[2] = 0;
3660 color_attachment.clearValue.color.float32[3] = 0;
3661 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07003662 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
3663 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
3664 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003665
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003666 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003667 FAIL() << "Did not receive Error 'vkCmdClearAttachments: This call "
3668 "must be issued inside an active render pass.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003669 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06003670 }
3671}
3672
Karl Schultz6addd812016-02-02 17:17:23 -07003673TEST_F(VkLayerTest, InvalidDynamicStateObject) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003674 // Create a valid cmd buffer
3675 // call vkCmdBindDynamicStateObject w/ false DS Obj
Karl Schultz6addd812016-02-02 17:17:23 -07003676 // TODO : Simple check for bad object should be added to ObjectTracker to
3677 // catch this case
3678 // The DS check for this is after driver has been called to validate DS
3679 // internal data struct
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003680}
Tobin Ehlis1056d452015-05-27 14:55:35 -06003681
Karl Schultz6addd812016-02-02 17:17:23 -07003682TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003683 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07003684 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003685
Karl Schultz6addd812016-02-02 17:17:23 -07003686 m_errorMonitor->SetDesiredFailureMsg(
3687 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003688 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
3689
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003690 ASSERT_NO_FATAL_FAILURE(InitState());
3691 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003692 uint32_t qfi = 0;
3693 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003694 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3695 buffCI.size = 1024;
3696 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
3697 buffCI.queueFamilyIndexCount = 1;
3698 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003699
3700 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003701 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003702 ASSERT_VK_SUCCESS(err);
3703
3704 BeginCommandBuffer();
3705 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003706 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3707 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003708 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07003709 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
3710 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003711
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003712 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003713 FAIL() << "Did not receive Error 'vkCmdBindIndexBuffer() offset (0x7) "
3714 "does not fall on ...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003715 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003716 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06003717
Chia-I Wuf7458c52015-10-26 21:10:41 +08003718 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06003719}
3720
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07003721TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
3722 // Create an out-of-range queueFamilyIndex
3723 m_errorMonitor->SetDesiredFailureMsg(
3724 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06003725 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07003726
3727 ASSERT_NO_FATAL_FAILURE(InitState());
3728 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3729 VkBufferCreateInfo buffCI = {};
3730 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3731 buffCI.size = 1024;
3732 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
3733 buffCI.queueFamilyIndexCount = 1;
3734 // Introduce failure by specifying invalid queue_family_index
3735 uint32_t qfi = 777;
3736 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06003737 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07003738
3739 VkBuffer ib;
3740 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
3741
3742 if (!m_errorMonitor->DesiredMsgFound()) {
Tobin Ehlis24aab042016-03-24 10:54:18 -06003743 FAIL() << "Did not receive Error 'queueFamilyIndex %d, must have "
3744 "been given when the device was created.'";
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07003745 m_errorMonitor->DumpFailureMsgs();
3746 }
3747}
3748
Karl Schultz6addd812016-02-02 17:17:23 -07003749TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
3750 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
3751 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003752
Karl Schultz6addd812016-02-02 17:17:23 -07003753 m_errorMonitor->SetDesiredFailureMsg(
3754 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003755 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003756
3757 ASSERT_NO_FATAL_FAILURE(InitState());
3758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003759
3760 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003761 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003762 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
3763 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003764
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003765 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003766 FAIL() << "Did not receive Error 'vkCmdExecuteCommands() called w/ "
3767 "Primary Cmd Buffer '";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003768 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06003769 }
3770}
3771
Karl Schultz6addd812016-02-02 17:17:23 -07003772TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003773 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07003774 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003775
Karl Schultz6addd812016-02-02 17:17:23 -07003776 m_errorMonitor->SetDesiredFailureMsg(
3777 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
3778 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
3779 "does not match ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003780
Tobin Ehlis3b780662015-05-28 12:11:26 -06003781 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003782 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003783 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003784 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3785 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003786
3787 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003788 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3789 ds_pool_ci.pNext = NULL;
3790 ds_pool_ci.maxSets = 1;
3791 ds_pool_ci.poolSizeCount = 1;
3792 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06003793
Tobin Ehlis3b780662015-05-28 12:11:26 -06003794 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003795 err =
3796 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003797 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06003798 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003799 dsl_binding.binding = 0;
3800 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3801 dsl_binding.descriptorCount = 1;
3802 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3803 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003804
Tony Barboureb254902015-07-15 12:50:33 -06003805 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003806 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3807 ds_layout_ci.pNext = NULL;
3808 ds_layout_ci.bindingCount = 1;
3809 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003810
Tobin Ehlis3b780662015-05-28 12:11:26 -06003811 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003812 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3813 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003814 ASSERT_VK_SUCCESS(err);
3815
3816 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003817 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003818 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003819 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003820 alloc_info.descriptorPool = ds_pool;
3821 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003822 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3823 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003824 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003825
Tony Barboureb254902015-07-15 12:50:33 -06003826 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003827 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3828 sampler_ci.pNext = NULL;
3829 sampler_ci.magFilter = VK_FILTER_NEAREST;
3830 sampler_ci.minFilter = VK_FILTER_NEAREST;
3831 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3832 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3833 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3834 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3835 sampler_ci.mipLodBias = 1.0;
3836 sampler_ci.anisotropyEnable = VK_FALSE;
3837 sampler_ci.maxAnisotropy = 1;
3838 sampler_ci.compareEnable = VK_FALSE;
3839 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3840 sampler_ci.minLod = 1.0;
3841 sampler_ci.maxLod = 1.0;
3842 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3843 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski52ac6582015-09-01 15:42:56 -06003844
Tobin Ehlis3b780662015-05-28 12:11:26 -06003845 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003846 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003847 ASSERT_VK_SUCCESS(err);
3848
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003849 VkDescriptorImageInfo info = {};
3850 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003851
3852 VkWriteDescriptorSet descriptor_write;
3853 memset(&descriptor_write, 0, sizeof(descriptor_write));
3854 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003855 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003856 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003857 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003858 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003859 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003860
3861 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3862
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003863 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003864 FAIL() << "Did not receive Error 'Write descriptor update has "
3865 "descriptor type VK_DESCRIPTOR_TYPE_SAMPLER that does not "
3866 "match...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003867 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06003868 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06003869
Chia-I Wuf7458c52015-10-26 21:10:41 +08003870 vkDestroySampler(m_device->device(), sampler, NULL);
3871 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3872 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003873}
3874
Karl Schultz6addd812016-02-02 17:17:23 -07003875TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003876 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07003877 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003878
Karl Schultz6addd812016-02-02 17:17:23 -07003879 m_errorMonitor->SetDesiredFailureMsg(
3880 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
3881 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
3882 "is out of bounds for matching binding");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003883
Tobin Ehlis3b780662015-05-28 12:11:26 -06003884 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003885 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003886 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003887 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3888 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003889
3890 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003891 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3892 ds_pool_ci.pNext = NULL;
3893 ds_pool_ci.maxSets = 1;
3894 ds_pool_ci.poolSizeCount = 1;
3895 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06003896
Tobin Ehlis3b780662015-05-28 12:11:26 -06003897 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003898 err =
3899 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003900 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003901
Tony Barboureb254902015-07-15 12:50:33 -06003902 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003903 dsl_binding.binding = 0;
3904 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3905 dsl_binding.descriptorCount = 1;
3906 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3907 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06003908
3909 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003910 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3911 ds_layout_ci.pNext = NULL;
3912 ds_layout_ci.bindingCount = 1;
3913 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003914
Tobin Ehlis3b780662015-05-28 12:11:26 -06003915 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003916 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3917 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003918 ASSERT_VK_SUCCESS(err);
3919
3920 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003921 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003922 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003923 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003924 alloc_info.descriptorPool = ds_pool;
3925 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003926 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3927 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003928 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003929
Tony Barboureb254902015-07-15 12:50:33 -06003930 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003931 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3932 sampler_ci.pNext = NULL;
3933 sampler_ci.magFilter = VK_FILTER_NEAREST;
3934 sampler_ci.minFilter = VK_FILTER_NEAREST;
3935 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3936 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3937 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3938 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3939 sampler_ci.mipLodBias = 1.0;
3940 sampler_ci.anisotropyEnable = VK_FALSE;
3941 sampler_ci.maxAnisotropy = 1;
3942 sampler_ci.compareEnable = VK_FALSE;
3943 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3944 sampler_ci.minLod = 1.0;
3945 sampler_ci.maxLod = 1.0;
3946 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3947 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06003948
Tobin Ehlis3b780662015-05-28 12:11:26 -06003949 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08003950 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06003951 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003952
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003953 VkDescriptorImageInfo info = {};
3954 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003955
3956 VkWriteDescriptorSet descriptor_write;
3957 memset(&descriptor_write, 0, sizeof(descriptor_write));
3958 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003959 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003960 descriptor_write.dstArrayElement =
3961 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08003962 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003963 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003964 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06003965 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08003966
3967 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3968
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003969 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07003970 FAIL() << "Did not receive Error 'Descriptor update type of "
3971 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET is out of bounds for "
3972 "matching binding...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003973 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06003974 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06003975
Chia-I Wuf7458c52015-10-26 21:10:41 +08003976 vkDestroySampler(m_device->device(), sampler, NULL);
3977 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3978 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003979}
3980
Karl Schultz6addd812016-02-02 17:17:23 -07003981TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
3982 // Create layout w/ count of 1 and attempt update to that layout w/ binding
3983 // index 2
3984 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06003985
Karl Schultz6addd812016-02-02 17:17:23 -07003986 m_errorMonitor->SetDesiredFailureMsg(
3987 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003988 " does not have binding to match update binding ");
3989
Tobin Ehlis3b780662015-05-28 12:11:26 -06003990 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07003991 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003992 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003993 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3994 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003995
3996 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003997 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3998 ds_pool_ci.pNext = NULL;
3999 ds_pool_ci.maxSets = 1;
4000 ds_pool_ci.poolSizeCount = 1;
4001 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004002
Tobin Ehlis3b780662015-05-28 12:11:26 -06004003 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004004 err =
4005 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004006 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004007
Tony Barboureb254902015-07-15 12:50:33 -06004008 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004009 dsl_binding.binding = 0;
4010 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4011 dsl_binding.descriptorCount = 1;
4012 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4013 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06004014
4015 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004016 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4017 ds_layout_ci.pNext = NULL;
4018 ds_layout_ci.bindingCount = 1;
4019 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004020 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004021 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4022 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004023 ASSERT_VK_SUCCESS(err);
4024
4025 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004026 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004027 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004028 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004029 alloc_info.descriptorPool = ds_pool;
4030 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004031 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4032 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004033 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004034
Tony Barboureb254902015-07-15 12:50:33 -06004035 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004036 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4037 sampler_ci.pNext = NULL;
4038 sampler_ci.magFilter = VK_FILTER_NEAREST;
4039 sampler_ci.minFilter = VK_FILTER_NEAREST;
4040 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4041 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4042 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4043 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4044 sampler_ci.mipLodBias = 1.0;
4045 sampler_ci.anisotropyEnable = VK_FALSE;
4046 sampler_ci.maxAnisotropy = 1;
4047 sampler_ci.compareEnable = VK_FALSE;
4048 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4049 sampler_ci.minLod = 1.0;
4050 sampler_ci.maxLod = 1.0;
4051 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4052 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06004053
Tobin Ehlis3b780662015-05-28 12:11:26 -06004054 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004055 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004056 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004057
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004058 VkDescriptorImageInfo info = {};
4059 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004060
4061 VkWriteDescriptorSet descriptor_write;
4062 memset(&descriptor_write, 0, sizeof(descriptor_write));
4063 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004064 descriptor_write.dstSet = descriptorSet;
4065 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004066 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004067 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004068 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004069 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004070
4071 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4072
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004073 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004074 FAIL() << "Did not receive Error 'Descriptor Set <blah> does not have "
4075 "binding to match update binding '";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004076 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06004077 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004078
Chia-I Wuf7458c52015-10-26 21:10:41 +08004079 vkDestroySampler(m_device->device(), sampler, NULL);
4080 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4081 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004082}
4083
Karl Schultz6addd812016-02-02 17:17:23 -07004084TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
4085 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
4086 // types
4087 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004088
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004089 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004090 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004091
Tobin Ehlis3b780662015-05-28 12:11:26 -06004092 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004093
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004094 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004095 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4096 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004097
4098 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004099 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4100 ds_pool_ci.pNext = NULL;
4101 ds_pool_ci.maxSets = 1;
4102 ds_pool_ci.poolSizeCount = 1;
4103 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004104
Tobin Ehlis3b780662015-05-28 12:11:26 -06004105 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004106 err =
4107 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004108 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004109 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004110 dsl_binding.binding = 0;
4111 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4112 dsl_binding.descriptorCount = 1;
4113 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4114 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004115
Tony Barboureb254902015-07-15 12:50:33 -06004116 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004117 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4118 ds_layout_ci.pNext = NULL;
4119 ds_layout_ci.bindingCount = 1;
4120 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004121
Tobin Ehlis3b780662015-05-28 12:11:26 -06004122 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004123 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4124 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004125 ASSERT_VK_SUCCESS(err);
4126
4127 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004128 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004129 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004130 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004131 alloc_info.descriptorPool = ds_pool;
4132 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004133 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4134 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004135 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004136
Tony Barboureb254902015-07-15 12:50:33 -06004137 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004138 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4139 sampler_ci.pNext = NULL;
4140 sampler_ci.magFilter = VK_FILTER_NEAREST;
4141 sampler_ci.minFilter = VK_FILTER_NEAREST;
4142 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4143 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4144 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4145 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4146 sampler_ci.mipLodBias = 1.0;
4147 sampler_ci.anisotropyEnable = VK_FALSE;
4148 sampler_ci.maxAnisotropy = 1;
4149 sampler_ci.compareEnable = VK_FALSE;
4150 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4151 sampler_ci.minLod = 1.0;
4152 sampler_ci.maxLod = 1.0;
4153 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4154 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004155 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004156 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004157 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004158
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004159 VkDescriptorImageInfo info = {};
4160 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004161
4162 VkWriteDescriptorSet descriptor_write;
4163 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07004164 descriptor_write.sType =
4165 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004166 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004167 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004168 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004169 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004170 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004171
4172 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4173
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004174 if (!m_errorMonitor->DesiredMsgFound()) {
4175 FAIL() << "Did not receive Error 'Unexpected UPDATE struct of type '";
4176 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06004177 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004178
Chia-I Wuf7458c52015-10-26 21:10:41 +08004179 vkDestroySampler(m_device->device(), sampler, NULL);
4180 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4181 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004182}
4183
Karl Schultz6addd812016-02-02 17:17:23 -07004184TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004185 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07004186 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004187
Karl Schultz6addd812016-02-02 17:17:23 -07004188 m_errorMonitor->SetDesiredFailureMsg(
4189 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004190 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
4191
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004192 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004193 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
4194 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004195 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004196 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
4197 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004198
4199 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004200 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4201 ds_pool_ci.pNext = NULL;
4202 ds_pool_ci.maxSets = 1;
4203 ds_pool_ci.poolSizeCount = 1;
4204 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004205
4206 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004207 err =
4208 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004209 ASSERT_VK_SUCCESS(err);
4210
4211 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004212 dsl_binding.binding = 0;
4213 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4214 dsl_binding.descriptorCount = 1;
4215 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4216 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004217
4218 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004219 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4220 ds_layout_ci.pNext = NULL;
4221 ds_layout_ci.bindingCount = 1;
4222 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004223 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004224 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4225 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004226 ASSERT_VK_SUCCESS(err);
4227
4228 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004229 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004230 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004231 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004232 alloc_info.descriptorPool = ds_pool;
4233 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004234 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4235 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004236 ASSERT_VK_SUCCESS(err);
4237
Karl Schultz6addd812016-02-02 17:17:23 -07004238 VkSampler sampler =
4239 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004240
4241 VkDescriptorImageInfo descriptor_info;
4242 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
4243 descriptor_info.sampler = sampler;
4244
4245 VkWriteDescriptorSet descriptor_write;
4246 memset(&descriptor_write, 0, sizeof(descriptor_write));
4247 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004248 descriptor_write.dstSet = descriptorSet;
4249 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004250 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004251 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4252 descriptor_write.pImageInfo = &descriptor_info;
4253
4254 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4255
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004256 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004257 FAIL() << "Did not receive Error 'Attempt to update descriptor with "
4258 "invalid sampler...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004259 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004260 }
4261
Chia-I Wuf7458c52015-10-26 21:10:41 +08004262 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4263 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004264}
4265
Karl Schultz6addd812016-02-02 17:17:23 -07004266TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
4267 // Create a single combined Image/Sampler descriptor and send it an invalid
4268 // imageView
4269 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004270
Karl Schultz6addd812016-02-02 17:17:23 -07004271 m_errorMonitor->SetDesiredFailureMsg(
4272 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004273 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
4274
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004275 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004276 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004277 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4278 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004279
4280 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004281 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4282 ds_pool_ci.pNext = NULL;
4283 ds_pool_ci.maxSets = 1;
4284 ds_pool_ci.poolSizeCount = 1;
4285 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004286
4287 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004288 err =
4289 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004290 ASSERT_VK_SUCCESS(err);
4291
4292 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004293 dsl_binding.binding = 0;
4294 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4295 dsl_binding.descriptorCount = 1;
4296 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4297 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004298
4299 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004300 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4301 ds_layout_ci.pNext = NULL;
4302 ds_layout_ci.bindingCount = 1;
4303 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004304 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004305 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4306 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004307 ASSERT_VK_SUCCESS(err);
4308
4309 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004310 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004311 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004312 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004313 alloc_info.descriptorPool = ds_pool;
4314 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004315 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4316 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004317 ASSERT_VK_SUCCESS(err);
4318
4319 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004320 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4321 sampler_ci.pNext = NULL;
4322 sampler_ci.magFilter = VK_FILTER_NEAREST;
4323 sampler_ci.minFilter = VK_FILTER_NEAREST;
4324 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4325 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4326 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4327 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4328 sampler_ci.mipLodBias = 1.0;
4329 sampler_ci.anisotropyEnable = VK_FALSE;
4330 sampler_ci.maxAnisotropy = 1;
4331 sampler_ci.compareEnable = VK_FALSE;
4332 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4333 sampler_ci.minLod = 1.0;
4334 sampler_ci.maxLod = 1.0;
4335 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4336 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004337
4338 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004339 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004340 ASSERT_VK_SUCCESS(err);
4341
Karl Schultz6addd812016-02-02 17:17:23 -07004342 VkImageView view =
4343 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004344
4345 VkDescriptorImageInfo descriptor_info;
4346 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
4347 descriptor_info.sampler = sampler;
4348 descriptor_info.imageView = view;
4349
4350 VkWriteDescriptorSet descriptor_write;
4351 memset(&descriptor_write, 0, sizeof(descriptor_write));
4352 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004353 descriptor_write.dstSet = descriptorSet;
4354 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004355 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004356 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4357 descriptor_write.pImageInfo = &descriptor_info;
4358
4359 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4360
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004361 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004362 FAIL() << "Did not receive Error 'Attempt to update descriptor with "
4363 "invalid imageView...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004364 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004365 }
4366
Chia-I Wuf7458c52015-10-26 21:10:41 +08004367 vkDestroySampler(m_device->device(), sampler, NULL);
4368 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4369 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004370}
4371
Karl Schultz6addd812016-02-02 17:17:23 -07004372TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
4373 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
4374 // into the other
4375 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004376
Karl Schultz6addd812016-02-02 17:17:23 -07004377 m_errorMonitor->SetDesiredFailureMsg(
4378 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Copy descriptor update index 0, update "
4379 "count #1, has src update descriptor "
4380 "type VK_DESCRIPTOR_TYPE_SAMPLER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004381
Tobin Ehlis04356f92015-10-27 16:35:27 -06004382 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004383 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004384 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004385 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4386 ds_type_count[0].descriptorCount = 1;
4387 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
4388 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004389
4390 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004391 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4392 ds_pool_ci.pNext = NULL;
4393 ds_pool_ci.maxSets = 1;
4394 ds_pool_ci.poolSizeCount = 2;
4395 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004396
4397 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004398 err =
4399 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004400 ASSERT_VK_SUCCESS(err);
4401 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004402 dsl_binding[0].binding = 0;
4403 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4404 dsl_binding[0].descriptorCount = 1;
4405 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4406 dsl_binding[0].pImmutableSamplers = NULL;
4407 dsl_binding[1].binding = 1;
4408 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4409 dsl_binding[1].descriptorCount = 1;
4410 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
4411 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004412
4413 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004414 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4415 ds_layout_ci.pNext = NULL;
4416 ds_layout_ci.bindingCount = 2;
4417 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004418
4419 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004420 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4421 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004422 ASSERT_VK_SUCCESS(err);
4423
4424 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004425 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004426 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004427 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004428 alloc_info.descriptorPool = ds_pool;
4429 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004430 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4431 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004432 ASSERT_VK_SUCCESS(err);
4433
4434 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004435 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4436 sampler_ci.pNext = NULL;
4437 sampler_ci.magFilter = VK_FILTER_NEAREST;
4438 sampler_ci.minFilter = VK_FILTER_NEAREST;
4439 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4440 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4441 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4442 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4443 sampler_ci.mipLodBias = 1.0;
4444 sampler_ci.anisotropyEnable = VK_FALSE;
4445 sampler_ci.maxAnisotropy = 1;
4446 sampler_ci.compareEnable = VK_FALSE;
4447 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4448 sampler_ci.minLod = 1.0;
4449 sampler_ci.maxLod = 1.0;
4450 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4451 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004452
4453 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004454 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004455 ASSERT_VK_SUCCESS(err);
4456
4457 VkDescriptorImageInfo info = {};
4458 info.sampler = sampler;
4459
4460 VkWriteDescriptorSet descriptor_write;
4461 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
4462 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004463 descriptor_write.dstSet = descriptorSet;
4464 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08004465 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004466 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4467 descriptor_write.pImageInfo = &info;
4468 // This write update should succeed
4469 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4470 // Now perform a copy update that fails due to type mismatch
4471 VkCopyDescriptorSet copy_ds_update;
4472 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4473 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4474 copy_ds_update.srcSet = descriptorSet;
4475 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004476 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004477 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08004478 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06004479 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4480
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004481 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004482 FAIL() << "Did not receive Error 'Copy descriptor update index 0, "
4483 "update count #1, has src update descriptor "
4484 "type_DESCRIPTOR_TYPE_SAMPLER'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004485 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis04356f92015-10-27 16:35:27 -06004486 }
4487 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07004488 m_errorMonitor->SetDesiredFailureMsg(
4489 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004490 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis04356f92015-10-27 16:35:27 -06004491 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4492 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4493 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004494 copy_ds_update.srcBinding =
4495 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004496 copy_ds_update.dstSet = descriptorSet;
4497 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004498 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06004499 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4500
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004501 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004502 FAIL() << "Did not receive Error 'Copy descriptor update 0 has "
4503 "srcBinding 3 which is out of bounds...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004504 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis04356f92015-10-27 16:35:27 -06004505 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004506
Tobin Ehlis04356f92015-10-27 16:35:27 -06004507 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07004508 m_errorMonitor->SetDesiredFailureMsg(
4509 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004510 "Copy descriptor src update is out of bounds for matching binding 1 ");
4511
Tobin Ehlis04356f92015-10-27 16:35:27 -06004512 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
4513 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
4514 copy_ds_update.srcSet = descriptorSet;
4515 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004516 copy_ds_update.dstSet = descriptorSet;
4517 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004518 copy_ds_update.descriptorCount =
4519 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06004520 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
4521
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004522 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004523 FAIL() << "Did not receive Error 'Copy descriptor src update is out of "
4524 "bounds for matching binding 1...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004525 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis04356f92015-10-27 16:35:27 -06004526 }
4527
Chia-I Wuf7458c52015-10-26 21:10:41 +08004528 vkDestroySampler(m_device->device(), sampler, NULL);
4529 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4530 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004531}
4532
Karl Schultz6addd812016-02-02 17:17:23 -07004533TEST_F(VkLayerTest, NumSamplesMismatch) {
4534 // Create CommandBuffer where MSAA samples doesn't match RenderPass
4535 // sampleCount
4536 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004537
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004538 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004539 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004540
Tobin Ehlis3b780662015-05-28 12:11:26 -06004541 ASSERT_NO_FATAL_FAILURE(InitState());
4542 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004543 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06004544 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004545 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004546
4547 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004548 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4549 ds_pool_ci.pNext = NULL;
4550 ds_pool_ci.maxSets = 1;
4551 ds_pool_ci.poolSizeCount = 1;
4552 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004553
Tobin Ehlis3b780662015-05-28 12:11:26 -06004554 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004555 err =
4556 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004557 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004558
Tony Barboureb254902015-07-15 12:50:33 -06004559 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08004560 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06004561 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08004562 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004563 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4564 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004565
Tony Barboureb254902015-07-15 12:50:33 -06004566 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4567 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4568 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004569 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07004570 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004571
Tobin Ehlis3b780662015-05-28 12:11:26 -06004572 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004573 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4574 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004575 ASSERT_VK_SUCCESS(err);
4576
4577 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004578 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004579 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004580 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004581 alloc_info.descriptorPool = ds_pool;
4582 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004583 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4584 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004585 ASSERT_VK_SUCCESS(err);
4586
Tony Barboureb254902015-07-15 12:50:33 -06004587 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004588 pipe_ms_state_ci.sType =
4589 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4590 pipe_ms_state_ci.pNext = NULL;
4591 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
4592 pipe_ms_state_ci.sampleShadingEnable = 0;
4593 pipe_ms_state_ci.minSampleShading = 1.0;
4594 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004595
Tony Barboureb254902015-07-15 12:50:33 -06004596 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004597 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4598 pipeline_layout_ci.pNext = NULL;
4599 pipeline_layout_ci.setLayoutCount = 1;
4600 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004601
4602 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004603 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4604 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004605 ASSERT_VK_SUCCESS(err);
4606
Karl Schultz6addd812016-02-02 17:17:23 -07004607 VkShaderObj vs(m_device, bindStateVertShaderText,
4608 VK_SHADER_STAGE_VERTEX_BIT, this);
4609 VkShaderObj fs(m_device, bindStateFragShaderText,
4610 VK_SHADER_STAGE_FRAGMENT_BIT,
4611 this); // TODO - We shouldn't need a fragment shader
4612 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004613 VkPipelineObj pipe(m_device);
4614 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004615 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004616 pipe.SetMSAA(&pipe_ms_state_ci);
4617 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06004618
Tony Barbourfe3351b2015-07-28 10:17:20 -06004619 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004620 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4621 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06004622
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004623 if (!m_errorMonitor->DesiredMsgFound()) {
4624 FAIL() << "Did not recieve Error 'Num samples mismatch!...'";
4625 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis3b780662015-05-28 12:11:26 -06004626 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004627
Chia-I Wuf7458c52015-10-26 21:10:41 +08004628 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4629 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4630 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004631}
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004632
Karl Schultz6addd812016-02-02 17:17:23 -07004633TEST_F(VkLayerTest, ClearCmdNoDraw) {
4634 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
4635 // to issuing a Draw
4636 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004637
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004638 // TODO: verify that this matches layer
Karl Schultz6addd812016-02-02 17:17:23 -07004639 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07004640 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004641 "vkCmdClearAttachments() issued on CB object ");
4642
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004643 ASSERT_NO_FATAL_FAILURE(InitState());
4644 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06004645
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004646 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004647 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4648 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004649
4650 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004651 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4652 ds_pool_ci.pNext = NULL;
4653 ds_pool_ci.maxSets = 1;
4654 ds_pool_ci.poolSizeCount = 1;
4655 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004656
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004657 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004658 err =
4659 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004660 ASSERT_VK_SUCCESS(err);
4661
Tony Barboureb254902015-07-15 12:50:33 -06004662 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004663 dsl_binding.binding = 0;
4664 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4665 dsl_binding.descriptorCount = 1;
4666 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4667 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004668
Tony Barboureb254902015-07-15 12:50:33 -06004669 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004670 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4671 ds_layout_ci.pNext = NULL;
4672 ds_layout_ci.bindingCount = 1;
4673 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004674
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004675 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004676 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4677 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004678 ASSERT_VK_SUCCESS(err);
4679
4680 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004681 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004682 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004683 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004684 alloc_info.descriptorPool = ds_pool;
4685 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004686 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4687 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004688 ASSERT_VK_SUCCESS(err);
4689
Tony Barboureb254902015-07-15 12:50:33 -06004690 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004691 pipe_ms_state_ci.sType =
4692 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4693 pipe_ms_state_ci.pNext = NULL;
4694 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
4695 pipe_ms_state_ci.sampleShadingEnable = 0;
4696 pipe_ms_state_ci.minSampleShading = 1.0;
4697 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004698
Tony Barboureb254902015-07-15 12:50:33 -06004699 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004700 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4701 pipeline_layout_ci.pNext = NULL;
4702 pipeline_layout_ci.setLayoutCount = 1;
4703 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004704
4705 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004706 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4707 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004708 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004709
Karl Schultz6addd812016-02-02 17:17:23 -07004710 VkShaderObj vs(m_device, bindStateVertShaderText,
4711 VK_SHADER_STAGE_VERTEX_BIT, this);
4712 // TODO - We shouldn't need a fragment shader but add it to be able to run
4713 // on more devices
4714 VkShaderObj fs(m_device, bindStateFragShaderText,
4715 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004716
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004717 VkPipelineObj pipe(m_device);
4718 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004719 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004720 pipe.SetMSAA(&pipe_ms_state_ci);
4721 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06004722
4723 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004724
Karl Schultz6addd812016-02-02 17:17:23 -07004725 // Main thing we care about for this test is that the VkImage obj we're
4726 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004727 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004728 VkClearAttachment color_attachment;
4729 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4730 color_attachment.clearValue.color.float32[0] = 1.0;
4731 color_attachment.clearValue.color.float32[1] = 1.0;
4732 color_attachment.clearValue.color.float32[2] = 1.0;
4733 color_attachment.clearValue.color.float32[3] = 1.0;
4734 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004735 VkClearRect clear_rect = {
4736 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004737
Karl Schultz6addd812016-02-02 17:17:23 -07004738 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4739 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004740
4741 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004742 FAIL() << "Did not receive Error 'vkCommandClearAttachments() issued "
4743 "on CB object...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004744 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004745 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004746
Chia-I Wuf7458c52015-10-26 21:10:41 +08004747 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4748 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4749 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06004750}
4751
Karl Schultz6addd812016-02-02 17:17:23 -07004752TEST_F(VkLayerTest, VtxBufferBadIndex) {
4753 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004754
Karl Schultz6addd812016-02-02 17:17:23 -07004755 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004756 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07004757 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004758
Tobin Ehlis502480b2015-06-24 15:53:07 -06004759 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06004760 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06004761 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06004762
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004763 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004764 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4765 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004766
4767 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004768 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4769 ds_pool_ci.pNext = NULL;
4770 ds_pool_ci.maxSets = 1;
4771 ds_pool_ci.poolSizeCount = 1;
4772 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004773
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004774 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004775 err =
4776 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004777 ASSERT_VK_SUCCESS(err);
4778
Tony Barboureb254902015-07-15 12:50:33 -06004779 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004780 dsl_binding.binding = 0;
4781 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4782 dsl_binding.descriptorCount = 1;
4783 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4784 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004785
Tony Barboureb254902015-07-15 12:50:33 -06004786 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004787 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4788 ds_layout_ci.pNext = NULL;
4789 ds_layout_ci.bindingCount = 1;
4790 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004791
Tobin Ehlis502480b2015-06-24 15:53:07 -06004792 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004793 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4794 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004795 ASSERT_VK_SUCCESS(err);
4796
4797 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004798 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004799 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004800 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004801 alloc_info.descriptorPool = ds_pool;
4802 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004803 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4804 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004805 ASSERT_VK_SUCCESS(err);
4806
Tony Barboureb254902015-07-15 12:50:33 -06004807 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004808 pipe_ms_state_ci.sType =
4809 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
4810 pipe_ms_state_ci.pNext = NULL;
4811 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
4812 pipe_ms_state_ci.sampleShadingEnable = 0;
4813 pipe_ms_state_ci.minSampleShading = 1.0;
4814 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004815
Tony Barboureb254902015-07-15 12:50:33 -06004816 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004817 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4818 pipeline_layout_ci.pNext = NULL;
4819 pipeline_layout_ci.setLayoutCount = 1;
4820 pipeline_layout_ci.pSetLayouts = &ds_layout;
4821 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06004822
Karl Schultz6addd812016-02-02 17:17:23 -07004823 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
4824 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004825 ASSERT_VK_SUCCESS(err);
4826
Karl Schultz6addd812016-02-02 17:17:23 -07004827 VkShaderObj vs(m_device, bindStateVertShaderText,
4828 VK_SHADER_STAGE_VERTEX_BIT, this);
4829 VkShaderObj fs(m_device, bindStateFragShaderText,
4830 VK_SHADER_STAGE_FRAGMENT_BIT,
4831 this); // TODO - We shouldn't need a fragment shader
4832 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004833 VkPipelineObj pipe(m_device);
4834 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06004835 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004836 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004837 pipe.SetViewport(m_viewports);
4838 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06004839 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06004840
4841 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004842 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4843 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06004844 // Don't care about actual data, just need to get to draw to flag error
4845 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07004846 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
4847 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06004848 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06004849 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004850
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004851 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004852 FAIL() << "Did not receive Error 'Vtx Buffer Index 0 was bound, but no "
4853 "vtx buffers are attached to PSO.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004854 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlis502480b2015-06-24 15:53:07 -06004855 }
Mike Stroyand1c84a52015-08-18 14:40:24 -06004856
Chia-I Wuf7458c52015-10-26 21:10:41 +08004857 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4858 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4859 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06004860}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004861#endif // DRAW_STATE_TESTS
4862
Tobin Ehlis0788f522015-05-26 16:11:58 -06004863#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06004864#if GTEST_IS_THREADSAFE
4865struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004866 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004867 VkEvent event;
4868 bool bailout;
4869};
4870
Karl Schultz6addd812016-02-02 17:17:23 -07004871extern "C" void *AddToCommandBuffer(void *arg) {
4872 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004873
Karl Schultz6addd812016-02-02 17:17:23 -07004874 for (int i = 0; i < 10000; i++) {
4875 vkCmdSetEvent(data->commandBuffer, data->event,
4876 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004877 if (data->bailout) {
4878 break;
4879 }
4880 }
4881 return NULL;
4882}
4883
Karl Schultz6addd812016-02-02 17:17:23 -07004884TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004885 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004886
Karl Schultz6addd812016-02-02 17:17:23 -07004887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4888 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004889
Mike Stroyanaccf7692015-05-12 16:00:45 -06004890 ASSERT_NO_FATAL_FAILURE(InitState());
4891 ASSERT_NO_FATAL_FAILURE(InitViewport());
4892 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4893
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004894 // Calls AllocateCommandBuffers
4895 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06004896
4897 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004898 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004899
4900 VkEventCreateInfo event_info;
4901 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06004902 VkResult err;
4903
4904 memset(&event_info, 0, sizeof(event_info));
4905 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4906
Chia-I Wuf7458c52015-10-26 21:10:41 +08004907 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004908 ASSERT_VK_SUCCESS(err);
4909
Mike Stroyanaccf7692015-05-12 16:00:45 -06004910 err = vkResetEvent(device(), event);
4911 ASSERT_VK_SUCCESS(err);
4912
4913 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004914 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004915 data.event = event;
4916 data.bailout = false;
4917 m_errorMonitor->SetBailout(&data.bailout);
4918 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004919 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004920 // Add many entries to command buffer from this thread at the same time.
4921 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06004922
Mike Stroyan4268d1f2015-07-13 14:45:35 -06004923 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004924 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004925
Mike Stroyan10b8cb72016-01-22 15:22:03 -07004926 m_errorMonitor->SetBailout(NULL);
4927
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004928 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07004929 FAIL() << "Did not receive Error 'THREADING ERROR' from using one "
4930 "VkCommandBufferObj in two threads";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004931 m_errorMonitor->DumpFailureMsgs();
Mike Stroyanaccf7692015-05-12 16:00:45 -06004932 }
4933
Chia-I Wuf7458c52015-10-26 21:10:41 +08004934 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06004935}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004936#endif // GTEST_IS_THREADSAFE
4937#endif // THREADING_TESTS
4938
Chris Forbes9f7ff632015-05-25 11:13:08 +12004939#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07004940TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004942 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004943
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004944 ASSERT_NO_FATAL_FAILURE(InitState());
4945 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4946
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004947 VkShaderModule module;
4948 VkShaderModuleCreateInfo moduleCreateInfo;
4949 struct icd_spv_header spv;
4950
4951 spv.magic = ICD_SPV_MAGIC;
4952 spv.version = ICD_SPV_VERSION;
4953 spv.gen_magic = 0;
4954
4955 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4956 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07004957 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004958 moduleCreateInfo.codeSize = 4;
4959 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004960 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004961
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004962 if (!m_errorMonitor->DesiredMsgFound()) {
4963 FAIL() << "Did not recieive Error 'Shader is not SPIR-V'";
4964 m_errorMonitor->DumpFailureMsgs();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004965 }
4966}
4967
Karl Schultz6addd812016-02-02 17:17:23 -07004968TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004970 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004971
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004972 ASSERT_NO_FATAL_FAILURE(InitState());
4973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4974
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004975 VkShaderModule module;
4976 VkShaderModuleCreateInfo moduleCreateInfo;
4977 struct icd_spv_header spv;
4978
4979 spv.magic = ~ICD_SPV_MAGIC;
4980 spv.version = ICD_SPV_VERSION;
4981 spv.gen_magic = 0;
4982
4983 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
4984 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07004985 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004986 moduleCreateInfo.codeSize = sizeof(spv) + 10;
4987 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004988 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004989
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004990 if (!m_errorMonitor->DesiredMsgFound()) {
4991 FAIL() << "Did not recieive Error 'Shader is not SPIR-V'";
4992 m_errorMonitor->DumpFailureMsgs();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06004993 }
4994}
4995
Karl Schultz6addd812016-02-02 17:17:23 -07004996TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004998 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004999
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005000 ASSERT_NO_FATAL_FAILURE(InitState());
5001 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5002
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005003 VkShaderModule module;
5004 VkShaderModuleCreateInfo moduleCreateInfo;
5005 struct icd_spv_header spv;
5006
5007 spv.magic = ICD_SPV_MAGIC;
5008 spv.version = ~ICD_SPV_VERSION;
5009 spv.gen_magic = 0;
5010
5011 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
5012 moduleCreateInfo.pNext = NULL;
5013
Karl Schultz6addd812016-02-02 17:17:23 -07005014 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005015 moduleCreateInfo.codeSize = sizeof(spv) + 10;
5016 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005017 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005018
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005019 if (!m_errorMonitor->DesiredMsgFound()) {
5020 FAIL() << "Did not recieive Error 'Shader is not SPIR-V'";
5021 m_errorMonitor->DumpFailureMsgs();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005022 }
5023}
5024
Karl Schultz6addd812016-02-02 17:17:23 -07005025TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005027 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005028
Chris Forbes9f7ff632015-05-25 11:13:08 +12005029 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005030 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12005031
5032 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005033 "#version 400\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005034 "#extension GL_ARB_separate_shader_objects: require\n"
5035 "#extension GL_ARB_shading_language_420pack: require\n"
5036 "\n"
5037 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005038 "out gl_PerVertex {\n"
5039 " vec4 gl_Position;\n"
5040 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005041 "void main(){\n"
5042 " gl_Position = vec4(1);\n"
5043 " x = 0;\n"
5044 "}\n";
5045 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005046 "#version 400\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005047 "#extension GL_ARB_separate_shader_objects: require\n"
5048 "#extension GL_ARB_shading_language_420pack: require\n"
5049 "\n"
5050 "layout(location=0) out vec4 color;\n"
5051 "void main(){\n"
5052 " color = vec4(1);\n"
5053 "}\n";
5054
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005055 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5056 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12005057
5058 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005059 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12005060 pipe.AddShader(&vs);
5061 pipe.AddShader(&fs);
5062
Chris Forbes9f7ff632015-05-25 11:13:08 +12005063 VkDescriptorSetObj descriptorSet(m_device);
5064 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005065 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12005066
Tony Barbour5781e8f2015-08-04 16:23:11 -06005067 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12005068
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005069 if (!m_errorMonitor->DesiredMsgFound()) {
5070 FAIL() << "Did not receive Warning 'not consumed by fragment shader'";
5071 m_errorMonitor->DumpFailureMsgs();
Chris Forbes9f7ff632015-05-25 11:13:08 +12005072 }
5073}
Chris Forbes9f7ff632015-05-25 11:13:08 +12005074
Karl Schultz6addd812016-02-02 17:17:23 -07005075TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005076 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005077 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005078
Chris Forbes59cb88d2015-05-25 11:13:13 +12005079 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005080 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12005081
5082 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005083 "#version 400\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005084 "#extension GL_ARB_separate_shader_objects: require\n"
5085 "#extension GL_ARB_shading_language_420pack: require\n"
5086 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005087 "out gl_PerVertex {\n"
5088 " vec4 gl_Position;\n"
5089 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005090 "void main(){\n"
5091 " gl_Position = vec4(1);\n"
5092 "}\n";
5093 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005094 "#version 400\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005095 "#extension GL_ARB_separate_shader_objects: require\n"
5096 "#extension GL_ARB_shading_language_420pack: require\n"
5097 "\n"
5098 "layout(location=0) in float x;\n"
5099 "layout(location=0) out vec4 color;\n"
5100 "void main(){\n"
5101 " color = vec4(x);\n"
5102 "}\n";
5103
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005104 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5105 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12005106
5107 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005108 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12005109 pipe.AddShader(&vs);
5110 pipe.AddShader(&fs);
5111
Chris Forbes59cb88d2015-05-25 11:13:13 +12005112 VkDescriptorSetObj descriptorSet(m_device);
5113 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005114 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12005115
Tony Barbour5781e8f2015-08-04 16:23:11 -06005116 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12005117
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005118 if (!m_errorMonitor->DesiredMsgFound()) {
5119 FAIL() << "Did not receive Error 'not written by vertex shader'";
5120 m_errorMonitor->DumpFailureMsgs();
Chris Forbes59cb88d2015-05-25 11:13:13 +12005121 }
5122}
5123
Karl Schultz6addd812016-02-02 17:17:23 -07005124TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13005125 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005126 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13005127
5128 ASSERT_NO_FATAL_FAILURE(InitState());
5129 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5130
5131 char const *vsSource =
5132 "#version 400\n"
5133 "#extension GL_ARB_separate_shader_objects: require\n"
5134 "#extension GL_ARB_shading_language_420pack: require\n"
5135 "\n"
5136 "out gl_PerVertex {\n"
5137 " vec4 gl_Position;\n"
5138 "};\n"
5139 "void main(){\n"
5140 " gl_Position = vec4(1);\n"
5141 "}\n";
5142 char const *fsSource =
5143 "#version 450\n"
5144 "#extension GL_ARB_separate_shader_objects: require\n"
5145 "#extension GL_ARB_shading_language_420pack: require\n"
5146 "\n"
5147 "in block { layout(location=0) float x; } ins;\n"
5148 "layout(location=0) out vec4 color;\n"
5149 "void main(){\n"
5150 " color = vec4(ins.x);\n"
5151 "}\n";
5152
5153 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5154 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5155
5156 VkPipelineObj pipe(m_device);
5157 pipe.AddColorAttachment();
5158 pipe.AddShader(&vs);
5159 pipe.AddShader(&fs);
5160
5161 VkDescriptorSetObj descriptorSet(m_device);
5162 descriptorSet.AppendDummy();
5163 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5164
5165 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5166
5167 if (!m_errorMonitor->DesiredMsgFound()) {
5168 FAIL() << "Did not receive Error 'not written by vertex shader'";
5169 m_errorMonitor->DumpFailureMsgs();
5170 }
5171}
5172
Karl Schultz6addd812016-02-02 17:17:23 -07005173TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13005174 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13005175 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07005176 "output arr[2] of float32' vs 'ptr to "
5177 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13005178
5179 ASSERT_NO_FATAL_FAILURE(InitState());
5180 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5181
5182 char const *vsSource =
5183 "#version 400\n"
5184 "#extension GL_ARB_separate_shader_objects: require\n"
5185 "#extension GL_ARB_shading_language_420pack: require\n"
5186 "\n"
5187 "layout(location=0) out float x[2];\n"
5188 "out gl_PerVertex {\n"
5189 " vec4 gl_Position;\n"
5190 "};\n"
5191 "void main(){\n"
5192 " x[0] = 0; x[1] = 0;\n"
5193 " gl_Position = vec4(1);\n"
5194 "}\n";
5195 char const *fsSource =
5196 "#version 400\n"
5197 "#extension GL_ARB_separate_shader_objects: require\n"
5198 "#extension GL_ARB_shading_language_420pack: require\n"
5199 "\n"
5200 "layout(location=0) in float x[3];\n"
5201 "layout(location=0) out vec4 color;\n"
5202 "void main(){\n"
5203 " color = vec4(x[0] + x[1] + x[2]);\n"
5204 "}\n";
5205
5206 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5207 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5208
5209 VkPipelineObj pipe(m_device);
5210 pipe.AddColorAttachment();
5211 pipe.AddShader(&vs);
5212 pipe.AddShader(&fs);
5213
5214 VkDescriptorSetObj descriptorSet(m_device);
5215 descriptorSet.AppendDummy();
5216 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5217
5218 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5219
5220 if (!m_errorMonitor->DesiredMsgFound()) {
5221 m_errorMonitor->DumpFailureMsgs();
Chris Forbese9928822016-02-17 14:44:52 +13005222 FAIL() << "Did not receive Error 'Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07005223 "output arr[2] of float32' vs 'ptr to input arr[3] of "
5224 "float32''";
Chris Forbes0036fd12016-01-26 14:19:49 +13005225 }
5226}
5227
Karl Schultz6addd812016-02-02 17:17:23 -07005228TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005230 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005231
Chris Forbesb56af562015-05-25 11:13:17 +12005232 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005233 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12005234
5235 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005236 "#version 400\n"
Chris Forbesb56af562015-05-25 11:13:17 +12005237 "#extension GL_ARB_separate_shader_objects: require\n"
5238 "#extension GL_ARB_shading_language_420pack: require\n"
5239 "\n"
5240 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005241 "out gl_PerVertex {\n"
5242 " vec4 gl_Position;\n"
5243 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12005244 "void main(){\n"
5245 " x = 0;\n"
5246 " gl_Position = vec4(1);\n"
5247 "}\n";
5248 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005249 "#version 400\n"
Chris Forbesb56af562015-05-25 11:13:17 +12005250 "#extension GL_ARB_separate_shader_objects: require\n"
5251 "#extension GL_ARB_shading_language_420pack: require\n"
5252 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005253 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12005254 "layout(location=0) out vec4 color;\n"
5255 "void main(){\n"
5256 " color = vec4(x);\n"
5257 "}\n";
5258
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005259 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5260 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12005261
5262 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005263 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12005264 pipe.AddShader(&vs);
5265 pipe.AddShader(&fs);
5266
Chris Forbesb56af562015-05-25 11:13:17 +12005267 VkDescriptorSetObj descriptorSet(m_device);
5268 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005269 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12005270
Tony Barbour5781e8f2015-08-04 16:23:11 -06005271 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12005272
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005273 if (!m_errorMonitor->DesiredMsgFound()) {
5274 FAIL() << "Did not receive Error 'Type mismatch on location 0'";
5275 m_errorMonitor->DumpFailureMsgs();
Chris Forbesb56af562015-05-25 11:13:17 +12005276 }
5277}
5278
Karl Schultz6addd812016-02-02 17:17:23 -07005279TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13005280 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005281 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13005282
5283 ASSERT_NO_FATAL_FAILURE(InitState());
5284 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5285
5286 char const *vsSource =
5287 "#version 450\n"
5288 "#extension GL_ARB_separate_shader_objects: require\n"
5289 "#extension GL_ARB_shading_language_420pack: require\n"
5290 "\n"
5291 "out block { layout(location=0) int x; } outs;\n"
5292 "out gl_PerVertex {\n"
5293 " vec4 gl_Position;\n"
5294 "};\n"
5295 "void main(){\n"
5296 " outs.x = 0;\n"
5297 " gl_Position = vec4(1);\n"
5298 "}\n";
5299 char const *fsSource =
5300 "#version 450\n"
5301 "#extension GL_ARB_separate_shader_objects: require\n"
5302 "#extension GL_ARB_shading_language_420pack: require\n"
5303 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005304 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13005305 "layout(location=0) out vec4 color;\n"
5306 "void main(){\n"
5307 " color = vec4(ins.x);\n"
5308 "}\n";
5309
5310 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5311 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5312
5313 VkPipelineObj pipe(m_device);
5314 pipe.AddColorAttachment();
5315 pipe.AddShader(&vs);
5316 pipe.AddShader(&fs);
5317
5318 VkDescriptorSetObj descriptorSet(m_device);
5319 descriptorSet.AppendDummy();
5320 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5321
5322 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5323
5324 if (!m_errorMonitor->DesiredMsgFound()) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13005325 m_errorMonitor->DumpFailureMsgs();
Chris Forbese9928822016-02-17 14:44:52 +13005326 FAIL() << "Did not receive Error 'Type mismatch on location 0'";
5327 }
5328}
5329
5330TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
5331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5332 "location 0.0 which is not written by vertex shader");
5333
5334 ASSERT_NO_FATAL_FAILURE(InitState());
5335 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5336
5337 char const *vsSource =
5338 "#version 450\n"
5339 "#extension GL_ARB_separate_shader_objects: require\n"
5340 "#extension GL_ARB_shading_language_420pack: require\n"
5341 "\n"
5342 "out block { layout(location=1) float x; } outs;\n"
5343 "out gl_PerVertex {\n"
5344 " vec4 gl_Position;\n"
5345 "};\n"
5346 "void main(){\n"
5347 " outs.x = 0;\n"
5348 " gl_Position = vec4(1);\n"
5349 "}\n";
5350 char const *fsSource =
5351 "#version 450\n"
5352 "#extension GL_ARB_separate_shader_objects: require\n"
5353 "#extension GL_ARB_shading_language_420pack: require\n"
5354 "\n"
5355 "in block { layout(location=0) float x; } ins;\n"
5356 "layout(location=0) out vec4 color;\n"
5357 "void main(){\n"
5358 " color = vec4(ins.x);\n"
5359 "}\n";
5360
5361 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5362 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5363
5364 VkPipelineObj pipe(m_device);
5365 pipe.AddColorAttachment();
5366 pipe.AddShader(&vs);
5367 pipe.AddShader(&fs);
5368
5369 VkDescriptorSetObj descriptorSet(m_device);
5370 descriptorSet.AppendDummy();
5371 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5372
5373 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5374
5375 if (!m_errorMonitor->DesiredMsgFound()) {
5376 m_errorMonitor->DumpFailureMsgs();
5377 FAIL() << "Did not receive Error 'location 0.0 which is not written by vertex shader'";
5378 }
5379}
5380
5381TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
5382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5383 "location 0.1 which is not written by vertex shader");
5384
5385 ASSERT_NO_FATAL_FAILURE(InitState());
5386 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5387
5388 char const *vsSource =
5389 "#version 450\n"
5390 "#extension GL_ARB_separate_shader_objects: require\n"
5391 "#extension GL_ARB_shading_language_420pack: require\n"
5392 "\n"
5393 "out block { layout(location=0, component=0) float x; } outs;\n"
5394 "out gl_PerVertex {\n"
5395 " vec4 gl_Position;\n"
5396 "};\n"
5397 "void main(){\n"
5398 " outs.x = 0;\n"
5399 " gl_Position = vec4(1);\n"
5400 "}\n";
5401 char const *fsSource =
5402 "#version 450\n"
5403 "#extension GL_ARB_separate_shader_objects: require\n"
5404 "#extension GL_ARB_shading_language_420pack: require\n"
5405 "\n"
5406 "in block { layout(location=0, component=1) float x; } ins;\n"
5407 "layout(location=0) out vec4 color;\n"
5408 "void main(){\n"
5409 " color = vec4(ins.x);\n"
5410 "}\n";
5411
5412 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5413 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5414
5415 VkPipelineObj pipe(m_device);
5416 pipe.AddColorAttachment();
5417 pipe.AddShader(&vs);
5418 pipe.AddShader(&fs);
5419
5420 VkDescriptorSetObj descriptorSet(m_device);
5421 descriptorSet.AppendDummy();
5422 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5423
5424 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5425
5426 if (!m_errorMonitor->DesiredMsgFound()) {
5427 m_errorMonitor->DumpFailureMsgs();
5428 FAIL() << "Did not receive Error 'location 0.1 which is not written by vertex shader'";
Chris Forbesa3e85f62016-01-15 14:53:11 +13005429 }
5430}
5431
Karl Schultz6addd812016-02-02 17:17:23 -07005432TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005434 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005435
Chris Forbesde136e02015-05-25 11:13:28 +12005436 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005437 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12005438
5439 VkVertexInputBindingDescription input_binding;
5440 memset(&input_binding, 0, sizeof(input_binding));
5441
5442 VkVertexInputAttributeDescription input_attrib;
5443 memset(&input_attrib, 0, sizeof(input_attrib));
5444 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5445
5446 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005447 "#version 400\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005448 "#extension GL_ARB_separate_shader_objects: require\n"
5449 "#extension GL_ARB_shading_language_420pack: require\n"
5450 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005451 "out gl_PerVertex {\n"
5452 " vec4 gl_Position;\n"
5453 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005454 "void main(){\n"
5455 " gl_Position = vec4(1);\n"
5456 "}\n";
5457 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005458 "#version 400\n"
Chris Forbesde136e02015-05-25 11:13:28 +12005459 "#extension GL_ARB_separate_shader_objects: require\n"
5460 "#extension GL_ARB_shading_language_420pack: require\n"
5461 "\n"
5462 "layout(location=0) out vec4 color;\n"
5463 "void main(){\n"
5464 " color = vec4(1);\n"
5465 "}\n";
5466
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005467 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5468 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12005469
5470 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005471 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12005472 pipe.AddShader(&vs);
5473 pipe.AddShader(&fs);
5474
5475 pipe.AddVertexInputBindings(&input_binding, 1);
5476 pipe.AddVertexInputAttribs(&input_attrib, 1);
5477
Chris Forbesde136e02015-05-25 11:13:28 +12005478 VkDescriptorSetObj descriptorSet(m_device);
5479 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005480 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12005481
Tony Barbour5781e8f2015-08-04 16:23:11 -06005482 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12005483
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005484 if (!m_errorMonitor->DesiredMsgFound()) {
5485 FAIL() << "Did not receive Warning 'location 0 not consumed by VS'";
5486 m_errorMonitor->DumpFailureMsgs();
Chris Forbesde136e02015-05-25 11:13:28 +12005487 }
5488}
5489
Karl Schultz6addd812016-02-02 17:17:23 -07005490TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005492 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13005493
5494 ASSERT_NO_FATAL_FAILURE(InitState());
5495 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5496
5497 VkVertexInputBindingDescription input_binding;
5498 memset(&input_binding, 0, sizeof(input_binding));
5499
5500 VkVertexInputAttributeDescription input_attrib;
5501 memset(&input_attrib, 0, sizeof(input_attrib));
5502 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5503
5504 char const *vsSource =
5505 "#version 400\n"
5506 "#extension GL_ARB_separate_shader_objects: require\n"
5507 "#extension GL_ARB_shading_language_420pack: require\n"
5508 "\n"
5509 "layout(location=1) in float x;\n"
5510 "out gl_PerVertex {\n"
5511 " vec4 gl_Position;\n"
5512 "};\n"
5513 "void main(){\n"
5514 " gl_Position = vec4(x);\n"
5515 "}\n";
5516 char const *fsSource =
5517 "#version 400\n"
5518 "#extension GL_ARB_separate_shader_objects: require\n"
5519 "#extension GL_ARB_shading_language_420pack: require\n"
5520 "\n"
5521 "layout(location=0) out vec4 color;\n"
5522 "void main(){\n"
5523 " color = vec4(1);\n"
5524 "}\n";
5525
5526 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5527 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5528
5529 VkPipelineObj pipe(m_device);
5530 pipe.AddColorAttachment();
5531 pipe.AddShader(&vs);
5532 pipe.AddShader(&fs);
5533
5534 pipe.AddVertexInputBindings(&input_binding, 1);
5535 pipe.AddVertexInputAttribs(&input_attrib, 1);
5536
5537 VkDescriptorSetObj descriptorSet(m_device);
5538 descriptorSet.AppendDummy();
5539 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5540
5541 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5542
5543 if (!m_errorMonitor->DesiredMsgFound()) {
5544 m_errorMonitor->DumpFailureMsgs();
5545 FAIL() << "Did not receive Warning 'location 0 not consumed by VS'";
5546 }
5547}
5548
Karl Schultz6addd812016-02-02 17:17:23 -07005549TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
5550 m_errorMonitor->SetDesiredFailureMsg(
5551 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005552 "VS consumes input at location 0 but not provided");
5553
Chris Forbes62e8e502015-05-25 11:13:29 +12005554 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005555 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12005556
5557 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005558 "#version 400\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005559 "#extension GL_ARB_separate_shader_objects: require\n"
5560 "#extension GL_ARB_shading_language_420pack: require\n"
5561 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005562 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07005563 "out gl_PerVertex {\n"
5564 " vec4 gl_Position;\n"
5565 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005566 "void main(){\n"
5567 " gl_Position = x;\n"
5568 "}\n";
5569 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005570 "#version 400\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12005571 "#extension GL_ARB_separate_shader_objects: require\n"
5572 "#extension GL_ARB_shading_language_420pack: require\n"
5573 "\n"
5574 "layout(location=0) out vec4 color;\n"
5575 "void main(){\n"
5576 " color = vec4(1);\n"
5577 "}\n";
5578
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005579 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5580 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12005581
5582 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005583 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12005584 pipe.AddShader(&vs);
5585 pipe.AddShader(&fs);
5586
Chris Forbes62e8e502015-05-25 11:13:29 +12005587 VkDescriptorSetObj descriptorSet(m_device);
5588 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005589 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12005590
Tony Barbour5781e8f2015-08-04 16:23:11 -06005591 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12005592
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005593 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005594 FAIL() << "Did not receive Error 'VS consumes input at location 0 but "
5595 "not provided'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005596 m_errorMonitor->DumpFailureMsgs();
Chris Forbes62e8e502015-05-25 11:13:29 +12005597 }
5598}
5599
Karl Schultz6addd812016-02-02 17:17:23 -07005600TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
5601 m_errorMonitor->SetDesiredFailureMsg(
5602 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005603 "location 0 does not match VS input type");
5604
Chris Forbesc97d98e2015-05-25 11:13:31 +12005605 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005606 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12005607
5608 VkVertexInputBindingDescription input_binding;
5609 memset(&input_binding, 0, sizeof(input_binding));
5610
5611 VkVertexInputAttributeDescription input_attrib;
5612 memset(&input_attrib, 0, sizeof(input_attrib));
5613 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5614
5615 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005616 "#version 400\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005617 "#extension GL_ARB_separate_shader_objects: require\n"
5618 "#extension GL_ARB_shading_language_420pack: require\n"
5619 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005620 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07005621 "out gl_PerVertex {\n"
5622 " vec4 gl_Position;\n"
5623 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005624 "void main(){\n"
5625 " gl_Position = vec4(x);\n"
5626 "}\n";
5627 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005628 "#version 400\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12005629 "#extension GL_ARB_separate_shader_objects: require\n"
5630 "#extension GL_ARB_shading_language_420pack: require\n"
5631 "\n"
5632 "layout(location=0) out vec4 color;\n"
5633 "void main(){\n"
5634 " color = vec4(1);\n"
5635 "}\n";
5636
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005637 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5638 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12005639
5640 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005641 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12005642 pipe.AddShader(&vs);
5643 pipe.AddShader(&fs);
5644
5645 pipe.AddVertexInputBindings(&input_binding, 1);
5646 pipe.AddVertexInputAttribs(&input_attrib, 1);
5647
Chris Forbesc97d98e2015-05-25 11:13:31 +12005648 VkDescriptorSetObj descriptorSet(m_device);
5649 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005650 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12005651
Tony Barbour5781e8f2015-08-04 16:23:11 -06005652 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12005653
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005654 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005655 FAIL() << "Did not receive Error 'location 0 does not match VS input "
5656 "type'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005657 m_errorMonitor->DumpFailureMsgs();
Chris Forbesc97d98e2015-05-25 11:13:31 +12005658 }
5659}
5660
Karl Schultz6addd812016-02-02 17:17:23 -07005661TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes2682b242015-11-24 11:13:14 +13005662 m_errorMonitor->SetDesiredFailureMsg(~0u, "");
5663
5664 ASSERT_NO_FATAL_FAILURE(InitState());
5665 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5666
5667 VkVertexInputBindingDescription input_binding;
5668 memset(&input_binding, 0, sizeof(input_binding));
5669
5670 VkVertexInputAttributeDescription input_attribs[2];
5671 memset(input_attribs, 0, sizeof(input_attribs));
5672
5673 for (int i = 0; i < 2; i++) {
5674 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
5675 input_attribs[i].location = i;
5676 }
5677
5678 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005679 "#version 400\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005680 "#extension GL_ARB_separate_shader_objects: require\n"
5681 "#extension GL_ARB_shading_language_420pack: require\n"
5682 "\n"
5683 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005684 "out gl_PerVertex {\n"
5685 " vec4 gl_Position;\n"
5686 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005687 "void main(){\n"
5688 " gl_Position = x[0] + x[1];\n"
5689 "}\n";
5690 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005691 "#version 400\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005692 "#extension GL_ARB_separate_shader_objects: require\n"
5693 "#extension GL_ARB_shading_language_420pack: require\n"
5694 "\n"
5695 "layout(location=0) out vec4 color;\n"
5696 "void main(){\n"
5697 " color = vec4(1);\n"
5698 "}\n";
5699
5700 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5701 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5702
5703 VkPipelineObj pipe(m_device);
5704 pipe.AddColorAttachment();
5705 pipe.AddShader(&vs);
5706 pipe.AddShader(&fs);
5707
5708 pipe.AddVertexInputBindings(&input_binding, 1);
5709 pipe.AddVertexInputAttribs(input_attribs, 2);
5710
5711 VkDescriptorSetObj descriptorSet(m_device);
5712 descriptorSet.AppendDummy();
5713 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5714
5715 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5716
5717 /* expect success */
5718 if (m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005719 FAIL() << "Expected to succeed but: "
5720 << m_errorMonitor->GetFailureMsg();
Chris Forbes2682b242015-11-24 11:13:14 +13005721 m_errorMonitor->DumpFailureMsgs();
5722 }
5723}
5724
Chris Forbes2682b242015-11-24 11:13:14 +13005725TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
5726{
5727 m_errorMonitor->SetDesiredFailureMsg(~0u, "");
5728
5729 ASSERT_NO_FATAL_FAILURE(InitState());
5730 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5731
5732 VkVertexInputBindingDescription input_binding;
5733 memset(&input_binding, 0, sizeof(input_binding));
5734
5735 VkVertexInputAttributeDescription input_attribs[2];
5736 memset(input_attribs, 0, sizeof(input_attribs));
5737
5738 for (int i = 0; i < 2; i++) {
5739 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
5740 input_attribs[i].location = i;
5741 }
5742
5743 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005744 "#version 400\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005745 "#extension GL_ARB_separate_shader_objects: require\n"
5746 "#extension GL_ARB_shading_language_420pack: require\n"
5747 "\n"
5748 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07005749 "out gl_PerVertex {\n"
5750 " vec4 gl_Position;\n"
5751 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005752 "void main(){\n"
5753 " gl_Position = x[0] + x[1];\n"
5754 "}\n";
5755 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005756 "#version 400\n"
Chris Forbes2682b242015-11-24 11:13:14 +13005757 "#extension GL_ARB_separate_shader_objects: require\n"
5758 "#extension GL_ARB_shading_language_420pack: require\n"
5759 "\n"
5760 "layout(location=0) out vec4 color;\n"
5761 "void main(){\n"
5762 " color = vec4(1);\n"
5763 "}\n";
5764
5765 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5766 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5767
5768 VkPipelineObj pipe(m_device);
5769 pipe.AddColorAttachment();
5770 pipe.AddShader(&vs);
5771 pipe.AddShader(&fs);
5772
5773 pipe.AddVertexInputBindings(&input_binding, 1);
5774 pipe.AddVertexInputAttribs(input_attribs, 2);
5775
5776 VkDescriptorSetObj descriptorSet(m_device);
5777 descriptorSet.AppendDummy();
5778 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5779
5780 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5781
5782 if (m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005783 FAIL() << "Expected to succeed but: " <<
5784m_errorMonitor->GetFailureMsg();
Chris Forbes2682b242015-11-24 11:13:14 +13005785 m_errorMonitor->DumpFailureMsgs();
5786 }
5787}
Chris Forbes2682b242015-11-24 11:13:14 +13005788
Karl Schultz6addd812016-02-02 17:17:23 -07005789TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
5790 m_errorMonitor->SetDesiredFailureMsg(
5791 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005792 "Duplicate vertex input binding descriptions for binding 0");
5793
Chris Forbes280ba2c2015-06-12 11:16:41 +12005794 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005795 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12005796
5797 /* Two binding descriptions for binding 0 */
5798 VkVertexInputBindingDescription input_bindings[2];
5799 memset(input_bindings, 0, sizeof(input_bindings));
5800
5801 VkVertexInputAttributeDescription input_attrib;
5802 memset(&input_attrib, 0, sizeof(input_attrib));
5803 input_attrib.format = VK_FORMAT_R32_SFLOAT;
5804
5805 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005806 "#version 400\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005807 "#extension GL_ARB_separate_shader_objects: require\n"
5808 "#extension GL_ARB_shading_language_420pack: require\n"
5809 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005810 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07005811 "out gl_PerVertex {\n"
5812 " vec4 gl_Position;\n"
5813 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005814 "void main(){\n"
5815 " gl_Position = vec4(x);\n"
5816 "}\n";
5817 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005818 "#version 400\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12005819 "#extension GL_ARB_separate_shader_objects: require\n"
5820 "#extension GL_ARB_shading_language_420pack: require\n"
5821 "\n"
5822 "layout(location=0) out vec4 color;\n"
5823 "void main(){\n"
5824 " color = vec4(1);\n"
5825 "}\n";
5826
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005827 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5828 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12005829
5830 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005831 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12005832 pipe.AddShader(&vs);
5833 pipe.AddShader(&fs);
5834
5835 pipe.AddVertexInputBindings(input_bindings, 2);
5836 pipe.AddVertexInputAttribs(&input_attrib, 1);
5837
Chris Forbes280ba2c2015-06-12 11:16:41 +12005838 VkDescriptorSetObj descriptorSet(m_device);
5839 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005840 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12005841
Tony Barbour5781e8f2015-08-04 16:23:11 -06005842 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12005843
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005844 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005845 FAIL() << "Did not receive Error 'Duplicate vertex input binding "
5846 "descriptions for binding 0'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005847 m_errorMonitor->DumpFailureMsgs();
Chris Forbes280ba2c2015-06-12 11:16:41 +12005848 }
5849}
Chris Forbes8f68b562015-05-25 11:13:32 +12005850
Karl Schultz6addd812016-02-02 17:17:23 -07005851TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005853 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005854
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005855 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005856
5857 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005858 "#version 400\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005859 "#extension GL_ARB_separate_shader_objects: require\n"
5860 "#extension GL_ARB_shading_language_420pack: require\n"
5861 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005862 "out gl_PerVertex {\n"
5863 " vec4 gl_Position;\n"
5864 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005865 "void main(){\n"
5866 " gl_Position = vec4(1);\n"
5867 "}\n";
5868 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005869 "#version 400\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005870 "#extension GL_ARB_separate_shader_objects: require\n"
5871 "#extension GL_ARB_shading_language_420pack: require\n"
5872 "\n"
5873 "void main(){\n"
5874 "}\n";
5875
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005876 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5877 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005878
5879 VkPipelineObj pipe(m_device);
5880 pipe.AddShader(&vs);
5881 pipe.AddShader(&fs);
5882
Chia-I Wu08accc62015-07-07 11:50:03 +08005883 /* set up CB 0, not written */
5884 pipe.AddColorAttachment();
5885 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005886
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005887 VkDescriptorSetObj descriptorSet(m_device);
5888 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005889 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005890
Tony Barbour5781e8f2015-08-04 16:23:11 -06005891 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005892
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005893 if (!m_errorMonitor->DesiredMsgFound()) {
5894 FAIL() << "Did not receive Error 'Attachment 0 not written by FS'";
5895 m_errorMonitor->DumpFailureMsgs();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12005896 }
5897}
5898
Karl Schultz6addd812016-02-02 17:17:23 -07005899TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005900 // TODO: verify that this matches layer
Karl Schultz6addd812016-02-02 17:17:23 -07005901 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005902 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005903 "FS writes to output location 1 with no matching attachment");
5904
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005905 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005906
5907 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005908 "#version 400\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005909 "#extension GL_ARB_separate_shader_objects: require\n"
5910 "#extension GL_ARB_shading_language_420pack: require\n"
5911 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005912 "out gl_PerVertex {\n"
5913 " vec4 gl_Position;\n"
5914 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005915 "void main(){\n"
5916 " gl_Position = vec4(1);\n"
5917 "}\n";
5918 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005919 "#version 400\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005920 "#extension GL_ARB_separate_shader_objects: require\n"
5921 "#extension GL_ARB_shading_language_420pack: require\n"
5922 "\n"
5923 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005924 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005925 "void main(){\n"
5926 " x = vec4(1);\n"
5927 " y = vec4(1);\n"
5928 "}\n";
5929
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005930 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5931 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005932
5933 VkPipelineObj pipe(m_device);
5934 pipe.AddShader(&vs);
5935 pipe.AddShader(&fs);
5936
Chia-I Wu08accc62015-07-07 11:50:03 +08005937 /* set up CB 0, not written */
5938 pipe.AddColorAttachment();
5939 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005940 /* FS writes CB 1, but we don't configure it */
5941
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005942 VkDescriptorSetObj descriptorSet(m_device);
5943 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005944 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005945
Tony Barbour5781e8f2015-08-04 16:23:11 -06005946 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005947
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005948 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07005949 FAIL() << "Did not receive Error 'FS writes to output location 1 with "
5950 "no matching attachment'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005951 m_errorMonitor->DumpFailureMsgs();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12005952 }
5953}
5954
Karl Schultz6addd812016-02-02 17:17:23 -07005955TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005957 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005958
Chris Forbesa36d69e2015-05-25 11:13:44 +12005959 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12005960
5961 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005962 "#version 400\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005963 "#extension GL_ARB_separate_shader_objects: require\n"
5964 "#extension GL_ARB_shading_language_420pack: require\n"
5965 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005966 "out gl_PerVertex {\n"
5967 " vec4 gl_Position;\n"
5968 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005969 "void main(){\n"
5970 " gl_Position = vec4(1);\n"
5971 "}\n";
5972 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07005973 "#version 400\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12005974 "#extension GL_ARB_separate_shader_objects: require\n"
5975 "#extension GL_ARB_shading_language_420pack: require\n"
5976 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005977 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12005978 "void main(){\n"
5979 " x = ivec4(1);\n"
5980 "}\n";
5981
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005982 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5983 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12005984
5985 VkPipelineObj pipe(m_device);
5986 pipe.AddShader(&vs);
5987 pipe.AddShader(&fs);
5988
Chia-I Wu08accc62015-07-07 11:50:03 +08005989 /* set up CB 0; type is UNORM by default */
5990 pipe.AddColorAttachment();
5991 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12005992
Chris Forbesa36d69e2015-05-25 11:13:44 +12005993 VkDescriptorSetObj descriptorSet(m_device);
5994 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005995 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12005996
Tony Barbour5781e8f2015-08-04 16:23:11 -06005997 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12005998
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005999 if (!m_errorMonitor->DesiredMsgFound()) {
6000 FAIL() << "Did not receive Error 'does not match FS output type'";
6001 m_errorMonitor->DumpFailureMsgs();
Chris Forbesa36d69e2015-05-25 11:13:44 +12006002 }
6003}
Chris Forbes7b1b8932015-06-05 14:43:36 +12006004
Karl Schultz6addd812016-02-02 17:17:23 -07006005TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006007 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006008
Chris Forbes556c76c2015-08-14 12:04:59 +12006009 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12006010
6011 char const *vsSource =
Tony Barboure804d202016-01-05 13:37:45 -07006012 "#version 400\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12006013 "#extension GL_ARB_separate_shader_objects: require\n"
6014 "#extension GL_ARB_shading_language_420pack: require\n"
6015 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006016 "out gl_PerVertex {\n"
6017 " vec4 gl_Position;\n"
6018 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12006019 "void main(){\n"
6020 " gl_Position = vec4(1);\n"
6021 "}\n";
6022 char const *fsSource =
Tony Barboure804d202016-01-05 13:37:45 -07006023 "#version 400\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12006024 "#extension GL_ARB_separate_shader_objects: require\n"
6025 "#extension GL_ARB_shading_language_420pack: require\n"
6026 "\n"
6027 "layout(location=0) out vec4 x;\n"
6028 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6029 "void main(){\n"
6030 " x = vec4(bar.y);\n"
6031 "}\n";
6032
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006033 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6034 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12006035
Chris Forbes556c76c2015-08-14 12:04:59 +12006036 VkPipelineObj pipe(m_device);
6037 pipe.AddShader(&vs);
6038 pipe.AddShader(&fs);
6039
6040 /* set up CB 0; type is UNORM by default */
6041 pipe.AddColorAttachment();
6042 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6043
6044 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006045 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12006046
6047 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6048
6049 /* should have generated an error -- pipeline layout does not
6050 * provide a uniform buffer in 0.0
6051 */
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006052 if (!m_errorMonitor->DesiredMsgFound()) {
6053 FAIL() << "Did not receive Error 'not declared in pipeline layout'";
6054 m_errorMonitor->DumpFailureMsgs();
Chris Forbes556c76c2015-08-14 12:04:59 +12006055 }
6056}
6057
Chris Forbes5c59e902016-02-26 16:56:09 +13006058TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
6059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6060 "not declared in layout");
6061
6062 ASSERT_NO_FATAL_FAILURE(InitState());
6063
6064 char const *vsSource =
6065 "#version 450\n"
6066 "#extension GL_ARB_separate_shader_objects: require\n"
6067 "#extension GL_ARB_shading_language_420pack: require\n"
6068 "\n"
6069 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
6070 "out gl_PerVertex {\n"
6071 " vec4 gl_Position;\n"
6072 "};\n"
6073 "void main(){\n"
6074 " gl_Position = vec4(consts.x);\n"
6075 "}\n";
6076 char const *fsSource =
6077 "#version 450\n"
6078 "#extension GL_ARB_separate_shader_objects: require\n"
6079 "#extension GL_ARB_shading_language_420pack: require\n"
6080 "\n"
6081 "layout(location=0) out vec4 x;\n"
6082 "void main(){\n"
6083 " x = vec4(1);\n"
6084 "}\n";
6085
6086 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6087 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6088
6089 VkPipelineObj pipe(m_device);
6090 pipe.AddShader(&vs);
6091 pipe.AddShader(&fs);
6092
6093 /* set up CB 0; type is UNORM by default */
6094 pipe.AddColorAttachment();
6095 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6096
6097 VkDescriptorSetObj descriptorSet(m_device);
6098 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6099
6100 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6101
6102 /* should have generated an error -- no push constant ranges provided! */
6103 if (!m_errorMonitor->DesiredMsgFound()) {
6104 FAIL() << "Did not receive Error 'not declared in pipeline layout'";
6105 m_errorMonitor->DumpFailureMsgs();
6106 }
6107}
6108
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006109#endif // SHADER_CHECKER_TESTS
6110
6111#if DEVICE_LIMITS_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006112TEST_F(VkLayerTest, CreateImageLimitsViolationWidth) {
6113 m_errorMonitor->SetDesiredFailureMsg(
6114 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006115 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006116
6117 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006118
6119 // Create an image
6120 VkImage image;
6121
Karl Schultz6addd812016-02-02 17:17:23 -07006122 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6123 const int32_t tex_width = 32;
6124 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006125
6126 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006127 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6128 image_create_info.pNext = NULL;
6129 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6130 image_create_info.format = tex_format;
6131 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006132 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07006133 image_create_info.extent.depth = 1;
6134 image_create_info.mipLevels = 1;
6135 image_create_info.arrayLayers = 1;
6136 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6137 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6138 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6139 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006140
6141 // Introduce error by sending down a bogus width extent
6142 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08006143 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006144
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006145 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006146 FAIL() << "Did not receive Error 'CreateImage extents exceed allowable "
6147 "limits for format'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006148 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006149 }
6150}
6151
Karl Schultz6addd812016-02-02 17:17:23 -07006152TEST_F(VkLayerTest, UpdateBufferAlignment) {
6153 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06006154
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006156 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006157
Mike Stroyana3082432015-09-25 13:39:21 -06006158 ASSERT_NO_FATAL_FAILURE(InitState());
6159
6160 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
6161 vk_testing::Buffer buffer;
6162 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
6163
6164 BeginCommandBuffer();
6165 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006166 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006167 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006168 FAIL() << "Did not receive Error 'vkCommandUpdateBuffer parameter, "
6169 "VkDeviceSize dstOffset, 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 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006172
Mike Stroyana3082432015-09-25 13:39:21 -06006173 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006174 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006175 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006176
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006177 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006178
6179 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006180 FAIL() << "Did not receive Error 'vkCommandUpdateBuffer parameter, "
6181 "VkDeviceSize dataSize, is not a multiple of 4'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006182 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006183 }
6184 EndCommandBuffer();
6185}
6186
Karl Schultz6addd812016-02-02 17:17:23 -07006187TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006189 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06006190
6191 ASSERT_NO_FATAL_FAILURE(InitState());
6192
6193 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
6194 vk_testing::Buffer buffer;
6195 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
6196
6197 BeginCommandBuffer();
6198 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006199 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006200 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006201 FAIL() << "Did not receive Error 'vkCommandFillBuffer parameter, "
6202 "VkDeviceSize dstOffset, is not a multiple of 4'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006203 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006204 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006205
Mike Stroyana3082432015-09-25 13:39:21 -06006206 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006208 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006209
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006210 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006211
6212 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006213 FAIL() << "Did not receive Error 'vkCommandFillBuffer parameter, "
6214 "VkDeviceSize size, is not a multiple of 4'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006215 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006216 }
6217 EndCommandBuffer();
6218}
6219
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006220#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12006221
Tobin Ehliscde08892015-09-22 10:11:37 -06006222#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07006223TEST_F(VkLayerTest, InvalidImageView) {
6224 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06006225
Karl Schultz6addd812016-02-02 17:17:23 -07006226 m_errorMonitor->SetDesiredFailureMsg(
6227 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006228 "vkCreateImageView called with baseMipLevel 10 ");
6229
Tobin Ehliscde08892015-09-22 10:11:37 -06006230 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06006231
Mike Stroyana3082432015-09-25 13:39:21 -06006232 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07006233 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06006234
Karl Schultz6addd812016-02-02 17:17:23 -07006235 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6236 const int32_t tex_width = 32;
6237 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06006238
6239 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006240 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6241 image_create_info.pNext = NULL;
6242 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6243 image_create_info.format = tex_format;
6244 image_create_info.extent.width = tex_width;
6245 image_create_info.extent.height = tex_height;
6246 image_create_info.extent.depth = 1;
6247 image_create_info.mipLevels = 1;
6248 image_create_info.arrayLayers = 1;
6249 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6250 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6251 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6252 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06006253
Chia-I Wuf7458c52015-10-26 21:10:41 +08006254 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06006255 ASSERT_VK_SUCCESS(err);
6256
6257 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006258 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6259 image_view_create_info.image = image;
6260 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6261 image_view_create_info.format = tex_format;
6262 image_view_create_info.subresourceRange.layerCount = 1;
6263 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
6264 image_view_create_info.subresourceRange.levelCount = 1;
6265 image_view_create_info.subresourceRange.aspectMask =
6266 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06006267
6268 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07006269 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6270 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06006271
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006272 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006273 FAIL() << "Did not receive Error 'vkCreateImageView called with "
6274 "baseMipLevel 10...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006275 m_errorMonitor->DumpFailureMsgs();
Tobin Ehliscde08892015-09-22 10:11:37 -06006276 }
6277}
Mike Stroyana3082432015-09-25 13:39:21 -06006278
Karl Schultz6addd812016-02-02 17:17:23 -07006279TEST_F(VkLayerTest, InvalidImageViewAspect) {
6280 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006281
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006283 "vkCreateImageView: Color image "
6284 "formats must have ONLY the "
6285 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006286
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006287 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006288
6289 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07006290 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006291
Karl Schultz6addd812016-02-02 17:17:23 -07006292 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6293 const int32_t tex_width = 32;
6294 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006295
6296 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006297 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6298 image_create_info.pNext = NULL;
6299 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6300 image_create_info.format = tex_format;
6301 image_create_info.extent.width = tex_width;
6302 image_create_info.extent.height = tex_height;
6303 image_create_info.extent.depth = 1;
6304 image_create_info.mipLevels = 1;
6305 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6306 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6307 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6308 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006309
Chia-I Wuf7458c52015-10-26 21:10:41 +08006310 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006311 ASSERT_VK_SUCCESS(err);
6312
6313 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006314 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6315 image_view_create_info.image = image;
6316 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6317 image_view_create_info.format = tex_format;
6318 image_view_create_info.subresourceRange.baseMipLevel = 0;
6319 image_view_create_info.subresourceRange.levelCount = 1;
6320 // Cause an error by setting an invalid image aspect
6321 image_view_create_info.subresourceRange.aspectMask =
6322 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006323
6324 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07006325 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
6326 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006327
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006328 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006329 FAIL() << "Did not receive Error 'VkCreateImageView: Color image "
6330 "formats must have ...'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006331 m_errorMonitor->DumpFailureMsgs();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06006332 }
6333}
6334
Karl Schultz6addd812016-02-02 17:17:23 -07006335TEST_F(VkLayerTest, CopyImageTypeMismatch) {
6336 VkResult err;
6337 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006338
Karl Schultz6addd812016-02-02 17:17:23 -07006339 m_errorMonitor->SetDesiredFailureMsg(
6340 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006341 "vkCmdCopyImage called with unmatched source and dest image types");
6342
Mike Stroyana3082432015-09-25 13:39:21 -06006343 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006344
6345 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006346 VkImage srcImage;
6347 VkImage dstImage;
6348 VkDeviceMemory srcMem;
6349 VkDeviceMemory destMem;
6350 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006351
6352 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006353 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6354 image_create_info.pNext = NULL;
6355 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6356 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6357 image_create_info.extent.width = 32;
6358 image_create_info.extent.height = 32;
6359 image_create_info.extent.depth = 1;
6360 image_create_info.mipLevels = 1;
6361 image_create_info.arrayLayers = 1;
6362 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6363 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6364 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6365 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006366
Karl Schultz6addd812016-02-02 17:17:23 -07006367 err =
6368 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006369 ASSERT_VK_SUCCESS(err);
6370
Karl Schultz6addd812016-02-02 17:17:23 -07006371 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6372 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006373
Karl Schultz6addd812016-02-02 17:17:23 -07006374 err =
6375 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006376 ASSERT_VK_SUCCESS(err);
6377
6378 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006379 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006380 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6381 memAlloc.pNext = NULL;
6382 memAlloc.allocationSize = 0;
6383 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006384
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006385 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006386 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006387 pass =
6388 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006389 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006390 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006391 ASSERT_VK_SUCCESS(err);
6392
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006393 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006394 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006395 pass =
6396 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006397 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006398 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006399 ASSERT_VK_SUCCESS(err);
6400
6401 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6402 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006403 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006404 ASSERT_VK_SUCCESS(err);
6405
6406 BeginCommandBuffer();
6407 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006408 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006409 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006410 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006411 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006412 copyRegion.srcOffset.x = 0;
6413 copyRegion.srcOffset.y = 0;
6414 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006415 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006416 copyRegion.dstSubresource.mipLevel = 0;
6417 copyRegion.dstSubresource.baseArrayLayer = 0;
6418 copyRegion.dstSubresource.layerCount = 0;
6419 copyRegion.dstOffset.x = 0;
6420 copyRegion.dstOffset.y = 0;
6421 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006422 copyRegion.extent.width = 1;
6423 copyRegion.extent.height = 1;
6424 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006425 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6426 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006427 EndCommandBuffer();
6428
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006429 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006430 FAIL() << "Did not receive Error 'vkCmdCopyImage called with unmatched "
6431 "source and dest image types'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006432 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006433 }
6434
Chia-I Wuf7458c52015-10-26 21:10:41 +08006435 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006436 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006437 vkFreeMemory(m_device->device(), srcMem, NULL);
6438 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006439}
6440
Karl Schultz6addd812016-02-02 17:17:23 -07006441TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
6442 // TODO : Create two images with different format sizes and vkCmdCopyImage
6443 // between them
Mike Stroyana3082432015-09-25 13:39:21 -06006444}
6445
Karl Schultz6addd812016-02-02 17:17:23 -07006446TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
6447 VkResult err;
6448 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006449
Karl Schultz6addd812016-02-02 17:17:23 -07006450 m_errorMonitor->SetDesiredFailureMsg(
6451 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006452 "vkCmdCopyImage called with unmatched source and dest image types");
6453
Mike Stroyana3082432015-09-25 13:39:21 -06006454 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006455
6456 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006457 VkImage srcImage;
6458 VkImage dstImage;
6459 VkDeviceMemory srcMem;
6460 VkDeviceMemory destMem;
6461 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006462
6463 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006464 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6465 image_create_info.pNext = NULL;
6466 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6467 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6468 image_create_info.extent.width = 32;
6469 image_create_info.extent.height = 32;
6470 image_create_info.extent.depth = 1;
6471 image_create_info.mipLevels = 1;
6472 image_create_info.arrayLayers = 1;
6473 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6474 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
6475 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6476 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006477
Karl Schultz6addd812016-02-02 17:17:23 -07006478 err =
6479 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006480 ASSERT_VK_SUCCESS(err);
6481
Karl Schultz6addd812016-02-02 17:17:23 -07006482 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6483 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6484 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006485
Karl Schultz6addd812016-02-02 17:17:23 -07006486 err =
6487 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006488 ASSERT_VK_SUCCESS(err);
6489
6490 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006491 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006492 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6493 memAlloc.pNext = NULL;
6494 memAlloc.allocationSize = 0;
6495 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006496
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006497 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006498 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006499 pass =
6500 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006501 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006502 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006503 ASSERT_VK_SUCCESS(err);
6504
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006505 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006506 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006507 pass =
6508 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006509 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006510 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006511 ASSERT_VK_SUCCESS(err);
6512
6513 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6514 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006515 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006516 ASSERT_VK_SUCCESS(err);
6517
6518 BeginCommandBuffer();
6519 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006520 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006521 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006522 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006523 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006524 copyRegion.srcOffset.x = 0;
6525 copyRegion.srcOffset.y = 0;
6526 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006527 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006528 copyRegion.dstSubresource.mipLevel = 0;
6529 copyRegion.dstSubresource.baseArrayLayer = 0;
6530 copyRegion.dstSubresource.layerCount = 0;
6531 copyRegion.dstOffset.x = 0;
6532 copyRegion.dstOffset.y = 0;
6533 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006534 copyRegion.extent.width = 1;
6535 copyRegion.extent.height = 1;
6536 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006537 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6538 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006539 EndCommandBuffer();
6540
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006541 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006542 FAIL() << "Did not receive Error 'vkCmdCopyImage called with unmatched "
6543 "source and dest image types'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006544 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006545 }
6546
Chia-I Wuf7458c52015-10-26 21:10:41 +08006547 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006548 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006549 vkFreeMemory(m_device->device(), srcMem, NULL);
6550 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006551}
6552
Karl Schultz6addd812016-02-02 17:17:23 -07006553TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
6554 VkResult err;
6555 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006556
Karl Schultz6addd812016-02-02 17:17:23 -07006557 m_errorMonitor->SetDesiredFailureMsg(
6558 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006559 "vkCmdResolveImage called with source sample count less than 2.");
6560
Mike Stroyana3082432015-09-25 13:39:21 -06006561 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006562
6563 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07006564 VkImage srcImage;
6565 VkImage dstImage;
6566 VkDeviceMemory srcMem;
6567 VkDeviceMemory destMem;
6568 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006569
6570 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006571 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6572 image_create_info.pNext = NULL;
6573 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6574 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6575 image_create_info.extent.width = 32;
6576 image_create_info.extent.height = 1;
6577 image_create_info.extent.depth = 1;
6578 image_create_info.mipLevels = 1;
6579 image_create_info.arrayLayers = 1;
6580 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6581 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6582 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
6583 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006584
Karl Schultz6addd812016-02-02 17:17:23 -07006585 err =
6586 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006587 ASSERT_VK_SUCCESS(err);
6588
Karl Schultz6addd812016-02-02 17:17:23 -07006589 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6590 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006591
Karl Schultz6addd812016-02-02 17:17:23 -07006592 err =
6593 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006594 ASSERT_VK_SUCCESS(err);
6595
6596 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006597 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006598 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6599 memAlloc.pNext = NULL;
6600 memAlloc.allocationSize = 0;
6601 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006602
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006603 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006604 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006605 pass =
6606 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006607 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006608 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006609 ASSERT_VK_SUCCESS(err);
6610
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006611 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006612 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006613 pass =
6614 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006615 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006616 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006617 ASSERT_VK_SUCCESS(err);
6618
6619 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6620 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006621 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006622 ASSERT_VK_SUCCESS(err);
6623
6624 BeginCommandBuffer();
6625 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006626 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6627 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006628 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006629 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006630 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006631 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006632 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006633 resolveRegion.srcOffset.x = 0;
6634 resolveRegion.srcOffset.y = 0;
6635 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006636 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006637 resolveRegion.dstSubresource.mipLevel = 0;
6638 resolveRegion.dstSubresource.baseArrayLayer = 0;
6639 resolveRegion.dstSubresource.layerCount = 0;
6640 resolveRegion.dstOffset.x = 0;
6641 resolveRegion.dstOffset.y = 0;
6642 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006643 resolveRegion.extent.width = 1;
6644 resolveRegion.extent.height = 1;
6645 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006646 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6647 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006648 EndCommandBuffer();
6649
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006650 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006651 FAIL() << "Did not receive Error 'vkCmdResolveImage called with source "
6652 "sample count less than 2.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006653 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006654 }
6655
Chia-I Wuf7458c52015-10-26 21:10:41 +08006656 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006657 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006658 vkFreeMemory(m_device->device(), srcMem, NULL);
6659 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006660}
6661
Karl Schultz6addd812016-02-02 17:17:23 -07006662TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
6663 VkResult err;
6664 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006665
Karl Schultz6addd812016-02-02 17:17:23 -07006666 m_errorMonitor->SetDesiredFailureMsg(
6667 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006668 "vkCmdResolveImage called with dest sample count greater than 1.");
6669
Mike Stroyana3082432015-09-25 13:39:21 -06006670 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006671
6672 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07006673 VkImage srcImage;
6674 VkImage dstImage;
6675 VkDeviceMemory srcMem;
6676 VkDeviceMemory destMem;
6677 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006678
6679 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006680 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6681 image_create_info.pNext = NULL;
6682 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6683 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6684 image_create_info.extent.width = 32;
6685 image_create_info.extent.height = 1;
6686 image_create_info.extent.depth = 1;
6687 image_create_info.mipLevels = 1;
6688 image_create_info.arrayLayers = 1;
6689 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6690 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6691 // Note: Some implementations expect color attachment usage for any
6692 // multisample surface
6693 image_create_info.usage =
6694 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6695 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006696
Karl Schultz6addd812016-02-02 17:17:23 -07006697 err =
6698 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006699 ASSERT_VK_SUCCESS(err);
6700
Karl Schultz6addd812016-02-02 17:17:23 -07006701 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6702 // Note: Some implementations expect color attachment usage for any
6703 // multisample surface
6704 image_create_info.usage =
6705 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006706
Karl Schultz6addd812016-02-02 17:17:23 -07006707 err =
6708 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006709 ASSERT_VK_SUCCESS(err);
6710
6711 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006712 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006713 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6714 memAlloc.pNext = NULL;
6715 memAlloc.allocationSize = 0;
6716 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006717
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006718 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006719 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006720 pass =
6721 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006722 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006723 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006724 ASSERT_VK_SUCCESS(err);
6725
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006726 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006727 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006728 pass =
6729 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006730 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006731 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006732 ASSERT_VK_SUCCESS(err);
6733
6734 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6735 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006736 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006737 ASSERT_VK_SUCCESS(err);
6738
6739 BeginCommandBuffer();
6740 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006741 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6742 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006743 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006744 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006745 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006746 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006747 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006748 resolveRegion.srcOffset.x = 0;
6749 resolveRegion.srcOffset.y = 0;
6750 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006751 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006752 resolveRegion.dstSubresource.mipLevel = 0;
6753 resolveRegion.dstSubresource.baseArrayLayer = 0;
6754 resolveRegion.dstSubresource.layerCount = 0;
6755 resolveRegion.dstOffset.x = 0;
6756 resolveRegion.dstOffset.y = 0;
6757 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006758 resolveRegion.extent.width = 1;
6759 resolveRegion.extent.height = 1;
6760 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006761 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6762 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006763 EndCommandBuffer();
6764
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006765 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006766 FAIL() << "Did not receive Error 'vkCmdResolveImage called with dest "
6767 "sample count greater than 1.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006768 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006769 }
6770
Chia-I Wuf7458c52015-10-26 21:10:41 +08006771 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006772 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006773 vkFreeMemory(m_device->device(), srcMem, NULL);
6774 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006775}
6776
Karl Schultz6addd812016-02-02 17:17:23 -07006777TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
6778 VkResult err;
6779 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006780
Karl Schultz6addd812016-02-02 17:17:23 -07006781 m_errorMonitor->SetDesiredFailureMsg(
6782 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006783 "vkCmdResolveImage called with unmatched source and dest formats.");
6784
Mike Stroyana3082432015-09-25 13:39:21 -06006785 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006786
6787 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006788 VkImage srcImage;
6789 VkImage dstImage;
6790 VkDeviceMemory srcMem;
6791 VkDeviceMemory destMem;
6792 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006793
6794 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006795 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6796 image_create_info.pNext = NULL;
6797 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6798 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6799 image_create_info.extent.width = 32;
6800 image_create_info.extent.height = 1;
6801 image_create_info.extent.depth = 1;
6802 image_create_info.mipLevels = 1;
6803 image_create_info.arrayLayers = 1;
6804 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6805 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6806 // Note: Some implementations expect color attachment usage for any
6807 // multisample surface
6808 image_create_info.usage =
6809 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6810 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006811
Karl Schultz6addd812016-02-02 17:17:23 -07006812 err =
6813 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006814 ASSERT_VK_SUCCESS(err);
6815
Karl Schultz6addd812016-02-02 17:17:23 -07006816 // Set format to something other than source image
6817 image_create_info.format = VK_FORMAT_R32_SFLOAT;
6818 // Note: Some implementations expect color attachment usage for any
6819 // multisample surface
6820 image_create_info.usage =
6821 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6822 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006823
Karl Schultz6addd812016-02-02 17:17:23 -07006824 err =
6825 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006826 ASSERT_VK_SUCCESS(err);
6827
6828 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006829 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006830 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6831 memAlloc.pNext = NULL;
6832 memAlloc.allocationSize = 0;
6833 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006834
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006835 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006836 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006837 pass =
6838 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006839 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006840 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006841 ASSERT_VK_SUCCESS(err);
6842
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006843 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006844 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006845 pass =
6846 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006847 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006848 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006849 ASSERT_VK_SUCCESS(err);
6850
6851 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6852 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006853 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006854 ASSERT_VK_SUCCESS(err);
6855
6856 BeginCommandBuffer();
6857 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006858 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6859 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006860 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006861 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006862 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006863 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006864 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006865 resolveRegion.srcOffset.x = 0;
6866 resolveRegion.srcOffset.y = 0;
6867 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006868 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006869 resolveRegion.dstSubresource.mipLevel = 0;
6870 resolveRegion.dstSubresource.baseArrayLayer = 0;
6871 resolveRegion.dstSubresource.layerCount = 0;
6872 resolveRegion.dstOffset.x = 0;
6873 resolveRegion.dstOffset.y = 0;
6874 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006875 resolveRegion.extent.width = 1;
6876 resolveRegion.extent.height = 1;
6877 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006878 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6879 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006880 EndCommandBuffer();
6881
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006882 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006883 FAIL() << "Did not receive Error 'vkCmdResolveImage called with "
6884 "unmatched source and dest formats.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006885 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06006886 }
6887
Chia-I Wuf7458c52015-10-26 21:10:41 +08006888 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006889 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08006890 vkFreeMemory(m_device->device(), srcMem, NULL);
6891 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06006892}
6893
Karl Schultz6addd812016-02-02 17:17:23 -07006894TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
6895 VkResult err;
6896 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06006897
Karl Schultz6addd812016-02-02 17:17:23 -07006898 m_errorMonitor->SetDesiredFailureMsg(
6899 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006900 "vkCmdResolveImage called with unmatched source and dest image types.");
6901
Mike Stroyana3082432015-09-25 13:39:21 -06006902 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06006903
6904 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07006905 VkImage srcImage;
6906 VkImage dstImage;
6907 VkDeviceMemory srcMem;
6908 VkDeviceMemory destMem;
6909 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06006910
6911 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006912 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6913 image_create_info.pNext = NULL;
6914 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6915 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
6916 image_create_info.extent.width = 32;
6917 image_create_info.extent.height = 1;
6918 image_create_info.extent.depth = 1;
6919 image_create_info.mipLevels = 1;
6920 image_create_info.arrayLayers = 1;
6921 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
6922 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6923 // Note: Some implementations expect color attachment usage for any
6924 // multisample surface
6925 image_create_info.usage =
6926 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6927 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006928
Karl Schultz6addd812016-02-02 17:17:23 -07006929 err =
6930 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006931 ASSERT_VK_SUCCESS(err);
6932
Karl Schultz6addd812016-02-02 17:17:23 -07006933 image_create_info.imageType = VK_IMAGE_TYPE_1D;
6934 // Note: Some implementations expect color attachment usage for any
6935 // multisample surface
6936 image_create_info.usage =
6937 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6938 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006939
Karl Schultz6addd812016-02-02 17:17:23 -07006940 err =
6941 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06006942 ASSERT_VK_SUCCESS(err);
6943
6944 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006945 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006946 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6947 memAlloc.pNext = NULL;
6948 memAlloc.allocationSize = 0;
6949 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006950
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06006951 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006952 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006953 pass =
6954 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006955 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006956 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006957 ASSERT_VK_SUCCESS(err);
6958
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006959 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06006960 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07006961 pass =
6962 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06006963 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006964 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06006965 ASSERT_VK_SUCCESS(err);
6966
6967 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
6968 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006969 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06006970 ASSERT_VK_SUCCESS(err);
6971
6972 BeginCommandBuffer();
6973 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07006974 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
6975 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06006976 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006977 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06006978 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06006979 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006980 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006981 resolveRegion.srcOffset.x = 0;
6982 resolveRegion.srcOffset.y = 0;
6983 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08006984 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006985 resolveRegion.dstSubresource.mipLevel = 0;
6986 resolveRegion.dstSubresource.baseArrayLayer = 0;
6987 resolveRegion.dstSubresource.layerCount = 0;
6988 resolveRegion.dstOffset.x = 0;
6989 resolveRegion.dstOffset.y = 0;
6990 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06006991 resolveRegion.extent.width = 1;
6992 resolveRegion.extent.height = 1;
6993 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07006994 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
6995 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06006996 EndCommandBuffer();
6997
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006998 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07006999 FAIL() << "Did not receive Error 'vkCmdResolveImage called with "
7000 "unmatched source and dest image types.'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007001 m_errorMonitor->DumpFailureMsgs();
Mike Stroyana3082432015-09-25 13:39:21 -06007002 }
7003
Chia-I Wuf7458c52015-10-26 21:10:41 +08007004 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007005 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007006 vkFreeMemory(m_device->device(), srcMem, NULL);
7007 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007008}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007009
Karl Schultz6addd812016-02-02 17:17:23 -07007010TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007011 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07007012 // to using a DS format, then cause it to hit error due to COLOR_BIT not
7013 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007014 // The image format check comes 2nd in validation so we trigger it first,
7015 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07007016 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007017
Karl Schultz6addd812016-02-02 17:17:23 -07007018 m_errorMonitor->SetDesiredFailureMsg(
7019 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007020 "Combination depth/stencil image formats can have only the ");
7021
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007022 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007023
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007024 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007025 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7026 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007027
7028 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007029 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7030 ds_pool_ci.pNext = NULL;
7031 ds_pool_ci.maxSets = 1;
7032 ds_pool_ci.poolSizeCount = 1;
7033 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007034
7035 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007036 err =
7037 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007038 ASSERT_VK_SUCCESS(err);
7039
7040 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007041 dsl_binding.binding = 0;
7042 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7043 dsl_binding.descriptorCount = 1;
7044 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7045 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007046
7047 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007048 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7049 ds_layout_ci.pNext = NULL;
7050 ds_layout_ci.bindingCount = 1;
7051 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007052 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007053 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7054 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007055 ASSERT_VK_SUCCESS(err);
7056
7057 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007058 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007059 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007060 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007061 alloc_info.descriptorPool = ds_pool;
7062 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007063 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7064 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007065 ASSERT_VK_SUCCESS(err);
7066
Karl Schultz6addd812016-02-02 17:17:23 -07007067 VkImage image_bad;
7068 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007069 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07007070 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007071 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07007072 const int32_t tex_width = 32;
7073 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007074
7075 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007076 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7077 image_create_info.pNext = NULL;
7078 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7079 image_create_info.format = tex_format_bad;
7080 image_create_info.extent.width = tex_width;
7081 image_create_info.extent.height = tex_height;
7082 image_create_info.extent.depth = 1;
7083 image_create_info.mipLevels = 1;
7084 image_create_info.arrayLayers = 1;
7085 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7086 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7087 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
7088 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
7089 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007090
Karl Schultz6addd812016-02-02 17:17:23 -07007091 err =
7092 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007093 ASSERT_VK_SUCCESS(err);
7094 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07007095 image_create_info.usage =
7096 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7097 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
7098 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007099 ASSERT_VK_SUCCESS(err);
7100
7101 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007102 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7103 image_view_create_info.image = image_bad;
7104 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7105 image_view_create_info.format = tex_format_bad;
7106 image_view_create_info.subresourceRange.baseArrayLayer = 0;
7107 image_view_create_info.subresourceRange.baseMipLevel = 0;
7108 image_view_create_info.subresourceRange.layerCount = 1;
7109 image_view_create_info.subresourceRange.levelCount = 1;
7110 image_view_create_info.subresourceRange.aspectMask =
7111 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007112
7113 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007114 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7115 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007116
7117 if (!m_errorMonitor->DesiredMsgFound()) {
Karl Schultz6addd812016-02-02 17:17:23 -07007118 FAIL() << "Did not receive Error 'Combination depth-stencil image "
7119 "formats can have only the....'";
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007120 m_errorMonitor->DumpFailureMsgs();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007121 }
7122
Chia-I Wuf7458c52015-10-26 21:10:41 +08007123 vkDestroyImage(m_device->device(), image_bad, NULL);
7124 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007125 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7126 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007127}
Tobin Ehliscde08892015-09-22 10:11:37 -06007128#endif // IMAGE_TESTS
7129
Tony Barbour300a6082015-04-07 13:44:53 -06007130int main(int argc, char **argv) {
7131 int result;
7132
Cody Northrop8e54a402016-03-08 22:25:52 -07007133#ifdef ANDROID
7134 int vulkanSupport = InitVulkan();
7135 if (vulkanSupport == 0)
7136 return 1;
7137#endif
7138
Tony Barbour300a6082015-04-07 13:44:53 -06007139 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06007140 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06007141
7142 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
7143
7144 result = RUN_ALL_TESTS();
7145
Tony Barbour6918cd52015-04-09 12:58:51 -06007146 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06007147 return result;
7148}