blob: f98b068b6451e0c86995e2d60c2b25eeb133847b [file] [log] [blame]
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001#include <vulkan.h>
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002#include "vk_debug_report_lunarg.h"
Courtney Goeltzenleuchter0abdb662015-10-07 13:28:58 -06003#include "test_common.h"
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06004#include "vkrenderframework.h"
Tobin Ehlis56d204a2015-07-03 10:15:26 -06005#include "vk_layer_config.h"
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06006#include "../icd/common/icd-spv.h"
Tony Barbour30486ea2015-04-07 13:44:53 -06007
Mark Lobodzinski5f25be42015-05-14 15:08:13 -05008#define GLM_FORCE_RADIANS
9#include "glm/glm.hpp"
10#include <glm/gtc/matrix_transform.hpp>
11
Tobin Ehlis57e6a612015-05-26 16:11:58 -060012#define MEM_TRACKER_TESTS 1
13#define OBJ_TRACKER_TESTS 1
14#define DRAW_STATE_TESTS 1
15#define THREADING_TESTS 1
Chris Forbes5af3bf22015-05-25 11:13:08 +120016#define SHADER_CHECKER_TESTS 1
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -060017#define DEVICE_LIMITS_TESTS 1
Tobin Ehlis342b9bf2015-09-22 10:11:37 -060018#define IMAGE_TESTS 1
Tobin Ehlis57e6a612015-05-26 16:11:58 -060019
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050020//--------------------------------------------------------------------------------------
21// Mesh and VertexFormat Data
22//--------------------------------------------------------------------------------------
23struct Vertex
24{
25 float posX, posY, posZ, posW; // Position data
26 float r, g, b, a; // Color
27};
28
29#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
30
31typedef enum _BsoFailSelect {
32 BsoFailNone = 0x00000000,
Cody Northrope4bc6942015-08-26 10:01:32 -060033 BsoFailLineWidth = 0x00000001,
34 BsoFailDepthBias = 0x00000002,
Cody Northropf5bd2252015-08-17 11:10:49 -060035 BsoFailViewport = 0x00000004,
Tobin Ehlisf6cb4672015-09-29 08:18:34 -060036 BsoFailScissor = 0x00000008,
37 BsoFailBlend = 0x00000010,
38 BsoFailDepthBounds = 0x00000020,
39 BsoFailStencilReadMask = 0x00000040,
40 BsoFailStencilWriteMask = 0x00000080,
41 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050042} BsoFailSelect;
43
44struct vktriangle_vs_uniform {
45 // Must start with MVP
46 float mvp[4][4];
47 float position[3][4];
48 float color[3][4];
49};
50
Mark Lobodzinski6bbdff12015-06-02 09:41:30 -050051static const char bindStateVertShaderText[] =
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050052 "#version 130\n"
53 "vec2 vertices[3];\n"
54 "void main() {\n"
55 " vertices[0] = vec2(-1.0, -1.0);\n"
56 " vertices[1] = vec2( 1.0, -1.0);\n"
57 " vertices[2] = vec2( 0.0, 1.0);\n"
58 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
59 "}\n";
60
Mark Lobodzinski6bbdff12015-06-02 09:41:30 -050061static const char bindStateFragShaderText[] =
Cody Northrop74a2d2c2015-06-16 17:32:04 -060062 "#version 140\n"
63 "#extension GL_ARB_separate_shader_objects: require\n"
64 "#extension GL_ARB_shading_language_420pack: require\n"
65 "\n"
66 "layout(location = 0) out vec4 uFragColor;\n"
67 "void main(){\n"
68 " uFragColor = vec4(0,1,0,1);\n"
69 "}\n";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050070
Courtney Goeltzenleuchter0d6857f2015-09-04 13:52:24 -060071static VkBool32 myDbgFunc(
Tony Barboure84a8d62015-07-10 14:10:27 -060072 VkFlags msgFlags,
73 VkDbgObjectType objType,
74 uint64_t srcObject,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060075 size_t location,
76 int32_t msgCode,
77 const char* pLayerPrefix,
78 const char* pMsg,
79 void* pUserData);
Tony Barbour30486ea2015-04-07 13:44:53 -060080
81class ErrorMonitor {
82public:
Tony Barbour0c1bdc62015-04-29 17:34:29 -060083 ErrorMonitor()
Tony Barbour30486ea2015-04-07 13:44:53 -060084 {
Mike Stroyan7016f4f2015-07-13 14:45:35 -060085 test_platform_thread_create_mutex(&m_mutex);
86 test_platform_thread_lock_mutex(&m_mutex);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060087 m_msgFlags = VK_DBG_REPORT_INFO_BIT;
Mike Stroyan09aae812015-05-12 16:00:45 -060088 m_bailout = NULL;
Mike Stroyan7016f4f2015-07-13 14:45:35 -060089 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour30486ea2015-04-07 13:44:53 -060090 }
91 void ClearState()
92 {
Mike Stroyan7016f4f2015-07-13 14:45:35 -060093 test_platform_thread_lock_mutex(&m_mutex);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060094 m_msgFlags = VK_DBG_REPORT_INFO_BIT;
Tony Barbour30486ea2015-04-07 13:44:53 -060095 m_msgString.clear();
Mike Stroyan7016f4f2015-07-13 14:45:35 -060096 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour30486ea2015-04-07 13:44:53 -060097 }
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060098 VkFlags GetState(std::string *msgString)
Tony Barbour30486ea2015-04-07 13:44:53 -060099 {
Mike Stroyan7016f4f2015-07-13 14:45:35 -0600100 test_platform_thread_lock_mutex(&m_mutex);
Tony Barbour30486ea2015-04-07 13:44:53 -0600101 *msgString = m_msgString;
Mike Stroyan7016f4f2015-07-13 14:45:35 -0600102 test_platform_thread_unlock_mutex(&m_mutex);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600103 return m_msgFlags;
Tony Barbour30486ea2015-04-07 13:44:53 -0600104 }
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600105 void SetState(VkFlags msgFlags, const char *msgString)
Tony Barbour30486ea2015-04-07 13:44:53 -0600106 {
Mike Stroyan7016f4f2015-07-13 14:45:35 -0600107 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyan09aae812015-05-12 16:00:45 -0600108 if (m_bailout != NULL) {
109 *m_bailout = true;
110 }
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600111 m_msgFlags = msgFlags;
Tony Barbour8508b8e2015-04-09 10:48:04 -0600112 m_msgString.reserve(strlen(msgString));
113 m_msgString = msgString;
Mike Stroyan7016f4f2015-07-13 14:45:35 -0600114 test_platform_thread_unlock_mutex(&m_mutex);
Mike Stroyan09aae812015-05-12 16:00:45 -0600115 }
116 void SetBailout(bool *bailout)
117 {
118 m_bailout = bailout;
Tony Barbour30486ea2015-04-07 13:44:53 -0600119 }
120
121private:
Mike Stroyan7016f4f2015-07-13 14:45:35 -0600122 VkFlags m_msgFlags;
123 std::string m_msgString;
124 test_platform_thread_mutex m_mutex;
125 bool* m_bailout;
Tony Barbour30486ea2015-04-07 13:44:53 -0600126};
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500127
Courtney Goeltzenleuchter0d6857f2015-09-04 13:52:24 -0600128static VkBool32 myDbgFunc(
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600129 VkFlags msgFlags,
Tony Barboure84a8d62015-07-10 14:10:27 -0600130 VkDbgObjectType objType,
131 uint64_t srcObject,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600132 size_t location,
133 int32_t msgCode,
134 const char* pLayerPrefix,
135 const char* pMsg,
136 void* pUserData)
Tony Barbour30486ea2015-04-07 13:44:53 -0600137{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600138 if (msgFlags & (VK_DBG_REPORT_WARN_BIT | VK_DBG_REPORT_ERROR_BIT)) {
Tony Barbour8508b8e2015-04-09 10:48:04 -0600139 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600140 errMonitor->SetState(msgFlags, pMsg);
Courtney Goeltzenleuchter0d6857f2015-09-04 13:52:24 -0600141 return true;
Tony Barbour8508b8e2015-04-09 10:48:04 -0600142 }
Courtney Goeltzenleuchter0d6857f2015-09-04 13:52:24 -0600143
144 return false;
Tony Barbour30486ea2015-04-07 13:44:53 -0600145}
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500146
Tony Barbour01999182015-04-09 12:58:51 -0600147class VkLayerTest : public VkRenderFramework
Tony Barbour30486ea2015-04-07 13:44:53 -0600148{
149public:
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600150 VkResult BeginCommandBuffer(VkCommandBufferObj &cmdBuffer);
151 VkResult EndCommandBuffer(VkCommandBufferObj &cmdBuffer);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500152 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
153 void GenericDrawPreparation(VkCommandBufferObj *cmdBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask);
Tony Barbour1490c912015-07-28 10:17:20 -0600154 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask)
155 { GenericDrawPreparation(m_cmdBuffer, pipelineobj, descriptorSet, failMask); }
Tony Barbour30486ea2015-04-07 13:44:53 -0600156
Tony Barbour1490c912015-07-28 10:17:20 -0600157 /* Convenience functions that use built-in command buffer */
158 VkResult BeginCommandBuffer() { return BeginCommandBuffer(*m_cmdBuffer); }
159 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_cmdBuffer); }
Courtney Goeltzenleuchter4ff11cc2015-09-23 12:31:50 -0600160 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance)
161 { m_cmdBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance); }
162 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance)
163 { m_cmdBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance); }
Tony Barbour1490c912015-07-28 10:17:20 -0600164 void QueueCommandBuffer() { m_cmdBuffer->QueueCommandBuffer(); }
165 void QueueCommandBuffer(const VkFence& fence) { m_cmdBuffer->QueueCommandBuffer(fence); }
166 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding)
167 { m_cmdBuffer->BindVertexBuffer(vertexBuffer, offset, binding); }
168 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset)
169 { m_cmdBuffer->BindIndexBuffer(indexBuffer, offset); }
Tony Barbour30486ea2015-04-07 13:44:53 -0600170protected:
Tony Barbour01999182015-04-09 12:58:51 -0600171 ErrorMonitor *m_errorMonitor;
Tony Barbour30486ea2015-04-07 13:44:53 -0600172
173 virtual void SetUp() {
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600174 std::vector<const char *> instance_layer_names;
175 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600176 std::vector<const char *> instance_extension_names;
177 std::vector<const char *> device_extension_names;
Tony Barbour950ebc02015-04-23 12:55:36 -0600178
Courtney Goeltzenleuchter846298c2015-07-30 11:32:46 -0600179 instance_extension_names.push_back(VK_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterde53c5b2015-06-16 15:59:11 -0600180 /*
181 * Since CreateDbgMsgCallback is an instance level extension call
182 * any extension / layer that utilizes that feature also needs
183 * to be enabled at create instance time.
184 */
Mike Stroyan2237f522015-08-18 14:40:24 -0600185 // Use Threading layer first to protect others from ThreadCmdBufferCollision test
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600186 instance_layer_names.push_back("Threading");
187 instance_layer_names.push_back("ObjectTracker");
188 instance_layer_names.push_back("MemTracker");
189 instance_layer_names.push_back("DrawState");
190 instance_layer_names.push_back("ShaderChecker");
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -0600191 instance_layer_names.push_back("DeviceLimits");
Tobin Ehlis342b9bf2015-09-22 10:11:37 -0600192 instance_layer_names.push_back("Image");
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600193
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600194 device_layer_names.push_back("Threading");
195 device_layer_names.push_back("ObjectTracker");
196 device_layer_names.push_back("MemTracker");
197 device_layer_names.push_back("DrawState");
198 device_layer_names.push_back("ShaderChecker");
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -0600199 device_layer_names.push_back("DeviceLimits");
Tobin Ehlis342b9bf2015-09-22 10:11:37 -0600200 device_layer_names.push_back("Image");
Tony Barbour30486ea2015-04-07 13:44:53 -0600201
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600202 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour30486ea2015-04-07 13:44:53 -0600203 this->app_info.pNext = NULL;
204 this->app_info.pAppName = "layer_tests";
205 this->app_info.appVersion = 1;
206 this->app_info.pEngineName = "unittest";
207 this->app_info.engineVersion = 1;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600208 this->app_info.apiVersion = VK_API_VERSION;
Tony Barbour30486ea2015-04-07 13:44:53 -0600209
Tony Barbour0c1bdc62015-04-29 17:34:29 -0600210 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600211 InitFramework(instance_layer_names, device_layer_names,
212 instance_extension_names, device_extension_names,
213 myDbgFunc, m_errorMonitor);
Tony Barbour30486ea2015-04-07 13:44:53 -0600214 }
215
216 virtual void TearDown() {
217 // Clean up resources before we reset
Tony Barbour30486ea2015-04-07 13:44:53 -0600218 ShutdownFramework();
Tony Barbour8508b8e2015-04-09 10:48:04 -0600219 delete m_errorMonitor;
Tony Barbour30486ea2015-04-07 13:44:53 -0600220 }
221};
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500222
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600223VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour30486ea2015-04-07 13:44:53 -0600224{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600225 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600226
227 result = cmdBuffer.BeginCommandBuffer();
228
229 /*
230 * For render test all drawing happens in a single render pass
231 * on a single command buffer.
232 */
Chris Forbesfe133ef2015-06-16 14:05:59 +1200233 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wuc278df82015-07-07 11:50:03 +0800234 cmdBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour30486ea2015-04-07 13:44:53 -0600235 }
236
237 return result;
238}
239
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600240VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour30486ea2015-04-07 13:44:53 -0600241{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600242 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600243
Chris Forbesfe133ef2015-06-16 14:05:59 +1200244 if (renderPass()) {
Chia-I Wu88eaa3b2015-06-26 15:34:39 +0800245 cmdBuffer.EndRenderPass();
Chris Forbesfe133ef2015-06-16 14:05:59 +1200246 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600247
248 result = cmdBuffer.EndCommandBuffer();
249
250 return result;
251}
252
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500253void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask)
254{
255 // Create identity matrix
256 int i;
257 struct vktriangle_vs_uniform data;
258
259 glm::mat4 Projection = glm::mat4(1.0f);
260 glm::mat4 View = glm::mat4(1.0f);
261 glm::mat4 Model = glm::mat4(1.0f);
262 glm::mat4 MVP = Projection * View * Model;
263 const int matrixSize = sizeof(MVP);
264 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
265
266 memcpy(&data.mvp, &MVP[0][0], matrixSize);
267
268 static const Vertex tri_data[] =
269 {
270 { XYZ1( -1, -1, 0 ), XYZ1( 1.f, 0.f, 0.f ) },
271 { XYZ1( 1, -1, 0 ), XYZ1( 0.f, 1.f, 0.f ) },
272 { XYZ1( 0, 1, 0 ), XYZ1( 0.f, 0.f, 1.f ) },
273 };
274
275 for (i=0; i<3; i++) {
276 data.position[i][0] = tri_data[i].posX;
277 data.position[i][1] = tri_data[i].posY;
278 data.position[i][2] = tri_data[i].posZ;
279 data.position[i][3] = tri_data[i].posW;
280 data.color[i][0] = tri_data[i].r;
281 data.color[i][1] = tri_data[i].g;
282 data.color[i][2] = tri_data[i].b;
283 data.color[i][3] = tri_data[i].a;
284 }
285
286 ASSERT_NO_FATAL_FAILURE(InitState());
287 ASSERT_NO_FATAL_FAILURE(InitViewport());
288
289 VkConstantBufferObj constantBuffer(m_device, bufSize*2, sizeof(float), (const void*) &data);
290
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -0600291 VkShaderObj vs(m_device,vertShaderText,VK_SHADER_STAGE_VERTEX_BIT, this);
292 VkShaderObj ps(m_device,fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500293
294 VkPipelineObj pipelineobj(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +0800295 pipelineobj.AddColorAttachment();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500296 pipelineobj.AddShader(&vs);
297 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter2f5deb52015-09-30 16:16:57 -0600298 if (failMask & BsoFailLineWidth) {
299 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
300 }
301 if (failMask & BsoFailDepthBias) {
302 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
303 }
Tobin Ehlisa88e2f52015-10-02 11:00:56 -0600304 // Viewport and scissors must stay in synch or other errors will occur than the ones we want
Courtney Goeltzenleuchter2f5deb52015-09-30 16:16:57 -0600305 if (failMask & BsoFailViewport) {
306 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisa88e2f52015-10-02 11:00:56 -0600307 m_viewports.clear();
308 m_scissors.clear();
Courtney Goeltzenleuchter2f5deb52015-09-30 16:16:57 -0600309 }
310 if (failMask & BsoFailScissor) {
311 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisa88e2f52015-10-02 11:00:56 -0600312 m_scissors.clear();
313 m_viewports.clear();
Courtney Goeltzenleuchter2f5deb52015-09-30 16:16:57 -0600314 }
315 if (failMask & BsoFailBlend) {
316 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
317 }
318 if (failMask & BsoFailDepthBounds) {
319 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
320 }
321 if (failMask & BsoFailStencilReadMask) {
322 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
323 }
324 if (failMask & BsoFailStencilWriteMask) {
325 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
326 }
327 if (failMask & BsoFailStencilReference) {
328 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
329 }
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500330
331 VkDescriptorSetObj descriptorSet(m_device);
332 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
333
334 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour1490c912015-07-28 10:17:20 -0600335 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500336
Tony Barbour1490c912015-07-28 10:17:20 -0600337 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500338
339 // render triangle
Courtney Goeltzenleuchter4ff11cc2015-09-23 12:31:50 -0600340 Draw(3, 1, 0, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500341
342 // finalize recording of the command buffer
Tony Barbour1490c912015-07-28 10:17:20 -0600343 EndCommandBuffer();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500344
Tony Barbour1490c912015-07-28 10:17:20 -0600345 QueueCommandBuffer();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500346}
347
348void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *cmdBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask)
349{
350 if (m_depthStencil->Initialized()) {
351 cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
352 } else {
353 cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
354 }
355
356 cmdBuffer->PrepareAttachments();
Cody Northrop2605cb02015-08-18 15:21:16 -0600357 // Make sure depthWriteEnable is set so that Depth fail test will work correctly
358 // Make sure stencilTestEnable is set so that Stencil fail test will work correctly
Tony Barbourefbe9ca2015-07-15 12:50:33 -0600359 VkStencilOpState stencil = {};
360 stencil.stencilFailOp = VK_STENCIL_OP_KEEP;
Courtney Goeltzenleuchter2f5deb52015-09-30 16:16:57 -0600361 stencil.stencilPassOp = VK_STENCIL_OP_KEEP;
362 stencil.stencilDepthFailOp = VK_STENCIL_OP_KEEP;
363 stencil.stencilCompareOp = VK_COMPARE_OP_NEVER;
Tony Barbourefbe9ca2015-07-15 12:50:33 -0600364
365 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
366 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter2f5deb52015-09-30 16:16:57 -0600367 ds_ci.pNext = NULL;
368 ds_ci.depthTestEnable = VK_FALSE;
369 ds_ci.depthWriteEnable = VK_TRUE;
370 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
371 ds_ci.depthBoundsTestEnable = VK_FALSE;
372 ds_ci.stencilTestEnable = VK_TRUE;
373 ds_ci.front = stencil;
374 ds_ci.back = stencil;
Tony Barbourefbe9ca2015-07-15 12:50:33 -0600375
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600376 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisa88e2f52015-10-02 11:00:56 -0600377 pipelineobj.SetViewport(m_viewports);
378 pipelineobj.SetScissor(m_scissors);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500379 descriptorSet.CreateVKDescriptorSet(cmdBuffer);
Cody Northropccfa96d2015-08-27 10:20:35 -0600380 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
381 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500382 cmdBuffer->BindPipeline(pipelineobj);
383 cmdBuffer->BindDescriptorSet(descriptorSet);
384}
385
386// ********************************************************************************************************************
387// ********************************************************************************************************************
388// ********************************************************************************************************************
389// ********************************************************************************************************************
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600390#if MEM_TRACKER_TESTS
Mark Lobodzinski81078192015-05-19 10:28:29 -0500391TEST_F(VkLayerTest, CallResetCmdBufferBeforeCompletion)
392{
393 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600394 VkFlags msgFlags;
Mark Lobodzinski81078192015-05-19 10:28:29 -0500395 std::string msgString;
396
397 VkFenceCreateInfo fenceInfo = {};
398 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
399 fenceInfo.pNext = NULL;
400 fenceInfo.flags = 0;
401
402 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barboure389b882015-07-20 13:00:10 -0600403
404 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
405 vk_testing::Buffer buffer;
406 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinski81078192015-05-19 10:28:29 -0500407
Tony Barbour1490c912015-07-28 10:17:20 -0600408 BeginCommandBuffer();
409 m_cmdBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
410 EndCommandBuffer();
Mark Lobodzinski81078192015-05-19 10:28:29 -0500411
412 testFence.init(*m_device, fenceInfo);
413
414 // Bypass framework since it does the waits automatically
415 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter1a748e92015-10-27 11:22:14 -0600416 VkSubmitInfo submit_info;
417 submit_info.waitSemCount = 0;
418 submit_info.pWaitSemaphores = NULL;
419 submit_info.cmdBufferCount = 1;
420 submit_info.pCommandBuffers = &m_cmdBuffer->handle();
421 submit_info.signalSemCount = 0;
422 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600423
424 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinski81078192015-05-19 10:28:29 -0500425 ASSERT_VK_SUCCESS( err );
426
427 m_errorMonitor->ClearState();
428 // Introduce failure by calling begin again before checking fence
Tony Barbour1490c912015-07-28 10:17:20 -0600429 vkResetCommandBuffer(m_cmdBuffer->handle(), 0);
Mark Lobodzinski81078192015-05-19 10:28:29 -0500430
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600431 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -0600432 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an err after calling ResetCommandBuffer on an active Command Buffer";
Mark Lobodzinski81078192015-05-19 10:28:29 -0500433 if (!strstr(msgString.c_str(),"Resetting CB")) {
434 FAIL() << "Error received was not 'Resetting CB (0xaddress) before it has completed. You must check CB flag before'";
435 }
436}
437
438TEST_F(VkLayerTest, CallBeginCmdBufferBeforeCompletion)
439{
440 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600441 VkFlags msgFlags;
Mark Lobodzinski81078192015-05-19 10:28:29 -0500442 std::string msgString;
443
444 VkFenceCreateInfo fenceInfo = {};
445 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
446 fenceInfo.pNext = NULL;
447 fenceInfo.flags = 0;
448
449 ASSERT_NO_FATAL_FAILURE(InitState());
450 ASSERT_NO_FATAL_FAILURE(InitViewport());
451 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
452
Tony Barbour1490c912015-07-28 10:17:20 -0600453 BeginCommandBuffer();
454 m_cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
455 EndCommandBuffer();
Mark Lobodzinski81078192015-05-19 10:28:29 -0500456
457 testFence.init(*m_device, fenceInfo);
458
459 // Bypass framework since it does the waits automatically
460 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter1a748e92015-10-27 11:22:14 -0600461 VkSubmitInfo submit_info;
462 submit_info.waitSemCount = 0;
463 submit_info.pWaitSemaphores = NULL;
464 submit_info.cmdBufferCount = 1;
465 submit_info.pCommandBuffers = &m_cmdBuffer->handle();
466 submit_info.signalSemCount = 0;
467 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600468
469 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinski81078192015-05-19 10:28:29 -0500470 ASSERT_VK_SUCCESS( err );
471
472 m_errorMonitor->ClearState();
Mark Lobodzinski87db5012015-09-14 17:43:42 -0600473
474 VkCmdBufferBeginInfo info = {};
Courtney Goeltzenleuchtera32436b2015-10-21 18:11:04 -0600475 info.flags = VK_CMD_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Mark Lobodzinski87db5012015-09-14 17:43:42 -0600476 info.sType = VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO;
477 info.renderPass = VK_NULL_HANDLE;
478 info.subpass = 0;
479 info.framebuffer = VK_NULL_HANDLE;
480
481 // Introduce failure by calling BCB again before checking fence
482 vkBeginCommandBuffer(m_cmdBuffer->handle(), &info);
Mark Lobodzinski81078192015-05-19 10:28:29 -0500483
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600484 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -0600485 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an err after calling BeginCommandBuffer on an active Command Buffer";
Mark Lobodzinski81078192015-05-19 10:28:29 -0500486 if (!strstr(msgString.c_str(),"Calling vkBeginCommandBuffer() on active CB")) {
487 FAIL() << "Error received was not 'Calling vkBeginCommandBuffer() on an active CB (0xaddress) before it has completed'";
488 }
489}
490
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500491TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit)
492{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600493 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500494 std::string msgString;
495 VkResult err;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -0600496 bool pass;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500497
498 ASSERT_NO_FATAL_FAILURE(InitState());
499 m_errorMonitor->ClearState();
500
501 // Create an image, allocate memory, free it, and then try to bind it
502 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500503 VkDeviceMemory mem;
504 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500505
506 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
507 const int32_t tex_width = 32;
508 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500509
Tony Barbourefbe9ca2015-07-15 12:50:33 -0600510 VkImageCreateInfo image_create_info = {};
511 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
512 image_create_info.pNext = NULL;
513 image_create_info.imageType = VK_IMAGE_TYPE_2D;
514 image_create_info.format = tex_format;
515 image_create_info.extent.width = tex_width;
516 image_create_info.extent.height = tex_height;
517 image_create_info.extent.depth = 1;
518 image_create_info.mipLevels = 1;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -0600519 image_create_info.arrayLayers = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -0600520 image_create_info.samples = 1;
521 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
522 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
523 image_create_info.flags = 0;
Mark Lobodzinski87db5012015-09-14 17:43:42 -0600524
Tony Barbourefbe9ca2015-07-15 12:50:33 -0600525 VkMemoryAllocInfo mem_alloc = {};
526 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
527 mem_alloc.pNext = NULL;
528 mem_alloc.allocationSize = 0;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500529 // Introduce failure, do NOT set memProps to VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barbourefbe9ca2015-07-15 12:50:33 -0600530 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500531
532 err = vkCreateImage(m_device->device(), &image_create_info, &image);
533 ASSERT_VK_SUCCESS(err);
534
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -0600535 vkGetImageMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500536 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500537 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500538
Mark Lobodzinski23182612015-05-29 09:32:35 -0500539 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500540
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -0600541 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
542 if(!pass) { // If we can't find any unmappable memory this test doesn't make sense
Mike Stroyan2237f522015-08-18 14:40:24 -0600543 vkDestroyImage(m_device->device(), image);
Tony Barbour49a3b652015-08-04 16:13:01 -0600544 return;
Mike Stroyan2237f522015-08-18 14:40:24 -0600545 }
Mike Stroyand72da752015-08-04 10:49:29 -0600546
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500547 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500548 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500549 ASSERT_VK_SUCCESS(err);
550
551 // Try to bind free memory that has been freed
Tony Barboure84a8d62015-07-10 14:10:27 -0600552 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500553 ASSERT_VK_SUCCESS(err);
554
555 // Map memory as if to initialize the image
556 void *mappedAddress = NULL;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500557 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, &mappedAddress);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500558
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600559 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -0600560 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error while tring to map memory not visible to CPU";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500561 if (!strstr(msgString.c_str(),"Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT")) {
562 FAIL() << "Error received did not match expected error message from vkMapMemory in MemTracker";
563 }
Mike Stroyan2237f522015-08-18 14:40:24 -0600564
565 vkDestroyImage(m_device->device(), image);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500566}
567
Tobin Ehlis33ce8fd2015-07-10 18:25:07 -0600568// TODO : Is this test still valid. Not sure it is with updates to memory binding model
569// Verify and delete the test of fix the check
570//TEST_F(VkLayerTest, FreeBoundMemory)
571//{
572// VkFlags msgFlags;
573// std::string msgString;
574// VkResult err;
575//
576// ASSERT_NO_FATAL_FAILURE(InitState());
577// m_errorMonitor->ClearState();
578//
579// // Create an image, allocate memory, free it, and then try to bind it
580// VkImage image;
581// VkDeviceMemory mem;
582// VkMemoryRequirements mem_reqs;
583//
584// const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
585// const int32_t tex_width = 32;
586// const int32_t tex_height = 32;
587//
588// const VkImageCreateInfo image_create_info = {
589// .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
590// .pNext = NULL,
591// .imageType = VK_IMAGE_TYPE_2D,
592// .format = tex_format,
593// .extent = { tex_width, tex_height, 1 },
594// .mipLevels = 1,
595// .arraySize = 1,
596// .samples = 1,
597// .tiling = VK_IMAGE_TILING_LINEAR,
598// .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
599// .flags = 0,
600// };
601// VkMemoryAllocInfo mem_alloc = {
602// .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
603// .pNext = NULL,
604// .allocationSize = 0,
605// .memoryTypeIndex = 0,
606// };
607//
608// err = vkCreateImage(m_device->device(), &image_create_info, &image);
609// ASSERT_VK_SUCCESS(err);
610//
611// err = vkGetImageMemoryRequirements(m_device->device(),
612// image,
613// &mem_reqs);
614// ASSERT_VK_SUCCESS(err);
615//
616// mem_alloc.allocationSize = mem_reqs.size;
617//
618// err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
619// ASSERT_VK_SUCCESS(err);
620//
621// // allocate memory
622// err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
623// ASSERT_VK_SUCCESS(err);
624//
625// // Bind memory to Image object
626// err = vkBindImageMemory(m_device->device(), image, mem, 0);
627// ASSERT_VK_SUCCESS(err);
628//
629// // Introduce validation failure, free memory while still bound to object
630// vkFreeMemory(m_device->device(), mem);
Tobin Ehlis33ce8fd2015-07-10 18:25:07 -0600631// msgFlags = m_errorMonitor->GetState(&msgString);
Courtney Goeltzenleuchter0d6857f2015-09-04 13:52:24 -0600632//
Cody Northrop1684adb2015-08-05 11:15:02 -0600633// ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an warning while tring to free bound memory";
Tobin Ehlis33ce8fd2015-07-10 18:25:07 -0600634// if (!strstr(msgString.c_str(),"Freeing memory object while it still has references")) {
635// FAIL() << "Warning received did not match expected message from freeMemObjInfo in MemTracker";
636// }
637//}
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500638
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500639TEST_F(VkLayerTest, RebindMemory)
640{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600641 VkFlags msgFlags;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500642 std::string msgString;
643 VkResult err;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -0600644 bool pass;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500645
646 ASSERT_NO_FATAL_FAILURE(InitState());
647 m_errorMonitor->ClearState();
648
649 // Create an image, allocate memory, free it, and then try to bind it
650 VkImage image;
651 VkDeviceMemory mem1;
652 VkDeviceMemory mem2;
653 VkMemoryRequirements mem_reqs;
654
655 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
656 const int32_t tex_width = 32;
657 const int32_t tex_height = 32;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500658
Tony Barbourefbe9ca2015-07-15 12:50:33 -0600659 VkImageCreateInfo image_create_info = {};
660 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
661 image_create_info.pNext = NULL;
662 image_create_info.imageType = VK_IMAGE_TYPE_2D;
663 image_create_info.format = tex_format;
664 image_create_info.extent.width = tex_width;
665 image_create_info.extent.height = tex_height;
666 image_create_info.extent.depth = 1;
667 image_create_info.mipLevels = 1;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -0600668 image_create_info.arrayLayers = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -0600669 image_create_info.samples = 1;
670 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
671 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
672 image_create_info.flags = 0;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500673
Tony Barbourefbe9ca2015-07-15 12:50:33 -0600674 VkMemoryAllocInfo mem_alloc = {};
675 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
676 mem_alloc.pNext = NULL;
677 mem_alloc.allocationSize = 0;
678 mem_alloc.memoryTypeIndex = 0;
679
680 // Introduce failure, do NOT set memProps to VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
681 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500682 err = vkCreateImage(m_device->device(), &image_create_info, &image);
683 ASSERT_VK_SUCCESS(err);
684
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -0600685 vkGetImageMemoryRequirements(m_device->device(),
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500686 image,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500687 &mem_reqs);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500688
689 mem_alloc.allocationSize = mem_reqs.size;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -0600690 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
691 ASSERT_TRUE(pass);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500692
693 // allocate 2 memory objects
694 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem1);
695 ASSERT_VK_SUCCESS(err);
696 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem2);
697 ASSERT_VK_SUCCESS(err);
698
699 // Bind first memory object to Image object
Tony Barboure84a8d62015-07-10 14:10:27 -0600700 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500701 ASSERT_VK_SUCCESS(err);
702
703 // Introduce validation failure, try to bind a different memory object to the same image object
Tony Barboure84a8d62015-07-10 14:10:27 -0600704 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500705
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600706 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -0600707 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error while tring to rebind an object";
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500708 if (!strstr(msgString.c_str(),"which has already been bound to mem object")) {
709 FAIL() << "Error received did not match expected message when rebinding memory to an object";
710 }
Mike Stroyan2237f522015-08-18 14:40:24 -0600711
712 vkDestroyImage(m_device->device(), image);
713 vkFreeMemory(m_device->device(), mem1);
714 vkFreeMemory(m_device->device(), mem2);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500715}
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500716
Tony Barbour8508b8e2015-04-09 10:48:04 -0600717TEST_F(VkLayerTest, SubmitSignaledFence)
Tony Barbour30486ea2015-04-07 13:44:53 -0600718{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600719 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600720 VkFlags msgFlags;
Tony Barbour30486ea2015-04-07 13:44:53 -0600721 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600722
723 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600724 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
725 fenceInfo.pNext = NULL;
726 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour30486ea2015-04-07 13:44:53 -0600727
Tony Barbour30486ea2015-04-07 13:44:53 -0600728 ASSERT_NO_FATAL_FAILURE(InitState());
729 ASSERT_NO_FATAL_FAILURE(InitViewport());
730 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
731
Tony Barbour1490c912015-07-28 10:17:20 -0600732 BeginCommandBuffer();
733 m_cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
734 EndCommandBuffer();
Tony Barbour30486ea2015-04-07 13:44:53 -0600735
736 testFence.init(*m_device, fenceInfo);
737 m_errorMonitor->ClearState();
Mark Lobodzinski87db5012015-09-14 17:43:42 -0600738
Courtney Goeltzenleuchter1a748e92015-10-27 11:22:14 -0600739 VkSubmitInfo submit_info;
740 submit_info.waitSemCount = 0;
741 submit_info.pWaitSemaphores = NULL;
742 submit_info.cmdBufferCount = 1;
743 submit_info.pCommandBuffers = &m_cmdBuffer->handle();
744 submit_info.signalSemCount = 0;
745 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600746
747 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinski87db5012015-09-14 17:43:42 -0600748 vkQueueWaitIdle(m_device->m_queue );
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600749 msgFlags = m_errorMonitor->GetState(&msgString);
Mark Lobodzinski87db5012015-09-14 17:43:42 -0600750
Cody Northrop1684adb2015-08-05 11:15:02 -0600751 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an err from using a fence in SIGNALED state in call to vkQueueSubmit";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600752 if (!strstr(msgString.c_str(),"submitted in SIGNALED state. Fences must be reset before being submitted")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500753 FAIL() << "Error received was not 'VkQueueSubmit with fence in SIGNALED_STATE'";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600754 }
755
756}
757
758TEST_F(VkLayerTest, ResetUnsignaledFence)
759{
760 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600761 VkFlags msgFlags;
Tony Barbour8508b8e2015-04-09 10:48:04 -0600762 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600763 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600764 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
765 fenceInfo.pNext = NULL;
766
Tony Barbour8508b8e2015-04-09 10:48:04 -0600767 ASSERT_NO_FATAL_FAILURE(InitState());
768 testFence.init(*m_device, fenceInfo);
769 m_errorMonitor->ClearState();
Chia-I Wua4992342015-07-03 11:45:55 +0800770 VkFence fences[1] = {testFence.handle()};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600771 vkResetFences(m_device->device(), 1, fences);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600772 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlisc2033a02015-10-01 10:14:48 -0600773 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_WARN_BIT)) << "Did not receive an error from submitting fence with UNSIGNALED state to vkResetFences";
Tony Barbour01999182015-04-09 12:58:51 -0600774 if (!strstr(msgString.c_str(),"submitted to VkResetFences in UNSIGNALED STATE")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500775 FAIL() << "Error received was not 'VkResetFences with fence in UNSIGNALED_STATE'";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600776 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600777
778}
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600779
Chia-I Wuc278df82015-07-07 11:50:03 +0800780/* TODO: Update for changes due to bug-14075 tiling across render passes */
781#if 0
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600782TEST_F(VkLayerTest, InvalidUsageBits)
783{
784 // Initiate Draw w/o a PSO bound
785 VkFlags msgFlags;
786 std::string msgString;
787
788 ASSERT_NO_FATAL_FAILURE(InitState());
789 m_errorMonitor->ClearState();
790 VkCommandBufferObj cmdBuffer(m_device);
Tony Barbour1490c912015-07-28 10:17:20 -0600791 BeginCommandBuffer();
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600792
793 const VkExtent3D e3d = {
794 .width = 128,
795 .height = 128,
796 .depth = 1,
797 };
798 const VkImageCreateInfo ici = {
799 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
800 .pNext = NULL,
801 .imageType = VK_IMAGE_TYPE_2D,
802 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
803 .extent = e3d,
804 .mipLevels = 1,
805 .arraySize = 1,
806 .samples = 1,
807 .tiling = VK_IMAGE_TILING_LINEAR,
Courtney Goeltzenleuchterc3b8eea2015-09-10 14:14:11 -0600808 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600809 .flags = 0,
810 };
811
812 VkImage dsi;
813 vkCreateImage(m_device->device(), &ici, &dsi);
814 VkDepthStencilView dsv;
815 const VkDepthStencilViewCreateInfo dsvci = {
816 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
817 .pNext = NULL,
818 .image = dsi,
819 .mipLevel = 0,
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600820 .baseArrayLayer = 0,
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600821 .arraySize = 1,
822 .flags = 0,
823 };
824 vkCreateDepthStencilView(m_device->device(), &dsvci, &dsv);
825 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -0600826 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after attempting to create DSView w/ image lacking USAGE_DS_BIT flag";
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600827 if (!strstr(msgString.c_str(),"Invalid usage flag for image ")) {
828 FAIL() << "Error received was not 'Invalid usage flag for image...'";
829 }
830}
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -0600831#endif // 0
832#endif // MEM_TRACKER_TESTS
833
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600834#if OBJ_TRACKER_TESTS
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600835TEST_F(VkLayerTest, PipelineNotBound)
836{
837 VkFlags msgFlags;
838 std::string msgString;
839 VkResult err;
840
841 ASSERT_NO_FATAL_FAILURE(InitState());
842 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
843 m_errorMonitor->ClearState();
844
845 VkDescriptorTypeCount ds_type_count = {};
846 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
847 ds_type_count.count = 1;
848
849 VkDescriptorPoolCreateInfo ds_pool_ci = {};
850 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
851 ds_pool_ci.pNext = NULL;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -0600852 ds_pool_ci.maxSets = 1;
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600853 ds_pool_ci.count = 1;
854 ds_pool_ci.pTypeCount = &ds_type_count;
855
856 VkDescriptorPool ds_pool;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -0600857 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600858 ASSERT_VK_SUCCESS(err);
859
860 VkDescriptorSetLayoutBinding dsl_binding = {};
861 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
862 dsl_binding.arraySize = 1;
863 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
864 dsl_binding.pImmutableSamplers = NULL;
865
866 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
867 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
868 ds_layout_ci.pNext = NULL;
869 ds_layout_ci.count = 1;
870 ds_layout_ci.pBinding = &dsl_binding;
871
872 VkDescriptorSetLayout ds_layout;
873 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
874 ASSERT_VK_SUCCESS(err);
875
876 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -0600877 VkDescriptorSetAllocInfo alloc_info = {};
878 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
879 alloc_info.count = 1;
880 alloc_info.descriptorPool = ds_pool;
881 alloc_info.pSetLayouts = &ds_layout;
882 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisf2f97402015-09-11 12:57:55 -0600883 ASSERT_VK_SUCCESS(err);
884
885 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
886 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
887 pipeline_layout_ci.pNext = NULL;
888 pipeline_layout_ci.descriptorSetCount = 1;
889 pipeline_layout_ci.pSetLayouts = &ds_layout;
890
891 VkPipelineLayout pipeline_layout;
892 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
893 ASSERT_VK_SUCCESS(err);
894
895 VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
896
897 BeginCommandBuffer();
898 vkCmdBindPipeline(m_cmdBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
899
900 msgFlags = m_errorMonitor->GetState(&msgString);
901 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after binding invalid pipeline to CmdBuffer";
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600902 if (!strstr(msgString.c_str(),"Invalid VkPipeline Object ")) {
903 FAIL() << "Error received was not 'Invalid VkPipeline Object 0xbaadb1be' but instead it was '" << msgString.c_str() << "'";
904 }
Mike Stroyan2237f522015-08-18 14:40:24 -0600905
906 vkDestroyPipelineLayout(m_device->device(), pipeline_layout);
Mike Stroyan2237f522015-08-18 14:40:24 -0600907 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
908 vkDestroyDescriptorPool(m_device->device(), ds_pool);
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600909}
910
911TEST_F(VkLayerTest, BindInvalidMemory)
912{
913 VkFlags msgFlags;
914 std::string msgString;
915 VkResult err;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -0600916 bool pass;
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600917
918 ASSERT_NO_FATAL_FAILURE(InitState());
919 m_errorMonitor->ClearState();
920
921 // Create an image, allocate memory, free it, and then try to bind it
922 VkImage image;
923 VkDeviceMemory mem;
924 VkMemoryRequirements mem_reqs;
925
926 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
927 const int32_t tex_width = 32;
928 const int32_t tex_height = 32;
929
930 VkImageCreateInfo image_create_info = {};
931 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
932 image_create_info.pNext = NULL;
933 image_create_info.imageType = VK_IMAGE_TYPE_2D;
934 image_create_info.format = tex_format;
935 image_create_info.extent.width = tex_width;
936 image_create_info.extent.height = tex_height;
937 image_create_info.extent.depth = 1;
938 image_create_info.mipLevels = 1;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -0600939 image_create_info.arrayLayers = 1;
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600940 image_create_info.samples = 1;
941 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
942 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
943 image_create_info.flags = 0;
944
945 VkMemoryAllocInfo mem_alloc = {};
946 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
947 mem_alloc.pNext = NULL;
948 mem_alloc.allocationSize = 0;
949 mem_alloc.memoryTypeIndex = 0;
950
951 err = vkCreateImage(m_device->device(), &image_create_info, &image);
952 ASSERT_VK_SUCCESS(err);
953
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -0600954 vkGetImageMemoryRequirements(m_device->device(),
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600955 image,
956 &mem_reqs);
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600957
958 mem_alloc.allocationSize = mem_reqs.size;
959
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -0600960 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
961 ASSERT_TRUE(pass);
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600962
963 // allocate memory
964 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
965 ASSERT_VK_SUCCESS(err);
966
967 // Introduce validation failure, free memory before binding
968 vkFreeMemory(m_device->device(), mem);
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600969
970 // Try to bind free memory that has been freed
971 err = vkBindImageMemory(m_device->device(), image, mem, 0);
972 // This may very well return an error.
973 (void)err;
974
975 msgFlags = m_errorMonitor->GetState(&msgString);
976 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error while tring to bind a freed memory object";
977 if (!strstr(msgString.c_str(),"Invalid VkDeviceMemory Object ")) {
978 FAIL() << "Error received from BindInvalidMemory was not 'Invalid VkDeviceMemory Object 0x<handle>' but instead '" << msgString.c_str() << "'";
979 }
Mike Stroyan2237f522015-08-18 14:40:24 -0600980
981 vkDestroyImage(m_device->device(), image);
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600982}
983
984TEST_F(VkLayerTest, BindMemoryToDestroyedObject)
985{
986 VkFlags msgFlags;
987 std::string msgString;
988 VkResult err;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -0600989 bool pass;
Tobin Ehlis87f115c2015-09-15 15:02:17 -0600990
991 ASSERT_NO_FATAL_FAILURE(InitState());
992 m_errorMonitor->ClearState();
993
994 // Create an image object, allocate memory, destroy the object and then try to bind it
995 VkImage image;
996 VkDeviceMemory mem;
997 VkMemoryRequirements mem_reqs;
998
999 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1000 const int32_t tex_width = 32;
1001 const int32_t tex_height = 32;
1002
1003 VkImageCreateInfo image_create_info = {};
1004 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1005 image_create_info.pNext = NULL;
1006 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1007 image_create_info.format = tex_format;
1008 image_create_info.extent.width = tex_width;
1009 image_create_info.extent.height = tex_height;
1010 image_create_info.extent.depth = 1;
1011 image_create_info.mipLevels = 1;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -06001012 image_create_info.arrayLayers = 1;
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001013 image_create_info.samples = 1;
1014 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1015 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1016 image_create_info.flags = 0;
1017
1018 VkMemoryAllocInfo mem_alloc = {};
1019 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
1020 mem_alloc.pNext = NULL;
1021 mem_alloc.allocationSize = 0;
1022 mem_alloc.memoryTypeIndex = 0;
1023
1024 err = vkCreateImage(m_device->device(), &image_create_info, &image);
1025 ASSERT_VK_SUCCESS(err);
1026
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06001027 vkGetImageMemoryRequirements(m_device->device(),
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001028 image,
1029 &mem_reqs);
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001030
1031 mem_alloc.allocationSize = mem_reqs.size;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06001032 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
1033 ASSERT_TRUE(pass);
Tobin Ehlis87f115c2015-09-15 15:02:17 -06001034
1035 // Allocate memory
1036 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
1037 ASSERT_VK_SUCCESS(err);
1038
1039 // Introduce validation failure, destroy Image object before binding
1040 vkDestroyImage(m_device->device(), image);
1041 ASSERT_VK_SUCCESS(err);
1042
1043 // Now Try to bind memory to this destroyed object
1044 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1045 // This may very well return an error.
1046 (void) err;
1047
1048 msgFlags = m_errorMonitor->GetState(&msgString);
1049 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error while binding memory to a destroyed object";
1050 if (!strstr(msgString.c_str(),"Invalid VkImage Object ")) {
1051 FAIL() << "Error received from BindMemoryToDestroyedObject was not 'Invalid VkImage Object 0x<handle>' but rather '" << msgString.c_str() << "'";
Tobin Ehlisf2f97402015-09-11 12:57:55 -06001052 }
Mike Stroyan2237f522015-08-18 14:40:24 -06001053
1054 vkFreeMemory(m_device->device(), mem);
Tobin Ehlisf2f97402015-09-11 12:57:55 -06001055}
Tobin Ehlisb46be812015-10-23 16:00:08 -06001056
1057TEST_F(VkLayerTest, InvalidBufferViewObject)
1058{
1059 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
1060 VkFlags msgFlags;
1061 std::string msgString;
1062 VkResult err;
1063
1064 ASSERT_NO_FATAL_FAILURE(InitState());
1065 m_errorMonitor->ClearState();
1066 VkDescriptorTypeCount ds_type_count = {};
1067 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1068 ds_type_count.count = 1;
1069
1070 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1071 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1072 ds_pool_ci.pNext = NULL;
1073 ds_pool_ci.maxSets = 1;
1074 ds_pool_ci.count = 1;
1075 ds_pool_ci.pTypeCount = &ds_type_count;
1076
1077 VkDescriptorPool ds_pool;
1078 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
1079 ASSERT_VK_SUCCESS(err);
1080
1081 VkDescriptorSetLayoutBinding dsl_binding = {};
1082 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1083 dsl_binding.arraySize = 1;
1084 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1085 dsl_binding.pImmutableSamplers = NULL;
1086
1087 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1088 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1089 ds_layout_ci.pNext = NULL;
1090 ds_layout_ci.count = 1;
1091 ds_layout_ci.pBinding = &dsl_binding;
1092 VkDescriptorSetLayout ds_layout;
1093 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1094 ASSERT_VK_SUCCESS(err);
1095
1096 VkDescriptorSet descriptorSet;
1097 VkDescriptorSetAllocInfo alloc_info = {};
1098 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
1099 alloc_info.count = 1;
1100 alloc_info.descriptorPool = ds_pool;
1101 alloc_info.pSetLayouts = &ds_layout;
1102 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
1103 ASSERT_VK_SUCCESS(err);
1104
Chia-I Wue420a332015-10-26 20:04:44 +08001105 VkBufferView view = (VkBufferView) 0xbaadbeef; // invalid bufferView object
Tobin Ehlisb46be812015-10-23 16:00:08 -06001106
1107 VkWriteDescriptorSet descriptor_write;
1108 memset(&descriptor_write, 0, sizeof(descriptor_write));
1109 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1110 descriptor_write.destSet = descriptorSet;
1111 descriptor_write.destBinding = 0;
1112 descriptor_write.count = 1;
1113 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1114 descriptor_write.pTexelBufferView = &view;
1115
1116 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1117
1118 msgFlags = m_errorMonitor->GetState(&msgString);
1119 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after updating Descriptor w/ invalid VkDescriptorBufferInfo.";
1120 if (!strstr(msgString.c_str(),"Invalid VkBufferView Object 0xbaadbeef")) {
1121 FAIL() << "Error received was not 'Invalid VkBufferView Object 0xbaadbeef' but instead '" << msgString.c_str() << "'";
1122 }
1123
1124 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
1125 vkDestroyDescriptorPool(m_device->device(), ds_pool);
1126}
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06001127#endif // OBJ_TRACKER_TESTS
1128
Tobin Ehlis57e6a612015-05-26 16:11:58 -06001129#if DRAW_STATE_TESTS
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001130TEST_F(VkLayerTest, LineWidthStateNotBound)
1131{
1132 VkFlags msgFlags;
1133 std::string msgString;
1134 m_errorMonitor->ClearState();
1135 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line width state object is not bound beforehand");
1136
1137 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
1138
1139 msgFlags = m_errorMonitor->GetState(&msgString);
1140 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error from Not Binding a Line Width State Object";
1141 if (!strstr(msgString.c_str(),"Dynamic line width state not set for this command buffer")) {
1142 FAIL() << "Received: '" << msgString.c_str() << "' Expected: 'Dynamic line width state not set for this command buffer'";
1143 }
1144}
1145
1146TEST_F(VkLayerTest, DepthBiasStateNotBound)
1147{
1148 VkFlags msgFlags;
1149 std::string msgString;
1150 m_errorMonitor->ClearState();
1151 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth bias state object is not bound beforehand");
1152
1153 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
1154
1155 msgFlags = m_errorMonitor->GetState(&msgString);
1156 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error from Not Binding a Depth Bias State Object";
1157 if (!strstr(msgString.c_str(),"Dynamic depth bias state not set for this command buffer")) {
1158 FAIL() << "Received: '" << msgString.c_str() << "' Expected: 'Dynamic depth bias state not set for this command buffer'";
1159 }
1160}
1161
Cody Northropbca3bcd2015-10-27 16:54:28 -06001162// Disable these two tests until we can sort out how to track multiple layer errors
1163#if 0
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001164TEST_F(VkLayerTest, ViewportStateNotBound)
1165{
1166 VkFlags msgFlags;
1167 std::string msgString;
1168 m_errorMonitor->ClearState();
1169 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport state object is not bound beforehand");
1170
1171 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
1172
1173 msgFlags = m_errorMonitor->GetState(&msgString);
1174 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error from Not Binding a Viewport State Object";
Tobin Ehlis3dec46c2015-10-01 09:24:40 -06001175 // TODO : Viewport and scissor currently set as a pair in framework so scissor error masks viewport error
1176 if (!strstr(msgString.c_str(),"Dynamic scissor state not set for this command buffer")) {
1177 FAIL() << "Received: '" << msgString.c_str() << "' Expected: 'Dynamic scissor state not set for this command buffer'";
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001178 }
1179}
1180
1181TEST_F(VkLayerTest, ScissorStateNotBound)
1182{
1183 VkFlags msgFlags;
1184 std::string msgString;
1185 m_errorMonitor->ClearState();
1186 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport state object is not bound beforehand");
1187
1188 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
1189
1190 msgFlags = m_errorMonitor->GetState(&msgString);
1191 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error from Not Binding a Viewport State Object";
1192 if (!strstr(msgString.c_str(),"Dynamic scissor state not set for this command buffer")) {
1193 FAIL() << "Received: '" << msgString.c_str() << "' Expected: 'Dynamic scissor state not set for this command buffer'";
1194 }
1195}
Cody Northropbca3bcd2015-10-27 16:54:28 -06001196#endif
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001197
Tobin Ehlisf6cb4672015-09-29 08:18:34 -06001198TEST_F(VkLayerTest, BlendStateNotBound)
1199{
1200 VkFlags msgFlags;
1201 std::string msgString;
1202 m_errorMonitor->ClearState();
1203 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend state object is not bound beforehand");
1204
1205 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
1206
1207 msgFlags = m_errorMonitor->GetState(&msgString);
1208 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error from Not Binding a Blend State Object";
1209 if (!strstr(msgString.c_str(),"Dynamic blend object state not set for this command buffer")) {
1210 FAIL() << "Received: '" << msgString.c_str() << "' Expected: 'Dynamic blend object state not set for this command buffer'";
1211 }
1212}
1213
1214TEST_F(VkLayerTest, DepthBoundsStateNotBound)
1215{
1216 VkFlags msgFlags;
1217 std::string msgString;
1218 m_errorMonitor->ClearState();
1219 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth bounds state object is not bound beforehand");
1220
1221 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
1222
1223 msgFlags = m_errorMonitor->GetState(&msgString);
1224 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error from Not Binding a Depth Bounds State Object";
1225 if (!strstr(msgString.c_str(),"Dynamic depth bounds state not set for this command buffer")) {
1226 FAIL() << "Received: '" << msgString.c_str() << "' Expected: 'Dynamic depth bounds state not set for this command buffer'";
1227 }
1228}
1229
1230TEST_F(VkLayerTest, StencilReadMaskNotSet)
1231{
1232 VkFlags msgFlags;
1233 std::string msgString;
1234 ASSERT_NO_FATAL_FAILURE(InitState());
1235 m_errorMonitor->ClearState();
1236 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil read mask is not set beforehand");
1237
1238 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
1239
1240 msgFlags = m_errorMonitor->GetState(&msgString);
1241 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error from Not Setting a Stencil Read Mask";
1242 if (!strstr(msgString.c_str(),"Dynamic stencil read mask state not set for this command buffer")) {
1243 FAIL() << "Received: '" << msgString.c_str() << "' Expected: 'Dynamic stencil read mask state not set for this command buffer'";
1244 }
1245}
1246
1247TEST_F(VkLayerTest, StencilWriteMaskNotSet)
1248{
1249 VkFlags msgFlags;
1250 std::string msgString;
1251 ASSERT_NO_FATAL_FAILURE(InitState());
1252 m_errorMonitor->ClearState();
1253 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil write mask is not set beforehand");
1254
1255 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
1256
1257 msgFlags = m_errorMonitor->GetState(&msgString);
1258 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error from Not Setting a Stencil Write Mask";
1259 if (!strstr(msgString.c_str(),"Dynamic stencil write mask state not set for this command buffer")) {
1260 FAIL() << "Received: '" << msgString.c_str() << "' Expected: 'Dynamic stencil write mask state not set for this command buffer'";
1261 }
1262}
1263
1264TEST_F(VkLayerTest, StencilReferenceNotSet)
1265{
1266 VkFlags msgFlags;
1267 std::string msgString;
1268 m_errorMonitor->ClearState();
1269 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil reference is not set beforehand");
1270
1271 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
1272
1273 msgFlags = m_errorMonitor->GetState(&msgString);
1274 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error from Not Setting a Stencil Reference";
1275 if (!strstr(msgString.c_str(),"Dynamic stencil reference state not set for this command buffer")) {
1276 FAIL() << "Received: '" << msgString.c_str() << "' Expected: 'Dynamic stencil reference state not set for this command buffer'";
1277 }
1278}
1279
Tobin Ehlis0cea4082015-08-18 07:10:58 -06001280TEST_F(VkLayerTest, CmdBufferTwoSubmits)
1281{
1282 vk_testing::Fence testFence;
1283 VkFlags msgFlags;
1284 std::string msgString;
1285
1286 VkFenceCreateInfo fenceInfo = {};
1287 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1288 fenceInfo.pNext = NULL;
1289 fenceInfo.flags = 0;
1290
1291 ASSERT_NO_FATAL_FAILURE(InitState());
1292 ASSERT_NO_FATAL_FAILURE(InitViewport());
1293 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1294
Courtney Goeltzenleuchtera32436b2015-10-21 18:11:04 -06001295 // We luck out b/c by default the framework creates CB w/ the VK_CMD_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis0cea4082015-08-18 07:10:58 -06001296 BeginCommandBuffer();
1297 m_cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
1298 EndCommandBuffer();
1299
1300 testFence.init(*m_device, fenceInfo);
1301
1302 // Bypass framework since it does the waits automatically
1303 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter1a748e92015-10-27 11:22:14 -06001304 VkSubmitInfo submit_info;
1305 submit_info.waitSemCount = 0;
1306 submit_info.pWaitSemaphores = NULL;
1307 submit_info.cmdBufferCount = 1;
1308 submit_info.pCommandBuffers = &m_cmdBuffer->handle();
1309 submit_info.signalSemCount = 0;
1310 submit_info.pSignalSemaphores = NULL;
1311
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -06001312 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis0cea4082015-08-18 07:10:58 -06001313 ASSERT_VK_SUCCESS( err );
1314
1315 m_errorMonitor->ClearState();
1316 // Cause validation error by re-submitting cmd buffer that should only be submitted once
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -06001317 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis0cea4082015-08-18 07:10:58 -06001318
1319 msgFlags = m_errorMonitor->GetState(&msgString);
1320 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an err after re-submitting Command Buffer that was created with one-time submit flag";
Courtney Goeltzenleuchtera32436b2015-10-21 18:11:04 -06001321 if (!strstr(msgString.c_str(),"was begun w/ VK_CMD_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted")) {
1322 FAIL() << "Error received was not 'CB (0xaddress) was created w/ VK_CMD_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set...'";
Tobin Ehlis0cea4082015-08-18 07:10:58 -06001323 }
1324}
1325
Tobin Ehlise4076782015-06-24 15:53:07 -06001326TEST_F(VkLayerTest, BindPipelineNoRenderPass)
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001327{
1328 // Initiate Draw w/o a PSO bound
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001329 VkFlags msgFlags;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001330 std::string msgString;
Tobin Ehlisf2f97402015-09-11 12:57:55 -06001331 VkResult err;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001332
1333 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisf2f97402015-09-11 12:57:55 -06001334 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001335 m_errorMonitor->ClearState();
Tobin Ehlisf2f97402015-09-11 12:57:55 -06001336
1337 VkDescriptorTypeCount ds_type_count = {};
1338 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1339 ds_type_count.count = 1;
1340
1341 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1342 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1343 ds_pool_ci.pNext = NULL;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06001344 ds_pool_ci.maxSets = 1;
Tobin Ehlisf2f97402015-09-11 12:57:55 -06001345 ds_pool_ci.count = 1;
1346 ds_pool_ci.pTypeCount = &ds_type_count;
1347
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06001348 VkDescriptorPool ds_pool;
1349 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
Tobin Ehlisf2f97402015-09-11 12:57:55 -06001350 ASSERT_VK_SUCCESS(err);
1351
1352 VkDescriptorSetLayoutBinding dsl_binding = {};
1353 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1354 dsl_binding.arraySize = 1;
1355 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1356 dsl_binding.pImmutableSamplers = NULL;
1357
1358 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1359 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1360 ds_layout_ci.pNext = NULL;
1361 ds_layout_ci.count = 1;
1362 ds_layout_ci.pBinding = &dsl_binding;
1363
1364 VkDescriptorSetLayout ds_layout;
1365 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1366 ASSERT_VK_SUCCESS(err);
1367
1368 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001369 VkDescriptorSetAllocInfo alloc_info = {};
1370 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
1371 alloc_info.count = 1;
1372 alloc_info.descriptorPool = ds_pool;
1373 alloc_info.pSetLayouts = &ds_layout;
1374 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisf2f97402015-09-11 12:57:55 -06001375 ASSERT_VK_SUCCESS(err);
1376 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
1377 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
1378 pipe_ms_state_ci.pNext = NULL;
1379 pipe_ms_state_ci.rasterSamples = 1;
1380 pipe_ms_state_ci.sampleShadingEnable = 0;
1381 pipe_ms_state_ci.minSampleShading = 1.0;
1382 pipe_ms_state_ci.pSampleMask = NULL;
1383
1384 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1385 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1386 pipeline_layout_ci.pNext = NULL;
1387 pipeline_layout_ci.descriptorSetCount = 1;
1388 pipeline_layout_ci.pSetLayouts = &ds_layout;
1389 VkPipelineLayout pipeline_layout;
1390
1391 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1392 ASSERT_VK_SUCCESS(err);
1393
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06001394 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1395 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // TODO - We shouldn't need a fragment shader
Tobin Ehlisf2f97402015-09-11 12:57:55 -06001396 // but add it to be able to run on more devices
1397 VkPipelineObj pipe(m_device);
1398 pipe.AddShader(&vs);
1399 pipe.AddShader(&fs);
1400 pipe.SetMSAA(&pipe_ms_state_ci);
1401 pipe.CreateVKPipeline(pipeline_layout, renderPass());
1402 m_errorMonitor->ClearState();
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001403 // Calls AllocCommandBuffers
Tobin Ehlisf2f97402015-09-11 12:57:55 -06001404 VkCommandBufferObj cmdBuffer(m_device, m_cmdPool);
1405 VkCmdBufferBeginInfo cmd_buf_info = {};
1406 memset(&cmd_buf_info, 0, sizeof(VkCmdBufferBeginInfo));
1407 cmd_buf_info.sType = VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO;
1408 cmd_buf_info.pNext = NULL;
Courtney Goeltzenleuchtera32436b2015-10-21 18:11:04 -06001409 cmd_buf_info.flags = VK_CMD_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Tobin Ehlisf2f97402015-09-11 12:57:55 -06001410
1411 vkBeginCommandBuffer(cmdBuffer.GetBufferHandle(), &cmd_buf_info);
1412 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001413 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06001414 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after binding pipeline to CmdBuffer w/o active RenderPass";
Tobin Ehlise4076782015-06-24 15:53:07 -06001415 if (!strstr(msgString.c_str(),"Incorrectly binding graphics pipeline ")) {
Tobin Ehlisc6457d22015-10-20 16:16:04 -06001416 FAIL() << "Error received was not 'Incorrectly binding graphics pipeline (0x<handle>) without an active RenderPass' but rather '" << msgString.c_str() << "'";
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001417 }
Mike Stroyan2237f522015-08-18 14:40:24 -06001418
1419 vkDestroyPipelineLayout(m_device->device(), pipeline_layout);
Mike Stroyan2237f522015-08-18 14:40:24 -06001420 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
1421 vkDestroyDescriptorPool(m_device->device(), ds_pool);
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001422}
1423
Tobin Ehlisc6457d22015-10-20 16:16:04 -06001424TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool)
1425{
1426 // Initiate Draw w/o a PSO bound
1427 VkFlags msgFlags;
1428 std::string msgString;
1429 VkResult err;
1430
1431 ASSERT_NO_FATAL_FAILURE(InitState());
1432 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1433 m_errorMonitor->ClearState();
1434
1435 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer descriptor from it
1436 VkDescriptorTypeCount ds_type_count = {};
1437 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
1438 ds_type_count.count = 1;
1439
1440 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1441 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1442 ds_pool_ci.pNext = NULL;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001443 ds_pool_ci.flags = 0;
Tobin Ehlisc6457d22015-10-20 16:16:04 -06001444 ds_pool_ci.maxSets = 1;
1445 ds_pool_ci.count = 1;
1446 ds_pool_ci.pTypeCount = &ds_type_count;
1447
1448 VkDescriptorPool ds_pool;
1449 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
1450 ASSERT_VK_SUCCESS(err);
1451
1452 VkDescriptorSetLayoutBinding dsl_binding = {};
1453 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1454 dsl_binding.arraySize = 1;
1455 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1456 dsl_binding.pImmutableSamplers = NULL;
1457
1458 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1459 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1460 ds_layout_ci.pNext = NULL;
1461 ds_layout_ci.count = 1;
1462 ds_layout_ci.pBinding = &dsl_binding;
1463
1464 VkDescriptorSetLayout ds_layout;
1465 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1466 ASSERT_VK_SUCCESS(err);
1467
1468 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001469 VkDescriptorSetAllocInfo alloc_info = {};
1470 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
1471 alloc_info.count = 1;
1472 alloc_info.descriptorPool = ds_pool;
1473 alloc_info.pSetLayouts = &ds_layout;
1474 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc6457d22015-10-20 16:16:04 -06001475
1476 msgFlags = m_errorMonitor->GetState(&msgString);
1477 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after alloc descriptor from pool w/o requested type";
1478 if (!strstr(msgString.c_str(),"Unable to allocate 1 descriptors of type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ")) {
1479 FAIL() << "Error received was not 'Unable to allocate 1 descriptors of type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER...' but rather '" << msgString.c_str() << "'";
1480 }
1481
1482 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
1483 vkDestroyDescriptorPool(m_device->device(), ds_pool);
1484}
1485
Tobin Ehlis3c543112015-10-08 13:13:50 -06001486TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool)
1487{
1488 VkFlags msgFlags;
1489 std::string msgString;
1490 VkResult err;
1491
1492 ASSERT_NO_FATAL_FAILURE(InitState());
1493 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1494 m_errorMonitor->ClearState();
1495
1496 VkDescriptorTypeCount ds_type_count = {};
1497 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1498 ds_type_count.count = 1;
1499
1500 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1501 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1502 ds_pool_ci.pNext = NULL;
Tobin Ehlis3c543112015-10-08 13:13:50 -06001503 ds_pool_ci.maxSets = 1;
1504 ds_pool_ci.count = 1;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001505 ds_pool_ci.flags = 0;
1506 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
1507 // app can only call vkResetDescriptorPool on this pool.;
Tobin Ehlis3c543112015-10-08 13:13:50 -06001508 ds_pool_ci.pTypeCount = &ds_type_count;
1509
1510 VkDescriptorPool ds_pool;
1511 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
1512 ASSERT_VK_SUCCESS(err);
1513
1514 VkDescriptorSetLayoutBinding dsl_binding = {};
1515 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1516 dsl_binding.arraySize = 1;
1517 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1518 dsl_binding.pImmutableSamplers = NULL;
1519
1520 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1521 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1522 ds_layout_ci.pNext = NULL;
1523 ds_layout_ci.count = 1;
1524 ds_layout_ci.pBinding = &dsl_binding;
1525
1526 VkDescriptorSetLayout ds_layout;
1527 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1528 ASSERT_VK_SUCCESS(err);
1529
1530 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001531 VkDescriptorSetAllocInfo alloc_info = {};
1532 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
1533 alloc_info.count = 1;
1534 alloc_info.descriptorPool = ds_pool;
1535 alloc_info.pSetLayouts = &ds_layout;
1536 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3c543112015-10-08 13:13:50 -06001537 ASSERT_VK_SUCCESS(err);
1538
1539 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
1540 msgFlags = m_errorMonitor->GetState(&msgString);
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001541 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after freeing descriptor from non-free Pool";
1542
1543 if (!strstr(msgString.c_str(),"It is invalid to call vkFreeDescriptorSets() with a pool created without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.")) {
Tobin Ehlis3c543112015-10-08 13:13:50 -06001544 FAIL() << "Error received was not 'It is invalid to call vkFreeDescriptorSets() with a pool created with...' but instead it was '" << msgString.c_str() << "'";
1545 }
1546
1547 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
1548 vkDestroyDescriptorPool(m_device->device(), ds_pool);
1549}
1550
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001551TEST_F(VkLayerTest, InvalidDescriptorPool)
1552{
1553 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1554 // The DS check for this is after driver has been called to validate DS internal data struct
1555 // Attempt to clear DS Pool with bad object
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001556/* VkFlags msgFlags;
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001557 std::string msgString;
1558 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
1559 vkResetDescriptorPool(device(), badPool);
1560
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001561 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06001562 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error from Resetting an invalid DescriptorPool Object";
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001563 if (!strstr(msgString.c_str(),"Unable to find pool node for pool 0xbaad6001 specified in vkResetDescriptorPool() call")) {
1564 FAIL() << "Error received was note 'Unable to find pool node for pool 0xbaad6001 specified in vkResetDescriptorPool() call'";
1565 }*/
1566}
1567
1568TEST_F(VkLayerTest, InvalidDescriptorSet)
1569{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001570 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1571 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001572 // Create a valid cmd buffer
1573 // call vkCmdBindDescriptorSets w/ false DS
1574}
1575
1576TEST_F(VkLayerTest, InvalidDescriptorSetLayout)
1577{
1578 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1579 // The DS check for this is after driver has been called to validate DS internal data struct
1580}
1581
1582TEST_F(VkLayerTest, InvalidPipeline)
1583{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001584 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1585 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001586 // Create a valid cmd buffer
1587 // call vkCmdBindPipeline w/ false Pipeline
Tobin Ehlise4076782015-06-24 15:53:07 -06001588// VkFlags msgFlags;
1589// std::string msgString;
1590//
1591// ASSERT_NO_FATAL_FAILURE(InitState());
1592// m_errorMonitor->ClearState();
1593// VkCommandBufferObj cmdBuffer(m_device);
Tony Barbour1490c912015-07-28 10:17:20 -06001594// BeginCommandBuffer();
Tobin Ehlise4076782015-06-24 15:53:07 -06001595// VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
1596// vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
1597// msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06001598// ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after binding invalid pipeline to CmdBuffer";
Tobin Ehlise4076782015-06-24 15:53:07 -06001599// if (!strstr(msgString.c_str(),"Attempt to bind Pipeline ")) {
1600// FAIL() << "Error received was not 'Attempt to bind Pipeline 0xbaadb1be that doesn't exist!'";
1601// }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001602}
1603
Tobin Ehlis254eca02015-06-25 15:46:59 -06001604TEST_F(VkLayerTest, DescriptorSetNotUpdated)
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001605{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001606 // Create and update CmdBuffer then call QueueSubmit w/o calling End on CmdBuffer
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001607 VkFlags msgFlags;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001608 std::string msgString;
1609 VkResult err;
1610
1611 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyand72da752015-08-04 10:49:29 -06001612 ASSERT_NO_FATAL_FAILURE(InitViewport());
1613 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001614 m_errorMonitor->ClearState();
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001615 VkDescriptorTypeCount ds_type_count = {};
1616 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1617 ds_type_count.count = 1;
1618
1619 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1620 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1621 ds_pool_ci.pNext = NULL;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06001622 ds_pool_ci.maxSets = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001623 ds_pool_ci.count = 1;
1624 ds_pool_ci.pTypeCount = &ds_type_count;
Mike Stroyand72da752015-08-04 10:49:29 -06001625
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001626 VkDescriptorPool ds_pool;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06001627 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001628 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001629
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001630 VkDescriptorSetLayoutBinding dsl_binding = {};
1631 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1632 dsl_binding.arraySize = 1;
1633 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1634 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001635
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001636 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1637 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1638 ds_layout_ci.pNext = NULL;
1639 ds_layout_ci.count = 1;
1640 ds_layout_ci.pBinding = &dsl_binding;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001641 VkDescriptorSetLayout ds_layout;
1642 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1643 ASSERT_VK_SUCCESS(err);
1644
1645 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001646 VkDescriptorSetAllocInfo alloc_info = {};
1647 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
1648 alloc_info.count = 1;
1649 alloc_info.descriptorPool = ds_pool;
1650 alloc_info.pSetLayouts = &ds_layout;
1651 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001652 ASSERT_VK_SUCCESS(err);
1653
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001654 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1655 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1656 pipeline_layout_ci.pNext = NULL;
1657 pipeline_layout_ci.descriptorSetCount = 1;
1658 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001659
1660 VkPipelineLayout pipeline_layout;
1661 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1662 ASSERT_VK_SUCCESS(err);
1663
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06001664 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1665 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // TODO - We shouldn't need a fragment shader
Tony Barbour3c9e3b12015-08-06 11:21:08 -06001666 // but add it to be able to run on more devices
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001667
Tony Barbour4e8d1b12015-08-04 17:05:26 -06001668 VkPipelineObj pipe(m_device);
1669 pipe.AddShader(&vs);
Tony Barbour3c9e3b12015-08-06 11:21:08 -06001670 pipe.AddShader(&fs);
Tony Barbour4e8d1b12015-08-04 17:05:26 -06001671 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbour1490c912015-07-28 10:17:20 -06001672
1673 BeginCommandBuffer();
Tony Barbour4e8d1b12015-08-04 17:05:26 -06001674 vkCmdBindPipeline(m_cmdBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tony Barbour1490c912015-07-28 10:17:20 -06001675 vkCmdBindDescriptorSets(m_cmdBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001676
Tobin Ehlis254eca02015-06-25 15:46:59 -06001677 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06001678 ASSERT_NE(0, msgFlags & VK_DBG_REPORT_WARN_BIT) << "Did not warn after binding a DescriptorSet that was never updated.";
Tobin Ehlis254eca02015-06-25 15:46:59 -06001679 if (!strstr(msgString.c_str()," bound but it was never updated. ")) {
1680 FAIL() << "Error received was not 'DS <blah> bound but it was never updated. You may want to either update it or not bind it.'";
1681 }
Mike Stroyan2237f522015-08-18 14:40:24 -06001682
1683 vkDestroyPipelineLayout(m_device->device(), pipeline_layout);
Mike Stroyan2237f522015-08-18 14:40:24 -06001684 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
1685 vkDestroyDescriptorPool(m_device->device(), ds_pool);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001686}
1687
1688TEST_F(VkLayerTest, NoBeginCmdBuffer)
1689{
1690 VkFlags msgFlags;
1691 std::string msgString;
1692
1693 ASSERT_NO_FATAL_FAILURE(InitState());
1694 m_errorMonitor->ClearState();
Tony Barbour1490c912015-07-28 10:17:20 -06001695 VkCommandBufferObj cmdBuffer(m_device, m_cmdPool);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001696 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
1697 vkEndCommandBuffer(cmdBuffer.GetBufferHandle());
1698 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06001699 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after ending a CmdBuffer w/o calling BeginCommandBuffer()";
Tobin Ehlis254eca02015-06-25 15:46:59 -06001700 if (!strstr(msgString.c_str(),"You must call vkBeginCommandBuffer() before this call to ")) {
1701 FAIL() << "Error received was not 'You must call vkBeginCommandBuffer() before this call to vkEndCommandBuffer()'";
1702 }
1703}
1704
Mark Lobodzinski90bf5b02015-08-04 16:24:20 -06001705TEST_F(VkLayerTest, PrimaryCmdBufferFramebufferAndRenderpass)
1706{
1707 VkFlags msgFlags;
1708 std::string msgString;
1709
1710 ASSERT_NO_FATAL_FAILURE(InitState());
1711 m_errorMonitor->ClearState();
1712
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001713 // Calls AllocCommandBuffers
Mark Lobodzinski90bf5b02015-08-04 16:24:20 -06001714 VkCommandBufferObj cmdBuffer(m_device, m_cmdPool);
1715
1716 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Cody Northrop10d8f982015-08-04 17:35:57 -06001717 VkCmdBufferBeginInfo cmd_buf_info = {};
1718 cmd_buf_info.sType = VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO;
1719 cmd_buf_info.pNext = NULL;
Courtney Goeltzenleuchtera32436b2015-10-21 18:11:04 -06001720 cmd_buf_info.flags = VK_CMD_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Cody Northrop10d8f982015-08-04 17:35:57 -06001721 cmd_buf_info.renderPass = (VkRenderPass)0xcadecade;
1722 cmd_buf_info.framebuffer = (VkFramebuffer)0xcadecade;
1723
Mark Lobodzinski90bf5b02015-08-04 16:24:20 -06001724
1725 // The error should be caught by validation of the BeginCommandBuffer call
1726 vkBeginCommandBuffer(cmdBuffer.GetBufferHandle(), &cmd_buf_info);
1727
1728 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06001729 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error passing a non-NULL Framebuffer and Renderpass to BeginCommandBuffer()";
Mark Lobodzinski90bf5b02015-08-04 16:24:20 -06001730 if (!strstr(msgString.c_str(),"may not specify framebuffer or renderpass parameters")) {
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001731 FAIL() << "Error received was not 'vkAllocCommandBuffers(): Primary Command Buffer may not specify framebuffer or renderpass parameters'";
Mark Lobodzinski90bf5b02015-08-04 16:24:20 -06001732 }
1733}
1734
1735TEST_F(VkLayerTest, SecondaryCmdBufferFramebufferAndRenderpass)
1736{
1737 VkFlags msgFlags;
1738 std::string msgString;
1739 VkResult err;
1740 VkCmdBuffer draw_cmd;
Mark Lobodzinski90bf5b02015-08-04 16:24:20 -06001741
1742 ASSERT_NO_FATAL_FAILURE(InitState());
1743 m_errorMonitor->ClearState();
1744
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001745 VkCmdBufferAllocInfo cmd = {};
1746 cmd.sType = VK_STRUCTURE_TYPE_CMD_BUFFER_ALLOC_INFO;
Cody Northrop10d8f982015-08-04 17:35:57 -06001747 cmd.pNext = NULL;
1748 cmd.cmdPool = m_cmdPool;
1749 cmd.level = VK_CMD_BUFFER_LEVEL_SECONDARY;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001750 cmd.count = 1;
Cody Northrop10d8f982015-08-04 17:35:57 -06001751
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001752 err = vkAllocCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyan2237f522015-08-18 14:40:24 -06001753 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski90bf5b02015-08-04 16:24:20 -06001754
1755 // Force the failure by not setting the Renderpass and Framebuffer fields
Cody Northrop10d8f982015-08-04 17:35:57 -06001756 VkCmdBufferBeginInfo cmd_buf_info = {};
1757 cmd_buf_info.sType = VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO;
1758 cmd_buf_info.pNext = NULL;
Courtney Goeltzenleuchtera32436b2015-10-21 18:11:04 -06001759 cmd_buf_info.flags = VK_CMD_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Mark Lobodzinski90bf5b02015-08-04 16:24:20 -06001760
1761 // The error should be caught by validation of the BeginCommandBuffer call
1762 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
1763
1764 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06001765 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error passing NULL Framebuffer/Renderpass to BeginCommandBuffer()";
Mark Lobodzinski90bf5b02015-08-04 16:24:20 -06001766 if (!strstr(msgString.c_str(),"must specify framebuffer and renderpass parameters")) {
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001767 FAIL() << "Error received was not 'vkAllocCommandBuffers(): Secondary Command Buffer must specify framebuffer and renderpass parameters'";
Mark Lobodzinski90bf5b02015-08-04 16:24:20 -06001768 }
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001769 vkFreeCommandBuffers(m_device->device(), m_cmdPool, 1, &draw_cmd);
Mark Lobodzinski90bf5b02015-08-04 16:24:20 -06001770}
1771
Tobin Ehlis254eca02015-06-25 15:46:59 -06001772TEST_F(VkLayerTest, InvalidPipelineCreateState)
1773{
1774 // Attempt to Create Gfx Pipeline w/o a VS
1775 VkFlags msgFlags;
1776 std::string msgString;
1777 VkResult err;
1778
1779 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisf2f97402015-09-11 12:57:55 -06001780 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis254eca02015-06-25 15:46:59 -06001781 m_errorMonitor->ClearState();
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06001782
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001783 VkDescriptorTypeCount ds_type_count = {};
1784 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1785 ds_type_count.count = 1;
1786
1787 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1788 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1789 ds_pool_ci.pNext = NULL;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06001790 ds_pool_ci.maxSets = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001791 ds_pool_ci.count = 1;
1792 ds_pool_ci.pTypeCount = &ds_type_count;
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06001793
Tobin Ehlis254eca02015-06-25 15:46:59 -06001794 VkDescriptorPool ds_pool;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06001795 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001796 ASSERT_VK_SUCCESS(err);
1797
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001798 VkDescriptorSetLayoutBinding dsl_binding = {};
1799 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1800 dsl_binding.arraySize = 1;
1801 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1802 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis254eca02015-06-25 15:46:59 -06001803
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001804 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1805 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1806 ds_layout_ci.pNext = NULL;
1807 ds_layout_ci.count = 1;
1808 ds_layout_ci.pBinding = &dsl_binding;
1809
Tobin Ehlis254eca02015-06-25 15:46:59 -06001810 VkDescriptorSetLayout ds_layout;
1811 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1812 ASSERT_VK_SUCCESS(err);
1813
1814 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001815 VkDescriptorSetAllocInfo alloc_info = {};
1816 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
1817 alloc_info.count = 1;
1818 alloc_info.descriptorPool = ds_pool;
1819 alloc_info.pSetLayouts = &ds_layout;
1820 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001821 ASSERT_VK_SUCCESS(err);
1822
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001823 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1824 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001825 pipeline_layout_ci.descriptorSetCount = 1;
1826 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis254eca02015-06-25 15:46:59 -06001827
1828 VkPipelineLayout pipeline_layout;
1829 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1830 ASSERT_VK_SUCCESS(err);
1831
Tobin Ehlis9e839e52015-10-01 11:15:13 -06001832 VkViewport vp = {}; // Just need dummy vp to point to
1833 VkRect2D sc = {}; // dummy scissor to point to
1834
1835 VkPipelineViewportStateCreateInfo vp_state_ci = {};
1836 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
1837 vp_state_ci.scissorCount = 1;
1838 vp_state_ci.pScissors = &sc;
1839 vp_state_ci.viewportCount = 1;
1840 vp_state_ci.pViewports = &vp;
1841
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001842 VkGraphicsPipelineCreateInfo gp_ci = {};
1843 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06001844 gp_ci.pViewportState = &vp_state_ci;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001845 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
1846 gp_ci.layout = pipeline_layout;
Tobin Ehlisf2f97402015-09-11 12:57:55 -06001847 gp_ci.renderPass = renderPass();
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001848
1849 VkPipelineCacheCreateInfo pc_ci = {};
1850 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06001851 pc_ci.initialSize = 0;
1852 pc_ci.initialData = 0;
1853 pc_ci.maxSize = 0;
Tobin Ehlis254eca02015-06-25 15:46:59 -06001854
1855 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001856 VkPipelineCache pipelineCache;
1857
1858 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1859 ASSERT_VK_SUCCESS(err);
1860 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001861
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001862 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06001863 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after creating Gfx Pipeline w/o VS.";
Tobin Ehlis254eca02015-06-25 15:46:59 -06001864 if (!strstr(msgString.c_str(),"Invalid Pipeline CreateInfo State: Vtx Shader required")) {
1865 FAIL() << "Error received was not 'Invalid Pipeline CreateInfo State: Vtx Shader required'";
1866 }
Mike Stroyan2237f522015-08-18 14:40:24 -06001867
1868 vkDestroyPipelineCache(m_device->device(), pipelineCache);
1869 vkDestroyPipelineLayout(m_device->device(), pipeline_layout);
Mike Stroyan2237f522015-08-18 14:40:24 -06001870 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
1871 vkDestroyDescriptorPool(m_device->device(), ds_pool);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001872}
Tobin Ehlis20693172015-09-17 08:46:18 -06001873/*// TODO : This test should be good, but needs Tess support in compiler to run
1874TEST_F(VkLayerTest, InvalidPatchControlPoints)
1875{
1876 // Attempt to Create Gfx Pipeline w/o a VS
1877 VkFlags msgFlags;
1878 std::string msgString;
1879 VkResult err;
Tobin Ehlis254eca02015-06-25 15:46:59 -06001880
Tobin Ehlis20693172015-09-17 08:46:18 -06001881 ASSERT_NO_FATAL_FAILURE(InitState());
1882 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1883 m_errorMonitor->ClearState();
1884
1885 VkDescriptorTypeCount ds_type_count = {};
1886 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1887 ds_type_count.count = 1;
1888
1889 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1890 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1891 ds_pool_ci.pNext = NULL;
1892 ds_pool_ci.count = 1;
1893 ds_pool_ci.pTypeCount = &ds_type_count;
1894
1895 VkDescriptorPool ds_pool;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001896 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, &ds_pool);
Tobin Ehlis20693172015-09-17 08:46:18 -06001897 ASSERT_VK_SUCCESS(err);
1898
1899 VkDescriptorSetLayoutBinding dsl_binding = {};
1900 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1901 dsl_binding.arraySize = 1;
1902 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1903 dsl_binding.pImmutableSamplers = NULL;
1904
1905 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1906 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1907 ds_layout_ci.pNext = NULL;
1908 ds_layout_ci.count = 1;
1909 ds_layout_ci.pBinding = &dsl_binding;
1910
1911 VkDescriptorSetLayout ds_layout;
1912 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1913 ASSERT_VK_SUCCESS(err);
1914
1915 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06001916 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis20693172015-09-17 08:46:18 -06001917 ASSERT_VK_SUCCESS(err);
1918
1919 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1920 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1921 pipeline_layout_ci.pNext = NULL;
1922 pipeline_layout_ci.descriptorSetCount = 1;
1923 pipeline_layout_ci.pSetLayouts = &ds_layout;
1924
1925 VkPipelineLayout pipeline_layout;
1926 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1927 ASSERT_VK_SUCCESS(err);
1928
1929 VkPipelineShaderStageCreateInfo shaderStages[3];
1930 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
1931
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06001932 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT, this);
Tobin Ehlis20693172015-09-17 08:46:18 -06001933 // Just using VS txt for Tess shaders as we don't care about functionality
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06001934 VkShaderObj tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
1935 VkShaderObj te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
Tobin Ehlis20693172015-09-17 08:46:18 -06001936
1937 shaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06001938 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis20693172015-09-17 08:46:18 -06001939 shaderStages[0].shader = vs.handle();
1940 shaderStages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06001941 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis20693172015-09-17 08:46:18 -06001942 shaderStages[1].shader = tc.handle();
1943 shaderStages[2].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06001944 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis20693172015-09-17 08:46:18 -06001945 shaderStages[2].shader = te.handle();
1946
1947 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
1948 iaCI.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
1949 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH;
1950
1951 VkPipelineTessellationStateCreateInfo tsCI = {};
1952 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
1953 tsCI.patchControlPoints = 0; // This will cause an error
1954
1955 VkGraphicsPipelineCreateInfo gp_ci = {};
1956 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1957 gp_ci.pNext = NULL;
1958 gp_ci.stageCount = 3;
1959 gp_ci.pStages = shaderStages;
1960 gp_ci.pVertexInputState = NULL;
1961 gp_ci.pInputAssemblyState = &iaCI;
1962 gp_ci.pTessellationState = &tsCI;
1963 gp_ci.pViewportState = NULL;
1964 gp_ci.pRasterState = NULL;
1965 gp_ci.pMultisampleState = NULL;
1966 gp_ci.pDepthStencilState = NULL;
1967 gp_ci.pColorBlendState = NULL;
1968 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
1969 gp_ci.layout = pipeline_layout;
1970 gp_ci.renderPass = renderPass();
1971
1972 VkPipelineCacheCreateInfo pc_ci = {};
1973 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
1974 pc_ci.pNext = NULL;
1975 pc_ci.initialSize = 0;
1976 pc_ci.initialData = 0;
1977 pc_ci.maxSize = 0;
1978
1979 VkPipeline pipeline;
1980 VkPipelineCache pipelineCache;
1981
1982 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1983 ASSERT_VK_SUCCESS(err);
1984 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
1985
1986 msgFlags = m_errorMonitor->GetState(&msgString);
1987 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after creating Tess Gfx Pipeline w/ 0 patchControlPoints.";
1988 if (!strstr(msgString.c_str(),"Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH primitive ")) {
1989 FAIL() << "Error received was not 'Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH primitive...' but instead '" << msgString.c_str() << "'";
1990 }
Mike Stroyan2237f522015-08-18 14:40:24 -06001991
1992 vkDestroyPipelineCache(m_device->device(), pipelineCache);
1993 vkDestroyPipelineLayout(m_device->device(), pipeline_layout);
Mike Stroyan2237f522015-08-18 14:40:24 -06001994 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
1995 vkDestroyDescriptorPool(m_device->device(), ds_pool);
Tobin Ehlis20693172015-09-17 08:46:18 -06001996}
1997*/
Tobin Ehlis9e839e52015-10-01 11:15:13 -06001998// Set scissor and viewport counts to different numbers
1999TEST_F(VkLayerTest, PSOViewportScissorCountMismatch)
2000{
2001 // Attempt to Create Gfx Pipeline w/o a VS
2002 VkFlags msgFlags;
2003 std::string msgString;
2004 VkResult err;
2005
2006 ASSERT_NO_FATAL_FAILURE(InitState());
2007 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2008 m_errorMonitor->ClearState();
2009
2010 VkDescriptorTypeCount ds_type_count = {};
2011 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2012 ds_type_count.count = 1;
2013
2014 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2015 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002016 ds_pool_ci.maxSets = 1;
2017 ds_pool_ci.count = 1;
2018 ds_pool_ci.pTypeCount = &ds_type_count;
2019
2020 VkDescriptorPool ds_pool;
2021 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
2022 ASSERT_VK_SUCCESS(err);
2023
2024 VkDescriptorSetLayoutBinding dsl_binding = {};
2025 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2026 dsl_binding.arraySize = 1;
2027 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2028
2029 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2030 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2031 ds_layout_ci.count = 1;
2032 ds_layout_ci.pBinding = &dsl_binding;
2033
2034 VkDescriptorSetLayout ds_layout;
2035 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
2036 ASSERT_VK_SUCCESS(err);
2037
2038 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06002039 VkDescriptorSetAllocInfo alloc_info = {};
2040 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
2041 alloc_info.count = 1;
2042 alloc_info.descriptorPool = ds_pool;
2043 alloc_info.pSetLayouts = &ds_layout;
2044 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002045 ASSERT_VK_SUCCESS(err);
2046
2047 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
2048 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2049 pipeline_layout_ci.descriptorSetCount = 1;
2050 pipeline_layout_ci.pSetLayouts = &ds_layout;
2051
2052 VkPipelineLayout pipeline_layout;
2053 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
2054 ASSERT_VK_SUCCESS(err);
2055
2056 VkViewport vp = {}; // Just need dummy vp to point to
2057
2058 VkPipelineViewportStateCreateInfo vp_state_ci = {};
2059 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2060 vp_state_ci.scissorCount = 0;
2061 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
2062 vp_state_ci.pViewports = &vp;
2063
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002064 VkPipelineShaderStageCreateInfo shaderStages[2];
2065 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002066
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06002067 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT, this);
2068 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // TODO - We shouldn't need a fragment shader
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002069 // but add it to be able to run on more devices
2070 shaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002071 shaderStages[0].shader = vs.handle();
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002072
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002073 shaderStages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002074 shaderStages[1].shader = fs.handle();
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002075
2076 VkGraphicsPipelineCreateInfo gp_ci = {};
2077 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002078 gp_ci.stageCount = 2;
2079 gp_ci.pStages = shaderStages;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002080 gp_ci.pViewportState = &vp_state_ci;
2081 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2082 gp_ci.layout = pipeline_layout;
2083 gp_ci.renderPass = renderPass();
2084
2085 VkPipelineCacheCreateInfo pc_ci = {};
2086 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2087
2088 VkPipeline pipeline;
2089 VkPipelineCache pipelineCache;
2090
2091 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
2092 ASSERT_VK_SUCCESS(err);
2093 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
2094
2095 msgFlags = m_errorMonitor->GetState(&msgString);
2096 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after creating Gfx Pipeline w/ viewport and scissor count mismatch.";
2097 if (!strstr(msgString.c_str(),"Gfx Pipeline viewport count (1) must match scissor count (0).")) {
2098 FAIL() << "Error received was not 'Gfx Pipeline viewport count (1) must match scissor count (0).' but instead it was '" << msgString.c_str() << "'";
2099 }
2100
2101 vkDestroyPipelineCache(m_device->device(), pipelineCache);
2102 vkDestroyPipelineLayout(m_device->device(), pipeline_layout);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002103 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
2104 vkDestroyDescriptorPool(m_device->device(), ds_pool);
2105}
Tobin Ehlisa88e2f52015-10-02 11:00:56 -06002106// Don't set viewport state in PSO. This is an error b/c we always need this state
2107// for the counts even if the data is going to be set dynamically.
2108TEST_F(VkLayerTest, PSOViewportStateNotSet)
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002109{
2110 // Attempt to Create Gfx Pipeline w/o a VS
2111 VkFlags msgFlags;
2112 std::string msgString;
2113 VkResult err;
2114
2115 ASSERT_NO_FATAL_FAILURE(InitState());
2116 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2117 m_errorMonitor->ClearState();
2118
2119 VkDescriptorTypeCount ds_type_count = {};
2120 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2121 ds_type_count.count = 1;
2122
2123 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2124 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002125 ds_pool_ci.maxSets = 1;
2126 ds_pool_ci.count = 1;
2127 ds_pool_ci.pTypeCount = &ds_type_count;
2128
2129 VkDescriptorPool ds_pool;
2130 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
2131 ASSERT_VK_SUCCESS(err);
2132
2133 VkDescriptorSetLayoutBinding dsl_binding = {};
2134 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2135 dsl_binding.arraySize = 1;
2136 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2137
2138 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2139 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2140 ds_layout_ci.count = 1;
2141 ds_layout_ci.pBinding = &dsl_binding;
2142
2143 VkDescriptorSetLayout ds_layout;
2144 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
2145 ASSERT_VK_SUCCESS(err);
2146
2147 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06002148 VkDescriptorSetAllocInfo alloc_info = {};
2149 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
2150 alloc_info.count = 1;
2151 alloc_info.descriptorPool = ds_pool;
2152 alloc_info.pSetLayouts = &ds_layout;
2153 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002154 ASSERT_VK_SUCCESS(err);
2155
2156 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
2157 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2158 pipeline_layout_ci.descriptorSetCount = 1;
2159 pipeline_layout_ci.pSetLayouts = &ds_layout;
2160
2161 VkPipelineLayout pipeline_layout;
2162 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
2163 ASSERT_VK_SUCCESS(err);
2164
2165 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
2166 // Set scissor as dynamic to avoid second error
2167 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
2168 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
2169 dyn_state_ci.dynamicStateCount = 1;
2170 dyn_state_ci.pDynamicStates = &sc_state;
2171
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002172 VkPipelineShaderStageCreateInfo shaderStages[2];
2173 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002174
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06002175 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT, this);
2176 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // TODO - We shouldn't need a fragment shader
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002177 // but add it to be able to run on more devices
2178 shaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002179 shaderStages[0].shader = vs.handle();
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002180
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002181 shaderStages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002182 shaderStages[1].shader = fs.handle();
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002183
2184 VkGraphicsPipelineCreateInfo gp_ci = {};
2185 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002186 gp_ci.stageCount = 2;
2187 gp_ci.pStages = shaderStages;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002188 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state should cause validation error
2189 gp_ci.pDynamicState = &dyn_state_ci;
2190 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2191 gp_ci.layout = pipeline_layout;
2192 gp_ci.renderPass = renderPass();
2193
2194 VkPipelineCacheCreateInfo pc_ci = {};
2195 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2196
2197 VkPipeline pipeline;
2198 VkPipelineCache pipelineCache;
2199
2200 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
2201 ASSERT_VK_SUCCESS(err);
2202 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
2203
2204 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlisa88e2f52015-10-02 11:00:56 -06002205 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after creating Gfx Pipeline w/o viewport state set.";
2206 if (!strstr(msgString.c_str(),"Gfx Pipeline pViewportState is null. Even if ")) {
2207 FAIL() << "Error received was not 'Gfx Pipeline pViewportState is null. Even if...' but instead it was '" << msgString.c_str() << "'";
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002208 }
2209
2210 vkDestroyPipelineCache(m_device->device(), pipelineCache);
2211 vkDestroyPipelineLayout(m_device->device(), pipeline_layout);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002212 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
2213 vkDestroyDescriptorPool(m_device->device(), ds_pool);
2214}
2215// Create PSO w/o non-zero viewportCount but no viewport data
Tobin Ehlisa88e2f52015-10-02 11:00:56 -06002216// Then run second test where dynamic scissor count doesn't match PSO scissor count
2217TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch)
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002218{
2219 VkFlags msgFlags;
2220 std::string msgString;
2221 VkResult err;
2222
2223 ASSERT_NO_FATAL_FAILURE(InitState());
2224 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2225 m_errorMonitor->ClearState();
2226
2227 VkDescriptorTypeCount ds_type_count = {};
2228 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2229 ds_type_count.count = 1;
2230
2231 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2232 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002233 ds_pool_ci.maxSets = 1;
2234 ds_pool_ci.count = 1;
2235 ds_pool_ci.pTypeCount = &ds_type_count;
2236
2237 VkDescriptorPool ds_pool;
2238 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
2239 ASSERT_VK_SUCCESS(err);
2240
2241 VkDescriptorSetLayoutBinding dsl_binding = {};
2242 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2243 dsl_binding.arraySize = 1;
2244 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2245
2246 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2247 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2248 ds_layout_ci.count = 1;
2249 ds_layout_ci.pBinding = &dsl_binding;
2250
2251 VkDescriptorSetLayout ds_layout;
2252 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
2253 ASSERT_VK_SUCCESS(err);
2254
2255 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06002256 VkDescriptorSetAllocInfo alloc_info = {};
2257 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
2258 alloc_info.count = 1;
2259 alloc_info.descriptorPool = ds_pool;
2260 alloc_info.pSetLayouts = &ds_layout;
2261 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002262 ASSERT_VK_SUCCESS(err);
2263
2264 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
2265 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2266 pipeline_layout_ci.descriptorSetCount = 1;
2267 pipeline_layout_ci.pSetLayouts = &ds_layout;
2268
2269 VkPipelineLayout pipeline_layout;
2270 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
2271 ASSERT_VK_SUCCESS(err);
2272
2273 VkPipelineViewportStateCreateInfo vp_state_ci = {};
2274 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2275 vp_state_ci.viewportCount = 1;
2276 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
2277 vp_state_ci.scissorCount = 1;
2278 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
2279
2280 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
2281 // Set scissor as dynamic to avoid that error
2282 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
2283 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
2284 dyn_state_ci.dynamicStateCount = 1;
2285 dyn_state_ci.pDynamicStates = &sc_state;
2286
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002287 VkPipelineShaderStageCreateInfo shaderStages[2];
2288 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002289
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06002290 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT, this);
2291 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // TODO - We shouldn't need a fragment shader
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002292 // but add it to be able to run on more devices
2293 shaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002294 shaderStages[0].shader = vs.handle();
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002295
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002296 shaderStages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002297 shaderStages[1].shader = fs.handle();
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002298
Cody Northrop42cbe3b2015-10-06 10:33:21 -06002299 VkPipelineVertexInputStateCreateInfo vi_ci = {};
2300 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
2301 vi_ci.pNext = nullptr;
2302 vi_ci.bindingCount = 0;
2303 vi_ci.pVertexBindingDescriptions = nullptr;
2304 vi_ci.attributeCount = 0;
2305 vi_ci.pVertexAttributeDescriptions = nullptr;
2306
2307 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
2308 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
2309 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
2310
2311 VkPipelineRasterStateCreateInfo rs_ci = {};
2312 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTER_STATE_CREATE_INFO;
2313 rs_ci.pNext = nullptr;
2314
2315 VkPipelineColorBlendStateCreateInfo cb_ci = {};
2316 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
2317 cb_ci.pNext = nullptr;
2318
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002319 VkGraphicsPipelineCreateInfo gp_ci = {};
2320 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002321 gp_ci.stageCount = 2;
2322 gp_ci.pStages = shaderStages;
Cody Northrop42cbe3b2015-10-06 10:33:21 -06002323 gp_ci.pVertexInputState = &vi_ci;
2324 gp_ci.pInputAssemblyState = &ia_ci;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002325 gp_ci.pViewportState = &vp_state_ci;
Cody Northrop42cbe3b2015-10-06 10:33:21 -06002326 gp_ci.pRasterState = &rs_ci;
2327 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002328 gp_ci.pDynamicState = &dyn_state_ci;
2329 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2330 gp_ci.layout = pipeline_layout;
2331 gp_ci.renderPass = renderPass();
2332
2333 VkPipelineCacheCreateInfo pc_ci = {};
2334 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2335
2336 VkPipeline pipeline;
2337 VkPipelineCache pipelineCache;
2338
2339 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
2340 ASSERT_VK_SUCCESS(err);
2341 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
2342
2343 msgFlags = m_errorMonitor->GetState(&msgString);
2344 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after creating Gfx Pipeline w/o scissor set.";
2345 if (!strstr(msgString.c_str(),"Gfx Pipeline viewportCount is 1, but pViewports is NULL. ")) {
2346 FAIL() << "Error received was not 'Gfx Pipeline viewportCount is 1, but pViewports is NULL...' but instead it was '" << msgString.c_str() << "'";
2347 }
Tobin Ehlisa88e2f52015-10-02 11:00:56 -06002348 m_errorMonitor->ClearState();
2349 // Now hit second fail case where we set scissor w/ different count than PSO
2350 // First need to successfully create the PSO from above by setting pViewports
2351 VkViewport vp = {}; // Just need dummy vp to point to
2352 vp_state_ci.pViewports = &vp;
2353 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
2354 ASSERT_VK_SUCCESS(err);
2355 BeginCommandBuffer();
2356 vkCmdBindPipeline(m_cmdBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2357 VkRect2D scissors[2] = {}; // don't care about data
2358 // Count of 2 doesn't match PSO count of 1
2359 vkCmdSetScissor(m_cmdBuffer->GetBufferHandle(), 2, scissors);
2360 Draw(1, 0, 0, 0);
2361
2362 msgFlags = m_errorMonitor->GetState(&msgString);
2363 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after setting dynamic scissorCount different from PSO scissorCount.";
2364 if (!strstr(msgString.c_str(),"Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO scissorCount is 1. These counts must match.")) {
2365 FAIL() << "Error received was not 'Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO scissorCount is 1...' but instead it was '" << msgString.c_str() << "'";
2366 }
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002367
2368 vkDestroyPipelineCache(m_device->device(), pipelineCache);
2369 vkDestroyPipelineLayout(m_device->device(), pipeline_layout);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002370 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
2371 vkDestroyDescriptorPool(m_device->device(), ds_pool);
2372}
2373// Create PSO w/o non-zero scissorCount but no scissor data
Tobin Ehlisa88e2f52015-10-02 11:00:56 -06002374// Then run second test where dynamic viewportCount doesn't match PSO viewportCount
2375TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch)
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002376{
2377 VkFlags msgFlags;
2378 std::string msgString;
2379 VkResult err;
2380
2381 ASSERT_NO_FATAL_FAILURE(InitState());
2382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2383 m_errorMonitor->ClearState();
2384
2385 VkDescriptorTypeCount ds_type_count = {};
2386 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2387 ds_type_count.count = 1;
2388
2389 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2390 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002391 ds_pool_ci.maxSets = 1;
2392 ds_pool_ci.count = 1;
2393 ds_pool_ci.pTypeCount = &ds_type_count;
2394
2395 VkDescriptorPool ds_pool;
2396 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
2397 ASSERT_VK_SUCCESS(err);
2398
2399 VkDescriptorSetLayoutBinding dsl_binding = {};
2400 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2401 dsl_binding.arraySize = 1;
2402 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2403
2404 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2405 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2406 ds_layout_ci.count = 1;
2407 ds_layout_ci.pBinding = &dsl_binding;
2408
2409 VkDescriptorSetLayout ds_layout;
2410 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
2411 ASSERT_VK_SUCCESS(err);
2412
2413 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06002414 VkDescriptorSetAllocInfo alloc_info = {};
2415 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
2416 alloc_info.count = 1;
2417 alloc_info.descriptorPool = ds_pool;
2418 alloc_info.pSetLayouts = &ds_layout;
2419 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002420 ASSERT_VK_SUCCESS(err);
2421
2422 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
2423 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2424 pipeline_layout_ci.descriptorSetCount = 1;
2425 pipeline_layout_ci.pSetLayouts = &ds_layout;
2426
2427 VkPipelineLayout pipeline_layout;
2428 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
2429 ASSERT_VK_SUCCESS(err);
2430
2431 VkPipelineViewportStateCreateInfo vp_state_ci = {};
2432 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
2433 vp_state_ci.scissorCount = 1;
2434 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
2435 vp_state_ci.viewportCount = 1;
2436 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
2437
2438 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
2439 // Set scissor as dynamic to avoid that error
2440 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
2441 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
2442 dyn_state_ci.dynamicStateCount = 1;
2443 dyn_state_ci.pDynamicStates = &vp_state;
2444
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002445 VkPipelineShaderStageCreateInfo shaderStages[2];
2446 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002447
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06002448 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT, this);
2449 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // TODO - We shouldn't need a fragment shader
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002450 // but add it to be able to run on more devices
2451 shaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002452 shaderStages[0].shader = vs.handle();
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002453
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002454 shaderStages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002455 shaderStages[1].shader = fs.handle();
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002456
Cody Northrop42cbe3b2015-10-06 10:33:21 -06002457 VkPipelineVertexInputStateCreateInfo vi_ci = {};
2458 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
2459 vi_ci.pNext = nullptr;
2460 vi_ci.bindingCount = 0;
2461 vi_ci.pVertexBindingDescriptions = nullptr;
2462 vi_ci.attributeCount = 0;
2463 vi_ci.pVertexAttributeDescriptions = nullptr;
2464
2465 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
2466 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
2467 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
2468
2469 VkPipelineRasterStateCreateInfo rs_ci = {};
2470 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTER_STATE_CREATE_INFO;
2471 rs_ci.pNext = nullptr;
2472
2473 VkPipelineColorBlendStateCreateInfo cb_ci = {};
2474 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
2475 cb_ci.pNext = nullptr;
2476
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002477 VkGraphicsPipelineCreateInfo gp_ci = {};
2478 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
Cody Northrop1a0f3e62015-10-05 14:44:45 -06002479 gp_ci.stageCount = 2;
2480 gp_ci.pStages = shaderStages;
Cody Northrop42cbe3b2015-10-06 10:33:21 -06002481 gp_ci.pVertexInputState = &vi_ci;
2482 gp_ci.pInputAssemblyState = &ia_ci;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002483 gp_ci.pViewportState = &vp_state_ci;
Cody Northrop42cbe3b2015-10-06 10:33:21 -06002484 gp_ci.pRasterState = &rs_ci;
2485 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002486 gp_ci.pDynamicState = &dyn_state_ci;
2487 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
2488 gp_ci.layout = pipeline_layout;
2489 gp_ci.renderPass = renderPass();
2490
2491 VkPipelineCacheCreateInfo pc_ci = {};
2492 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2493
2494 VkPipeline pipeline;
2495 VkPipelineCache pipelineCache;
2496
2497 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
2498 ASSERT_VK_SUCCESS(err);
2499 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
2500
2501 msgFlags = m_errorMonitor->GetState(&msgString);
2502 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after creating Gfx Pipeline w/o scissor set.";
2503 if (!strstr(msgString.c_str(),"Gfx Pipeline scissorCount is 1, but pScissors is NULL. ")) {
2504 FAIL() << "Error received was not 'Gfx Pipeline scissorCount is 1, but pScissors is NULL...' but instead it was '" << msgString.c_str() << "'";
2505 }
Tobin Ehlisa88e2f52015-10-02 11:00:56 -06002506 m_errorMonitor->ClearState();
2507 // Now hit second fail case where we set scissor w/ different count than PSO
2508 // First need to successfully create the PSO from above by setting pViewports
2509 VkRect2D sc = {}; // Just need dummy vp to point to
2510 vp_state_ci.pScissors = &sc;
2511 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
2512 ASSERT_VK_SUCCESS(err);
2513 BeginCommandBuffer();
2514 vkCmdBindPipeline(m_cmdBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2515 VkViewport viewports[2] = {}; // don't care about data
2516 // Count of 2 doesn't match PSO count of 1
2517 vkCmdSetViewport(m_cmdBuffer->GetBufferHandle(), 2, viewports);
2518 Draw(1, 0, 0, 0);
2519
2520 msgFlags = m_errorMonitor->GetState(&msgString);
2521 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after setting dynamic viewportCount different from PSO viewportCount.";
2522 if (!strstr(msgString.c_str(),"Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO viewportCount is 1. These counts must match.")) {
2523 FAIL() << "Error received was not 'Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO viewportCount is 1...' but instead it was '" << msgString.c_str() << "'";
2524 }
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002525
2526 vkDestroyPipelineCache(m_device->device(), pipelineCache);
2527 vkDestroyPipelineLayout(m_device->device(), pipeline_layout);
Tobin Ehlis9e839e52015-10-01 11:15:13 -06002528 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
2529 vkDestroyDescriptorPool(m_device->device(), ds_pool);
2530}
2531
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06002532TEST_F(VkLayerTest, NullRenderPass)
2533{
2534 // Bind a NULL RenderPass
2535 VkFlags msgFlags;
2536 std::string msgString;
2537
2538 ASSERT_NO_FATAL_FAILURE(InitState());
2539 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2540 m_errorMonitor->ClearState();
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06002541
Tony Barbour1490c912015-07-28 10:17:20 -06002542 BeginCommandBuffer();
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06002543 // Don't care about RenderPass handle b/c error should be flagged before that
Tony Barbour1490c912015-07-28 10:17:20 -06002544 vkCmdBeginRenderPass(m_cmdBuffer->GetBufferHandle(), NULL, VK_RENDER_PASS_CONTENTS_INLINE);
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06002545
2546 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06002547 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after binding NULL RenderPass.";
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06002548 if (!strstr(msgString.c_str(),"You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()")) {
2549 FAIL() << "Error received was not 'You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()'";
2550 }
2551}
2552
Tobin Ehlis254eca02015-06-25 15:46:59 -06002553TEST_F(VkLayerTest, RenderPassWithinRenderPass)
2554{
2555 // Bind a BeginRenderPass within an active RenderPass
2556 VkFlags msgFlags;
2557 std::string msgString;
2558
2559 ASSERT_NO_FATAL_FAILURE(InitState());
2560 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2561 m_errorMonitor->ClearState();
Tobin Ehlis254eca02015-06-25 15:46:59 -06002562
Tony Barbour1490c912015-07-28 10:17:20 -06002563 BeginCommandBuffer();
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06002564 // Just create a dummy Renderpass that's non-NULL so we can get to the proper error
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002565 VkRenderPassBeginInfo rp_begin = {};
2566 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
2567 rp_begin.pNext = NULL;
Tobin Ehlisf2f97402015-09-11 12:57:55 -06002568 rp_begin.renderPass = renderPass();
2569 rp_begin.framebuffer = framebuffer();
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06002570
Tony Barbour1490c912015-07-28 10:17:20 -06002571 vkCmdBeginRenderPass(m_cmdBuffer->GetBufferHandle(), &rp_begin, VK_RENDER_PASS_CONTENTS_INLINE);
Tobin Ehlis254eca02015-06-25 15:46:59 -06002572
2573 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06002574 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after binding RenderPass w/i an active RenderPass.";
Mark Lobodzinskia0f061c2015-09-30 16:19:16 -06002575 if (!strstr(msgString.c_str(),"It is invalid to issue this call inside an active render pass")) {
2576 FAIL() << "Error received was not 'It is invalid to issue this call inside an active render pass...'";
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06002577 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06002578}
2579
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06002580TEST_F(VkLayerTest, FillBufferWithinRenderPass)
2581{
2582 // Call CmdFillBuffer within an active renderpass
2583 VkFlags msgFlags;
2584 std::string msgString;
2585
2586 ASSERT_NO_FATAL_FAILURE(InitState());
2587 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2588 m_errorMonitor->ClearState();
2589
2590 // Renderpass is started here
2591 BeginCommandBuffer();
2592
2593 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
2594 vk_testing::Buffer destBuffer;
2595 destBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
2596
2597 m_cmdBuffer->FillBuffer(destBuffer.handle(), 0, 4, 0x11111111);
2598
2599 msgFlags = m_errorMonitor->GetState(&msgString);
2600 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) <<
2601 "Did not receive error after calling CmdFillBuffer w/i an active RenderPass.";
Mark Lobodzinskia0f061c2015-09-30 16:19:16 -06002602 if (!strstr(msgString.c_str(),"It is invalid to issue this call inside an active render pass")) {
2603 FAIL() << "Error received was not 'It is invalid to issue this call inside an active render pass...'";
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06002604 }
2605}
2606
2607TEST_F(VkLayerTest, UpdateBufferWithinRenderPass)
2608{
2609 // Call CmdUpdateBuffer within an active renderpass
2610 VkFlags msgFlags;
2611 std::string msgString;
2612
2613 ASSERT_NO_FATAL_FAILURE(InitState());
2614 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2615 m_errorMonitor->ClearState();
2616
2617 // Renderpass is started here
2618 BeginCommandBuffer();
2619
2620 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
2621 vk_testing::Buffer destBuffer;
2622 destBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
2623
2624 VkDeviceSize destOffset = 0;
2625 VkDeviceSize dataSize = 1024;
2626 const uint32_t *pData = NULL;
2627
2628 vkCmdUpdateBuffer(m_cmdBuffer->GetBufferHandle(), destBuffer.handle(), destOffset, dataSize, pData);
2629
2630 msgFlags = m_errorMonitor->GetState(&msgString);
2631 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) <<
2632 "Did not receive error after calling CmdUpdateBuffer w/i an active RenderPass.";
Mark Lobodzinskia0f061c2015-09-30 16:19:16 -06002633 if (!strstr(msgString.c_str(),"It is invalid to issue this call inside an active render pass")) {
2634 FAIL() << "Error received was not 'It is invalid to issue this call inside an active render pass...'";
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06002635 }
2636}
2637
2638TEST_F(VkLayerTest, ClearColorImageWithinRenderPass)
2639{
2640 // Call CmdClearColorImage within an active RenderPass
2641 VkFlags msgFlags;
2642 std::string msgString;
2643
2644 ASSERT_NO_FATAL_FAILURE(InitState());
2645 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2646 m_errorMonitor->ClearState();
2647
2648 // Renderpass is started here
2649 BeginCommandBuffer();
2650
2651 VkClearColorValue clear_color = {0};
2652 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
2653 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2654 const int32_t tex_width = 32;
2655 const int32_t tex_height = 32;
2656 VkImageCreateInfo image_create_info = {};
2657 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2658 image_create_info.pNext = NULL;
2659 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2660 image_create_info.format = tex_format;
2661 image_create_info.extent.width = tex_width;
2662 image_create_info.extent.height = tex_height;
2663 image_create_info.extent.depth = 1;
2664 image_create_info.mipLevels = 1;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -06002665 image_create_info.arrayLayers = 1;
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06002666 image_create_info.samples = 1;
2667 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2668 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2669
2670 vk_testing::Image destImage;
2671 destImage.init(*m_device, (const VkImageCreateInfo&)image_create_info, reqs);
2672
2673 const VkImageSubresourceRange range =
2674 vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
2675
2676 vkCmdClearColorImage(m_cmdBuffer->GetBufferHandle(),
2677 destImage.handle(),
2678 VK_IMAGE_LAYOUT_GENERAL,
2679 &clear_color,
2680 1,
2681 &range);
2682
2683 msgFlags = m_errorMonitor->GetState(&msgString);
2684 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) <<
2685 "Did not receive error after calling CmdClearColorImage w/i an active RenderPass.";
Mark Lobodzinskia0f061c2015-09-30 16:19:16 -06002686 if (!strstr(msgString.c_str(),"It is invalid to issue this call inside an active render pass")) {
2687 FAIL() << "Error received was not 'It is invalid to issue this call inside an active render pass...'";
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06002688 }
2689}
2690
2691TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass)
2692{
2693 // Call CmdClearDepthStencilImage within an active RenderPass
2694 VkFlags msgFlags;
2695 std::string msgString;
2696
2697 ASSERT_NO_FATAL_FAILURE(InitState());
2698 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2699 m_errorMonitor->ClearState();
2700
2701 // Renderpass is started here
2702 BeginCommandBuffer();
2703
2704 VkClearDepthStencilValue clear_value = {0};
2705 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
2706 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
2707 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2708 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
2709 image_create_info.extent.width = 64;
2710 image_create_info.extent.height = 64;
2711 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2712 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
2713
2714 vk_testing::Image destImage;
2715 destImage.init(*m_device, (const VkImageCreateInfo&)image_create_info, reqs);
2716
2717 const VkImageSubresourceRange range =
2718 vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
2719
2720 vkCmdClearDepthStencilImage(m_cmdBuffer->GetBufferHandle(),
2721 destImage.handle(),
2722 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
2723 &clear_value,
2724 1,
2725 &range);
2726
2727 msgFlags = m_errorMonitor->GetState(&msgString);
2728 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) <<
2729 "Did not receive error after calling CmdClearDepthStencilImage w/i an active RenderPass.";
Mark Lobodzinskia0f061c2015-09-30 16:19:16 -06002730 if (!strstr(msgString.c_str(),"It is invalid to issue this call inside an active render pass")) {
2731 FAIL() << "Error received was not 'It is invalid to issue this call inside an active render pass...'";
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06002732 }
2733}
2734
2735TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass)
2736{
Courtney Goeltzenleuchter9feb0732015-10-15 16:51:05 -06002737 // Call CmdClearAttachmentss outside of an active RenderPass
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06002738 VkFlags msgFlags;
2739 std::string msgString;
2740 VkResult err;
2741
2742 ASSERT_NO_FATAL_FAILURE(InitState());
2743 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2744 m_errorMonitor->ClearState();
2745
2746 // Start no RenderPass
2747 err = m_cmdBuffer->BeginCommandBuffer();
2748 ASSERT_VK_SUCCESS(err);
2749
Courtney Goeltzenleuchter9feb0732015-10-15 16:51:05 -06002750 VkClearAttachment color_attachment;
2751 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2752 color_attachment.clearValue.color.float32[0] = 0;
2753 color_attachment.clearValue.color.float32[1] = 0;
2754 color_attachment.clearValue.color.float32[2] = 0;
2755 color_attachment.clearValue.color.float32[3] = 0;
2756 color_attachment.colorAttachment = 0;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -06002757 VkClearRect clear_rect = { { { 0, 0 }, { 32, 32 } } };
Courtney Goeltzenleuchter9feb0732015-10-15 16:51:05 -06002758 vkCmdClearAttachments(m_cmdBuffer->GetBufferHandle(),
2759 1, &color_attachment,
2760 1, &clear_rect);
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06002761
2762 msgFlags = m_errorMonitor->GetState(&msgString);
2763 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) <<
Courtney Goeltzenleuchter9feb0732015-10-15 16:51:05 -06002764 "Did not receive error after calling CmdClearAttachments outside of an active RenderPass.";
2765 if (!strstr(msgString.c_str(),"vkCmdClearAttachments: This call must be issued inside an active render pass")) {
2766 FAIL() << "Error received was not 'vkCmdClearAttachments: This call must be issued inside an active render pass.'";
Mark Lobodzinskif5b3cc12015-09-24 09:51:47 -06002767 }
2768}
2769
Tobin Ehlis138b7f12015-05-22 12:38:55 -06002770TEST_F(VkLayerTest, InvalidDynamicStateObject)
2771{
2772 // Create a valid cmd buffer
2773 // call vkCmdBindDynamicStateObject w/ false DS Obj
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06002774 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
2775 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -06002776}
Tobin Ehlis201b1ba2015-05-27 14:55:35 -06002777
Tobin Ehlis8d199e52015-09-17 12:24:13 -06002778TEST_F(VkLayerTest, IdxBufferAlignmentError)
2779{
2780 // Bind a BeginRenderPass within an active RenderPass
2781 VkFlags msgFlags;
2782 std::string msgString;
2783 VkResult err;
2784
2785 ASSERT_NO_FATAL_FAILURE(InitState());
2786 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2787 m_errorMonitor->ClearState();
2788 uint32_t qfi = 0;
2789 VkBufferCreateInfo buffCI = {};
2790 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2791 buffCI.size = 1024;
2792 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
2793 buffCI.queueFamilyCount = 1;
2794 buffCI.pQueueFamilyIndices = &qfi;
2795
2796 VkBuffer ib;
2797 err = vkCreateBuffer(m_device->device(), &buffCI, &ib);
2798 ASSERT_VK_SUCCESS(err);
2799
2800 BeginCommandBuffer();
2801 ASSERT_VK_SUCCESS(err);
2802 //vkCmdBindPipeline(m_cmdBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2803 // Should error before calling to driver so don't care about actual data
2804 vkCmdBindIndexBuffer(m_cmdBuffer->GetBufferHandle(), ib, 7, VK_INDEX_TYPE_UINT16);
2805
2806 msgFlags = m_errorMonitor->GetState(&msgString);
2807 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after vkCmdBindVertexBuffers() w/o active RenderPass.";
2808 if (!strstr(msgString.c_str(),"vkCmdBindIndexBuffer() offset (0x7) does not fall on ")) {
2809 FAIL() << "Error received was not 'vkCmdBindIndexBuffer() offset (0x7) does not fall on ...' but instead '" << msgString.c_str() << "'";
2810 }
Mike Stroyan2237f522015-08-18 14:40:24 -06002811
2812 vkDestroyBuffer(m_device->device(), ib);
Tobin Ehlis8d199e52015-09-17 12:24:13 -06002813}
2814
Tobin Ehlis5f728d32015-09-17 14:18:16 -06002815TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB)
2816{
2817 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be secondary)
2818 VkFlags msgFlags;
2819 std::string msgString;
2820
2821 ASSERT_NO_FATAL_FAILURE(InitState());
2822 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2823 m_errorMonitor->ClearState();
2824
2825 BeginCommandBuffer();
2826 //ASSERT_VK_SUCCESS(err);
2827 VkCmdBuffer primCB = m_cmdBuffer->GetBufferHandle();
2828 vkCmdExecuteCommands(m_cmdBuffer->GetBufferHandle(), 1, &primCB);
2829
2830 msgFlags = m_errorMonitor->GetState(&msgString);
2831 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after vkCmdBindVertexBuffers() w/o active RenderPass.";
2832 if (!strstr(msgString.c_str(),"vkCmdExecuteCommands() called w/ Primary Cmd Buffer ")) {
2833 FAIL() << "Error received was not 'vkCmdExecuteCommands() called w/ Primary Cmd Buffer ' but instead '" << msgString.c_str() << "'";
2834 }
2835}
2836
Tobin Ehlis138b7f12015-05-22 12:38:55 -06002837TEST_F(VkLayerTest, DSTypeMismatch)
2838{
2839 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002840 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06002841 std::string msgString;
2842 VkResult err;
2843
2844 ASSERT_NO_FATAL_FAILURE(InitState());
2845 m_errorMonitor->ClearState();
2846 //VkDescriptorSetObj descriptorSet(m_device);
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002847 VkDescriptorTypeCount ds_type_count = {};
2848 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2849 ds_type_count.count = 1;
2850
2851 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2852 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2853 ds_pool_ci.pNext = NULL;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06002854 ds_pool_ci.maxSets = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002855 ds_pool_ci.count = 1;
2856 ds_pool_ci.pTypeCount = &ds_type_count;
2857
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06002858 VkDescriptorPool ds_pool;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06002859 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06002860 ASSERT_VK_SUCCESS(err);
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002861 VkDescriptorSetLayoutBinding dsl_binding = {};
2862 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2863 dsl_binding.arraySize = 1;
2864 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2865 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06002866
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002867 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2868 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2869 ds_layout_ci.pNext = NULL;
2870 ds_layout_ci.count = 1;
2871 ds_layout_ci.pBinding = &dsl_binding;
2872
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06002873 VkDescriptorSetLayout ds_layout;
2874 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
2875 ASSERT_VK_SUCCESS(err);
2876
2877 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06002878 VkDescriptorSetAllocInfo alloc_info = {};
2879 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
2880 alloc_info.count = 1;
2881 alloc_info.descriptorPool = ds_pool;
2882 alloc_info.pSetLayouts = &ds_layout;
2883 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06002884 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06002885
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002886 VkSamplerCreateInfo sampler_ci = {};
2887 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
2888 sampler_ci.pNext = NULL;
2889 sampler_ci.magFilter = VK_TEX_FILTER_NEAREST;
2890 sampler_ci.minFilter = VK_TEX_FILTER_NEAREST;
2891 sampler_ci.mipMode = VK_TEX_MIPMAP_MODE_BASE;
Courtney Goeltzenleuchter51624412015-09-10 14:08:50 -06002892 sampler_ci.addressModeU = VK_TEX_ADDRESS_MODE_CLAMP;
2893 sampler_ci.addressModeV = VK_TEX_ADDRESS_MODE_CLAMP;
2894 sampler_ci.addressModeW = VK_TEX_ADDRESS_MODE_CLAMP;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002895 sampler_ci.mipLodBias = 1.0;
2896 sampler_ci.maxAnisotropy = 1;
2897 sampler_ci.compareEnable = VK_FALSE;
2898 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
2899 sampler_ci.minLod = 1.0;
2900 sampler_ci.maxLod = 1.0;
2901 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
Mark Lobodzinski513acdf2015-09-01 15:42:56 -06002902 sampler_ci.unnormalizedCoordinates = VK_FALSE;
2903
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06002904 VkSampler sampler;
2905 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
2906 ASSERT_VK_SUCCESS(err);
2907
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -06002908 VkDescriptorImageInfo info = {};
2909 info.sampler = sampler;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08002910
2911 VkWriteDescriptorSet descriptor_write;
2912 memset(&descriptor_write, 0, sizeof(descriptor_write));
2913 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2914 descriptor_write.destSet = descriptorSet;
2915 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06002916 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08002917 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -06002918 descriptor_write.pImageInfo = &info;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08002919
2920 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2921
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002922 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06002923 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after updating BUFFER Descriptor w/ incorrect type of SAMPLER.";
Tobin Ehlis68fbd442015-10-27 12:25:35 -06002924 if (!strstr(msgString.c_str(),"Write descriptor update has descriptor type VK_DESCRIPTOR_TYPE_SAMPLER that does not match ")) {
2925 FAIL() << "Error received was not 'Write descriptor update has descriptor type VK_DESCRIPTOR_TYPE_SAMPLER that does not match...' but instead '" << msgString.c_str() << "'";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06002926 }
Mike Stroyan2237f522015-08-18 14:40:24 -06002927
2928 vkDestroySampler(m_device->device(), sampler);
Mike Stroyan2237f522015-08-18 14:40:24 -06002929 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
2930 vkDestroyDescriptorPool(m_device->device(), ds_pool);
Tobin Ehlis138b7f12015-05-22 12:38:55 -06002931}
2932
2933TEST_F(VkLayerTest, DSUpdateOutOfBounds)
2934{
2935 // For overlapping Update, have arrayIndex exceed that of layout
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002936 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06002937 std::string msgString;
2938 VkResult err;
2939
2940 ASSERT_NO_FATAL_FAILURE(InitState());
2941 m_errorMonitor->ClearState();
2942 //VkDescriptorSetObj descriptorSet(m_device);
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002943 VkDescriptorTypeCount ds_type_count = {};
2944 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2945 ds_type_count.count = 1;
2946
2947 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2948 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2949 ds_pool_ci.pNext = NULL;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06002950 ds_pool_ci.maxSets = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002951 ds_pool_ci.count = 1;
2952 ds_pool_ci.pTypeCount = &ds_type_count;
2953
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06002954 VkDescriptorPool ds_pool;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06002955 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06002956 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06002957
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002958 VkDescriptorSetLayoutBinding dsl_binding = {};
2959 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2960 dsl_binding.arraySize = 1;
2961 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2962 dsl_binding.pImmutableSamplers = NULL;
2963
2964 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2965 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2966 ds_layout_ci.pNext = NULL;
2967 ds_layout_ci.count = 1;
2968 ds_layout_ci.pBinding = &dsl_binding;
2969
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06002970 VkDescriptorSetLayout ds_layout;
2971 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
2972 ASSERT_VK_SUCCESS(err);
2973
2974 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06002975 VkDescriptorSetAllocInfo alloc_info = {};
2976 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
2977 alloc_info.count = 1;
2978 alloc_info.descriptorPool = ds_pool;
2979 alloc_info.pSetLayouts = &ds_layout;
2980 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06002981 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06002982
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002983 VkSamplerCreateInfo sampler_ci = {};
2984 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
2985 sampler_ci.pNext = NULL;
2986 sampler_ci.magFilter = VK_TEX_FILTER_NEAREST;
2987 sampler_ci.minFilter = VK_TEX_FILTER_NEAREST;
2988 sampler_ci.mipMode = VK_TEX_MIPMAP_MODE_BASE;
Courtney Goeltzenleuchter51624412015-09-10 14:08:50 -06002989 sampler_ci.addressModeU = VK_TEX_ADDRESS_MODE_CLAMP;
2990 sampler_ci.addressModeV = VK_TEX_ADDRESS_MODE_CLAMP;
2991 sampler_ci.addressModeW = VK_TEX_ADDRESS_MODE_CLAMP;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06002992 sampler_ci.mipLodBias = 1.0;
2993 sampler_ci.maxAnisotropy = 1;
2994 sampler_ci.compareEnable = VK_FALSE;
2995 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
2996 sampler_ci.minLod = 1.0;
2997 sampler_ci.maxLod = 1.0;
2998 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
Mark Lobodzinski513acdf2015-09-01 15:42:56 -06002999 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003000
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003001 VkSampler sampler;
3002 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
3003 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003004
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -06003005 VkDescriptorImageInfo info = {};
3006 info.sampler = sampler;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003007
3008 VkWriteDescriptorSet descriptor_write;
3009 memset(&descriptor_write, 0, sizeof(descriptor_write));
3010 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3011 descriptor_write.destSet = descriptorSet;
3012 descriptor_write.destArrayElement = 1; /* This index out of bounds for the update */
3013 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003014 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003015 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -06003016 descriptor_write.pImageInfo = &info;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003017
3018 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3019
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06003020 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06003021 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after updating Descriptor w/ index out of bounds.";
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003022 if (!strstr(msgString.c_str(),"Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET is out of bounds for matching binding")) {
3023 FAIL() << "Error received was not 'Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET is out of bounds for matching binding...'";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003024 }
Mike Stroyan2237f522015-08-18 14:40:24 -06003025
3026 vkDestroySampler(m_device->device(), sampler);
Mike Stroyan2237f522015-08-18 14:40:24 -06003027 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
3028 vkDestroyDescriptorPool(m_device->device(), ds_pool);
Tobin Ehlis138b7f12015-05-22 12:38:55 -06003029}
3030
3031TEST_F(VkLayerTest, InvalidDSUpdateIndex)
3032{
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003033 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06003034 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003035 std::string msgString;
3036 VkResult err;
3037
3038 ASSERT_NO_FATAL_FAILURE(InitState());
3039 m_errorMonitor->ClearState();
3040 //VkDescriptorSetObj descriptorSet(m_device);
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003041 VkDescriptorTypeCount ds_type_count = {};
3042 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3043 ds_type_count.count = 1;
3044
3045 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3046 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3047 ds_pool_ci.pNext = NULL;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06003048 ds_pool_ci.maxSets = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003049 ds_pool_ci.count = 1;
3050 ds_pool_ci.pTypeCount = &ds_type_count;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06003051
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003052 VkDescriptorPool ds_pool;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06003053 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003054 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003055
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003056 VkDescriptorSetLayoutBinding dsl_binding = {};
3057 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3058 dsl_binding.arraySize = 1;
3059 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3060 dsl_binding.pImmutableSamplers = NULL;
3061
3062 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3063 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3064 ds_layout_ci.pNext = NULL;
3065 ds_layout_ci.count = 1;
3066 ds_layout_ci.pBinding = &dsl_binding;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003067 VkDescriptorSetLayout ds_layout;
3068 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
3069 ASSERT_VK_SUCCESS(err);
3070
3071 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06003072 VkDescriptorSetAllocInfo alloc_info = {};
3073 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
3074 alloc_info.count = 1;
3075 alloc_info.descriptorPool = ds_pool;
3076 alloc_info.pSetLayouts = &ds_layout;
3077 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003078 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003079
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003080 VkSamplerCreateInfo sampler_ci = {};
3081 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3082 sampler_ci.pNext = NULL;
3083 sampler_ci.magFilter = VK_TEX_FILTER_NEAREST;
3084 sampler_ci.minFilter = VK_TEX_FILTER_NEAREST;
3085 sampler_ci.mipMode = VK_TEX_MIPMAP_MODE_BASE;
Courtney Goeltzenleuchter51624412015-09-10 14:08:50 -06003086 sampler_ci.addressModeU = VK_TEX_ADDRESS_MODE_CLAMP;
3087 sampler_ci.addressModeV = VK_TEX_ADDRESS_MODE_CLAMP;
3088 sampler_ci.addressModeW = VK_TEX_ADDRESS_MODE_CLAMP;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003089 sampler_ci.mipLodBias = 1.0;
3090 sampler_ci.maxAnisotropy = 1;
3091 sampler_ci.compareEnable = VK_FALSE;
3092 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3093 sampler_ci.minLod = 1.0;
3094 sampler_ci.maxLod = 1.0;
3095 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
Mark Lobodzinski513acdf2015-09-01 15:42:56 -06003096 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003097
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003098 VkSampler sampler;
3099 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
3100 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003101
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -06003102 VkDescriptorImageInfo info = {};
3103 info.sampler = sampler;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003104
3105 VkWriteDescriptorSet descriptor_write;
3106 memset(&descriptor_write, 0, sizeof(descriptor_write));
3107 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3108 descriptor_write.destSet = descriptorSet;
3109 descriptor_write.destBinding = 2;
3110 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003111 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003112 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -06003113 descriptor_write.pImageInfo = &info;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003114
3115 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3116
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06003117 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06003118 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after updating Descriptor w/ count too large for layout.";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003119 if (!strstr(msgString.c_str()," does not have binding to match update binding ")) {
3120 FAIL() << "Error received was not 'Descriptor Set <blah> does not have binding to match update binding '";
3121 }
Mike Stroyan2237f522015-08-18 14:40:24 -06003122
3123 vkDestroySampler(m_device->device(), sampler);
Mike Stroyan2237f522015-08-18 14:40:24 -06003124 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
3125 vkDestroyDescriptorPool(m_device->device(), ds_pool);
Tobin Ehlis138b7f12015-05-22 12:38:55 -06003126}
3127
3128TEST_F(VkLayerTest, InvalidDSUpdateStruct)
3129{
3130 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_* types
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06003131 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003132 std::string msgString;
3133 VkResult err;
3134
3135 ASSERT_NO_FATAL_FAILURE(InitState());
3136 m_errorMonitor->ClearState();
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06003137
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003138 VkDescriptorTypeCount ds_type_count = {};
3139 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3140 ds_type_count.count = 1;
3141
3142 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3143 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3144 ds_pool_ci.pNext = NULL;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06003145 ds_pool_ci.maxSets = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003146 ds_pool_ci.count = 1;
3147 ds_pool_ci.pTypeCount = &ds_type_count;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06003148
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003149 VkDescriptorPool ds_pool;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06003150 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003151 ASSERT_VK_SUCCESS(err);
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003152 VkDescriptorSetLayoutBinding dsl_binding = {};
3153 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3154 dsl_binding.arraySize = 1;
3155 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3156 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003157
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003158 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3159 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3160 ds_layout_ci.pNext = NULL;
3161 ds_layout_ci.count = 1;
3162 ds_layout_ci.pBinding = &dsl_binding;
3163
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003164 VkDescriptorSetLayout ds_layout;
3165 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
3166 ASSERT_VK_SUCCESS(err);
3167
3168 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06003169 VkDescriptorSetAllocInfo alloc_info = {};
3170 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
3171 alloc_info.count = 1;
3172 alloc_info.descriptorPool = ds_pool;
3173 alloc_info.pSetLayouts = &ds_layout;
3174 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003175 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003176
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003177 VkSamplerCreateInfo sampler_ci = {};
3178 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3179 sampler_ci.pNext = NULL;
3180 sampler_ci.magFilter = VK_TEX_FILTER_NEAREST;
3181 sampler_ci.minFilter = VK_TEX_FILTER_NEAREST;
3182 sampler_ci.mipMode = VK_TEX_MIPMAP_MODE_BASE;
Courtney Goeltzenleuchter51624412015-09-10 14:08:50 -06003183 sampler_ci.addressModeU = VK_TEX_ADDRESS_MODE_CLAMP;
3184 sampler_ci.addressModeV = VK_TEX_ADDRESS_MODE_CLAMP;
3185 sampler_ci.addressModeW = VK_TEX_ADDRESS_MODE_CLAMP;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003186 sampler_ci.mipLodBias = 1.0;
3187 sampler_ci.maxAnisotropy = 1;
3188 sampler_ci.compareEnable = VK_FALSE;
3189 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3190 sampler_ci.minLod = 1.0;
3191 sampler_ci.maxLod = 1.0;
3192 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
Mark Lobodzinski513acdf2015-09-01 15:42:56 -06003193 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003194 VkSampler sampler;
3195 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
3196 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003197
3198
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -06003199 VkDescriptorImageInfo info = {};
3200 info.sampler = sampler;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003201
3202 VkWriteDescriptorSet descriptor_write;
3203 memset(&descriptor_write, 0, sizeof(descriptor_write));
3204 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
3205 descriptor_write.destSet = descriptorSet;
3206 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003207 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003208 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -06003209 descriptor_write.pImageInfo = &info;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08003210
3211 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3212
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06003213 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06003214 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after updating Descriptor w/ invalid struct type.";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003215 if (!strstr(msgString.c_str(),"Unexpected UPDATE struct of type ")) {
3216 FAIL() << "Error received was not 'Unexpected UPDATE struct of type '";
3217 }
Mike Stroyan2237f522015-08-18 14:40:24 -06003218
3219 vkDestroySampler(m_device->device(), sampler);
Mike Stroyan2237f522015-08-18 14:40:24 -06003220 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
3221 vkDestroyDescriptorPool(m_device->device(), ds_pool);
Tobin Ehlis138b7f12015-05-22 12:38:55 -06003222}
3223
Tobin Ehlisb46be812015-10-23 16:00:08 -06003224TEST_F(VkLayerTest, SampleDescriptorUpdateError)
3225{
3226 // Create a single Sampler descriptor and send it an invalid Sampler
3227 VkFlags msgFlags;
3228 std::string msgString;
3229 VkResult err;
3230
3231 ASSERT_NO_FATAL_FAILURE(InitState());
3232 m_errorMonitor->ClearState();
3233 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied code
3234 VkDescriptorTypeCount ds_type_count = {};
3235 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3236 ds_type_count.count = 1;
3237
3238 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3239 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3240 ds_pool_ci.pNext = NULL;
3241 ds_pool_ci.maxSets = 1;
3242 ds_pool_ci.count = 1;
3243 ds_pool_ci.pTypeCount = &ds_type_count;
3244
3245 VkDescriptorPool ds_pool;
3246 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
3247 ASSERT_VK_SUCCESS(err);
3248
3249 VkDescriptorSetLayoutBinding dsl_binding = {};
3250 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3251 dsl_binding.arraySize = 1;
3252 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3253 dsl_binding.pImmutableSamplers = NULL;
3254
3255 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3256 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3257 ds_layout_ci.pNext = NULL;
3258 ds_layout_ci.count = 1;
3259 ds_layout_ci.pBinding = &dsl_binding;
3260 VkDescriptorSetLayout ds_layout;
3261 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
3262 ASSERT_VK_SUCCESS(err);
3263
3264 VkDescriptorSet descriptorSet;
3265 VkDescriptorSetAllocInfo alloc_info = {};
3266 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
3267 alloc_info.count = 1;
3268 alloc_info.descriptorPool = ds_pool;
3269 alloc_info.pSetLayouts = &ds_layout;
3270 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
3271 ASSERT_VK_SUCCESS(err);
3272
Chia-I Wue420a332015-10-26 20:04:44 +08003273 VkSampler sampler = (VkSampler) 0xbaadbeef; // Sampler with invalid handle
Tobin Ehlisb46be812015-10-23 16:00:08 -06003274
3275 VkDescriptorImageInfo descriptor_info;
3276 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
3277 descriptor_info.sampler = sampler;
3278
3279 VkWriteDescriptorSet descriptor_write;
3280 memset(&descriptor_write, 0, sizeof(descriptor_write));
3281 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3282 descriptor_write.destSet = descriptorSet;
3283 descriptor_write.destBinding = 0;
3284 descriptor_write.count = 1;
3285 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3286 descriptor_write.pImageInfo = &descriptor_info;
3287
3288 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3289
3290 msgFlags = m_errorMonitor->GetState(&msgString);
3291 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after updating Descriptor w/ invalid VkSampler.";
3292 if (!strstr(msgString.c_str(),"Attempt to update descriptor with invalid sampler 0xbaadbeef")) {
3293 FAIL() << "Error received was not 'Attempt to update descriptor with invalid sampler...' but instead '" << msgString.c_str() << "'";
3294 }
3295
3296 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
3297 vkDestroyDescriptorPool(m_device->device(), ds_pool);
3298}
3299
3300TEST_F(VkLayerTest, ImageViewDescriptorUpdateError)
3301{
3302 // Create a single combined Image/Sampler descriptor and send it an invalid imageView
3303 VkFlags msgFlags;
3304 std::string msgString;
3305 VkResult err;
3306
3307 ASSERT_NO_FATAL_FAILURE(InitState());
3308 m_errorMonitor->ClearState();
3309 VkDescriptorTypeCount ds_type_count = {};
3310 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
3311 ds_type_count.count = 1;
3312
3313 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3314 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3315 ds_pool_ci.pNext = NULL;
3316 ds_pool_ci.maxSets = 1;
3317 ds_pool_ci.count = 1;
3318 ds_pool_ci.pTypeCount = &ds_type_count;
3319
3320 VkDescriptorPool ds_pool;
3321 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
3322 ASSERT_VK_SUCCESS(err);
3323
3324 VkDescriptorSetLayoutBinding dsl_binding = {};
3325 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
3326 dsl_binding.arraySize = 1;
3327 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3328 dsl_binding.pImmutableSamplers = NULL;
3329
3330 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3331 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3332 ds_layout_ci.pNext = NULL;
3333 ds_layout_ci.count = 1;
3334 ds_layout_ci.pBinding = &dsl_binding;
3335 VkDescriptorSetLayout ds_layout;
3336 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
3337 ASSERT_VK_SUCCESS(err);
3338
3339 VkDescriptorSet descriptorSet;
3340 VkDescriptorSetAllocInfo alloc_info = {};
3341 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
3342 alloc_info.count = 1;
3343 alloc_info.descriptorPool = ds_pool;
3344 alloc_info.pSetLayouts = &ds_layout;
3345 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
3346 ASSERT_VK_SUCCESS(err);
3347
3348 VkSamplerCreateInfo sampler_ci = {};
3349 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3350 sampler_ci.pNext = NULL;
3351 sampler_ci.magFilter = VK_TEX_FILTER_NEAREST;
3352 sampler_ci.minFilter = VK_TEX_FILTER_NEAREST;
3353 sampler_ci.mipMode = VK_TEX_MIPMAP_MODE_BASE;
3354 sampler_ci.addressModeU = VK_TEX_ADDRESS_MODE_CLAMP;
3355 sampler_ci.addressModeV = VK_TEX_ADDRESS_MODE_CLAMP;
3356 sampler_ci.addressModeW = VK_TEX_ADDRESS_MODE_CLAMP;
3357 sampler_ci.mipLodBias = 1.0;
3358 sampler_ci.maxAnisotropy = 1;
3359 sampler_ci.compareEnable = VK_FALSE;
3360 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3361 sampler_ci.minLod = 1.0;
3362 sampler_ci.maxLod = 1.0;
3363 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3364 sampler_ci.unnormalizedCoordinates = VK_FALSE;
3365
3366 VkSampler sampler;
3367 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
3368 ASSERT_VK_SUCCESS(err);
3369
Chia-I Wue420a332015-10-26 20:04:44 +08003370 VkImageView view = (VkImageView) 0xbaadbeef; // invalid imageView object
Tobin Ehlisb46be812015-10-23 16:00:08 -06003371
3372 VkDescriptorImageInfo descriptor_info;
3373 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
3374 descriptor_info.sampler = sampler;
3375 descriptor_info.imageView = view;
3376
3377 VkWriteDescriptorSet descriptor_write;
3378 memset(&descriptor_write, 0, sizeof(descriptor_write));
3379 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3380 descriptor_write.destSet = descriptorSet;
3381 descriptor_write.destBinding = 0;
3382 descriptor_write.count = 1;
3383 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
3384 descriptor_write.pImageInfo = &descriptor_info;
3385
3386 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3387
3388 msgFlags = m_errorMonitor->GetState(&msgString);
3389 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after updating Descriptor w/ invalid VkImageView.";
3390 if (!strstr(msgString.c_str(),"Attempt to update descriptor with invalid imageView 0xbaadbeef")) {
3391 FAIL() << "Error received was not 'Attempt to update descriptor with invalid imageView...' but instead '" << msgString.c_str() << "'";
3392 }
3393
3394 vkDestroySampler(m_device->device(), sampler);
3395 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
3396 vkDestroyDescriptorPool(m_device->device(), ds_pool);
3397}
3398
Tobin Ehlis3e676262015-10-27 16:35:27 -06003399TEST_F(VkLayerTest, CopyDescriptorUpdateErrors)
3400{
3401 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update into the other
3402 VkFlags msgFlags;
3403 std::string msgString;
3404 VkResult err;
3405
3406 ASSERT_NO_FATAL_FAILURE(InitState());
3407 m_errorMonitor->ClearState();
3408 //VkDescriptorSetObj descriptorSet(m_device);
3409 VkDescriptorTypeCount ds_type_count[2] = {};
3410 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3411 ds_type_count[0].count = 1;
3412 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
3413 ds_type_count[1].count = 1;
3414
3415 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3416 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3417 ds_pool_ci.pNext = NULL;
3418 ds_pool_ci.maxSets = 1;
3419 ds_pool_ci.count = 2;
3420 ds_pool_ci.pTypeCount = ds_type_count;
3421
3422 VkDescriptorPool ds_pool;
3423 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
3424 ASSERT_VK_SUCCESS(err);
3425 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
3426 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3427 dsl_binding[0].arraySize = 1;
3428 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3429 dsl_binding[0].pImmutableSamplers = NULL;
3430 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3431 dsl_binding[1].arraySize = 1;
3432 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
3433 dsl_binding[1].pImmutableSamplers = NULL;
3434
3435 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3436 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3437 ds_layout_ci.pNext = NULL;
3438 ds_layout_ci.count = 2;
3439 ds_layout_ci.pBinding = dsl_binding;
3440
3441 VkDescriptorSetLayout ds_layout;
3442 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
3443 ASSERT_VK_SUCCESS(err);
3444
3445 VkDescriptorSet descriptorSet;
3446 VkDescriptorSetAllocInfo alloc_info = {};
3447 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
3448 alloc_info.count = 1;
3449 alloc_info.descriptorPool = ds_pool;
3450 alloc_info.pSetLayouts = &ds_layout;
3451 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
3452 ASSERT_VK_SUCCESS(err);
3453
3454 VkSamplerCreateInfo sampler_ci = {};
3455 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3456 sampler_ci.pNext = NULL;
3457 sampler_ci.magFilter = VK_TEX_FILTER_NEAREST;
3458 sampler_ci.minFilter = VK_TEX_FILTER_NEAREST;
3459 sampler_ci.mipMode = VK_TEX_MIPMAP_MODE_BASE;
3460 sampler_ci.addressModeU = VK_TEX_ADDRESS_MODE_CLAMP;
3461 sampler_ci.addressModeV = VK_TEX_ADDRESS_MODE_CLAMP;
3462 sampler_ci.addressModeW = VK_TEX_ADDRESS_MODE_CLAMP;
3463 sampler_ci.mipLodBias = 1.0;
3464 sampler_ci.maxAnisotropy = 1;
3465 sampler_ci.compareEnable = VK_FALSE;
3466 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3467 sampler_ci.minLod = 1.0;
3468 sampler_ci.maxLod = 1.0;
3469 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3470 sampler_ci.unnormalizedCoordinates = VK_FALSE;
3471
3472 VkSampler sampler;
3473 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
3474 ASSERT_VK_SUCCESS(err);
3475
3476 VkDescriptorImageInfo info = {};
3477 info.sampler = sampler;
3478
3479 VkWriteDescriptorSet descriptor_write;
3480 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
3481 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3482 descriptor_write.destSet = descriptorSet;
3483 descriptor_write.destBinding = 1; // SAMPLER binding from layout above
3484 descriptor_write.count = 1;
3485 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3486 descriptor_write.pImageInfo = &info;
3487 // This write update should succeed
3488 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
3489 // Now perform a copy update that fails due to type mismatch
3490 VkCopyDescriptorSet copy_ds_update;
3491 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
3492 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
3493 copy_ds_update.srcSet = descriptorSet;
3494 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
3495 copy_ds_update.destSet = descriptorSet;
3496 copy_ds_update.destBinding = 0; // ERROR : copy to UNIFORM binding
3497 copy_ds_update.count = 1; // copy 1 descriptor
3498 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
3499
3500 msgFlags = m_errorMonitor->GetState(&msgString);
3501 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after copying SAMPLER descriptor type to BUFFER descriptor type.";
3502 if (!strstr(msgString.c_str(),"Copy descriptor update index 0, update count #1, has src update descriptor type VK_DESCRIPTOR_TYPE_SAMPLER ")) {
3503 FAIL() << "Error received was not 'Copy descriptor update index 0, update count #1, has src update descriptor type VK_DESCRIPTOR_TYPE_SAMPLER...' but instead '" << msgString.c_str() << "'";
3504 }
3505 // Now perform a copy update that fails due to binding out of bounds
3506 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
3507 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
3508 copy_ds_update.srcSet = descriptorSet;
3509 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
3510 copy_ds_update.destSet = descriptorSet;
3511 copy_ds_update.destBinding = 0;
3512 copy_ds_update.count = 1; // copy 1 descriptor
3513 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
3514
3515 msgFlags = m_errorMonitor->GetState(&msgString);
3516 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after attempting descriptor copy update w/ bad srcBinding.";
3517 if (!strstr(msgString.c_str(),"Copy descriptor update 0 has srcBinding 3 which is out of bounds ")) {
3518 FAIL() << "Error received was not 'Copy descriptor update 0 has srcBinding 3 which is out of bounds...' but instead '" << msgString.c_str() << "'";
3519 }
3520 // Now perform a copy update that fails due to binding out of bounds
3521 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
3522 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
3523 copy_ds_update.srcSet = descriptorSet;
3524 copy_ds_update.srcBinding = 1;
3525 copy_ds_update.destSet = descriptorSet;
3526 copy_ds_update.destBinding = 0;
3527 copy_ds_update.count = 5; // ERROR copy 5 descriptors (out of bounds for layout)
3528 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
3529
3530 msgFlags = m_errorMonitor->GetState(&msgString);
3531 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after attempting descriptor copy update w/ count out of bounds for layout.";
3532 if (!strstr(msgString.c_str(),"Copy descriptor src update is out of bounds for matching binding 1 ")) {
3533 FAIL() << "Error received was not 'Copy descriptor src update is out of bounds for matching binding 1...' but instead '" << msgString.c_str() << "'";
3534 }
3535
3536 vkDestroySampler(m_device->device(), sampler);
3537 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
3538 vkDestroyDescriptorPool(m_device->device(), ds_pool);
3539}
3540
Tobin Ehlis138b7f12015-05-22 12:38:55 -06003541TEST_F(VkLayerTest, NumSamplesMismatch)
3542{
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003543 // Create CmdBuffer where MSAA samples doesn't match RenderPass sampleCount
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06003544 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003545 std::string msgString;
3546 VkResult err;
3547
3548 ASSERT_NO_FATAL_FAILURE(InitState());
3549 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3550 m_errorMonitor->ClearState();
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003551 VkDescriptorTypeCount ds_type_count = {};
3552 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3553 ds_type_count.count = 1;
3554
3555 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06003556 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3557 ds_pool_ci.pNext = NULL;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06003558 ds_pool_ci.maxSets = 1;
3559 ds_pool_ci.count = 1;
3560 ds_pool_ci.pTypeCount = &ds_type_count;
3561
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003562 VkDescriptorPool ds_pool;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06003563 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003564 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003565
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003566 VkDescriptorSetLayoutBinding dsl_binding = {};
3567 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3568 dsl_binding.arraySize = 1;
3569 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3570 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003571
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003572 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3573 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3574 ds_layout_ci.pNext = NULL;
3575 ds_layout_ci.count = 1;
3576 ds_layout_ci.pBinding = &dsl_binding;
3577
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003578 VkDescriptorSetLayout ds_layout;
3579 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
3580 ASSERT_VK_SUCCESS(err);
3581
3582 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06003583 VkDescriptorSetAllocInfo alloc_info = {};
3584 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
3585 alloc_info.count = 1;
3586 alloc_info.descriptorPool = ds_pool;
3587 alloc_info.pSetLayouts = &ds_layout;
3588 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003589 ASSERT_VK_SUCCESS(err);
3590
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003591 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
3592 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
3593 pipe_ms_state_ci.pNext = NULL;
3594 pipe_ms_state_ci.rasterSamples = 4;
3595 pipe_ms_state_ci.sampleShadingEnable = 0;
3596 pipe_ms_state_ci.minSampleShading = 1.0;
Cody Northrope9825b72015-08-04 14:34:54 -06003597 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003598
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003599 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3600 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3601 pipeline_layout_ci.pNext = NULL;
3602 pipeline_layout_ci.descriptorSetCount = 1;
3603 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003604
3605 VkPipelineLayout pipeline_layout;
3606 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
3607 ASSERT_VK_SUCCESS(err);
3608
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06003609 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3610 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // TODO - We shouldn't need a fragment shader
Tony Barbour3c9e3b12015-08-06 11:21:08 -06003611 // but add it to be able to run on more devices
Tony Barbourd7d828b2015-08-06 10:16:07 -06003612 VkPipelineObj pipe(m_device);
3613 pipe.AddShader(&vs);
Tony Barbour3c9e3b12015-08-06 11:21:08 -06003614 pipe.AddShader(&fs);
Tony Barbourd7d828b2015-08-06 10:16:07 -06003615 pipe.SetMSAA(&pipe_ms_state_ci);
3616 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003617
Tony Barbour1490c912015-07-28 10:17:20 -06003618 BeginCommandBuffer();
Tony Barbourd7d828b2015-08-06 10:16:07 -06003619 vkCmdBindPipeline(m_cmdBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003620
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06003621 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06003622 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after binding RenderPass w/ mismatched MSAA from PSO.";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06003623 if (!strstr(msgString.c_str(),"Num samples mismatch! ")) {
3624 FAIL() << "Error received was not 'Num samples mismatch!...'";
3625 }
Mike Stroyan2237f522015-08-18 14:40:24 -06003626
3627 vkDestroyPipelineLayout(m_device->device(), pipeline_layout);
Mike Stroyan2237f522015-08-18 14:40:24 -06003628 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
3629 vkDestroyDescriptorPool(m_device->device(), ds_pool);
Tobin Ehlis138b7f12015-05-22 12:38:55 -06003630}
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06003631
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06003632TEST_F(VkLayerTest, ClearCmdNoDraw)
3633{
3634 // Create CmdBuffer where we add ClearCmd for FB Color attachment prior to issuing a Draw
3635 VkFlags msgFlags;
3636 std::string msgString;
3637 VkResult err;
3638
3639 ASSERT_NO_FATAL_FAILURE(InitState());
3640 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3641 m_errorMonitor->ClearState();
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003642
3643 VkDescriptorTypeCount ds_type_count = {};
3644 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3645 ds_type_count.count = 1;
3646
3647 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3648 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3649 ds_pool_ci.pNext = NULL;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06003650 ds_pool_ci.maxSets = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003651 ds_pool_ci.count = 1;
3652 ds_pool_ci.pTypeCount = &ds_type_count;
3653
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06003654 VkDescriptorPool ds_pool;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06003655 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06003656 ASSERT_VK_SUCCESS(err);
3657
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003658 VkDescriptorSetLayoutBinding dsl_binding = {};
3659 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3660 dsl_binding.arraySize = 1;
3661 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3662 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06003663
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003664 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3665 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3666 ds_layout_ci.pNext = NULL;
3667 ds_layout_ci.count = 1;
3668 ds_layout_ci.pBinding = &dsl_binding;
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06003669
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06003670 VkDescriptorSetLayout ds_layout;
3671 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
3672 ASSERT_VK_SUCCESS(err);
3673
3674 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06003675 VkDescriptorSetAllocInfo alloc_info = {};
3676 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
3677 alloc_info.count = 1;
3678 alloc_info.descriptorPool = ds_pool;
3679 alloc_info.pSetLayouts = &ds_layout;
3680 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06003681 ASSERT_VK_SUCCESS(err);
3682
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003683 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
3684 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
3685 pipe_ms_state_ci.pNext = NULL;
3686 pipe_ms_state_ci.rasterSamples = 4;
3687 pipe_ms_state_ci.sampleShadingEnable = 0;
3688 pipe_ms_state_ci.minSampleShading = 1.0;
Cody Northrope9825b72015-08-04 14:34:54 -06003689 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06003690
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003691 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3692 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3693 pipeline_layout_ci.pNext = NULL;
3694 pipeline_layout_ci.descriptorSetCount = 1;
3695 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06003696
3697 VkPipelineLayout pipeline_layout;
3698 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
3699 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06003700
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06003701 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3702 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // TODO - We shouldn't need a fragment shader
Tony Barbour3c9e3b12015-08-06 11:21:08 -06003703 // but add it to be able to run on more devices
Tony Barbourd7d828b2015-08-06 10:16:07 -06003704 VkPipelineObj pipe(m_device);
3705 pipe.AddShader(&vs);
Tony Barbour3c9e3b12015-08-06 11:21:08 -06003706 pipe.AddShader(&fs);
Tony Barbourd7d828b2015-08-06 10:16:07 -06003707 pipe.SetMSAA(&pipe_ms_state_ci);
3708 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbour1490c912015-07-28 10:17:20 -06003709
3710 BeginCommandBuffer();
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06003711
3712 m_errorMonitor->ClearState();
3713 // Main thing we care about for this test is that the VkImage obj we're clearing matches Color Attachment of FB
3714 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchter9feb0732015-10-15 16:51:05 -06003715 VkClearAttachment color_attachment;
3716 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3717 color_attachment.clearValue.color.float32[0] = 1.0;
3718 color_attachment.clearValue.color.float32[1] = 1.0;
3719 color_attachment.clearValue.color.float32[2] = 1.0;
3720 color_attachment.clearValue.color.float32[3] = 1.0;
3721 color_attachment.colorAttachment = 0;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -06003722 VkClearRect clear_rect = { { { 0, 0 }, { (int)m_width, (int)m_height } } };
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06003723
Courtney Goeltzenleuchter9feb0732015-10-15 16:51:05 -06003724 vkCmdClearAttachments(m_cmdBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06003725 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06003726 ASSERT_NE(0, msgFlags & VK_DBG_REPORT_WARN_BIT) << "Did not receive error after issuing Clear Cmd on FB color attachment prior to Draw Cmd.";
Courtney Goeltzenleuchter9feb0732015-10-15 16:51:05 -06003727 if (!strstr(msgString.c_str(),"vkCmdClearAttachments() issued on CB object ")) {
3728 FAIL() << "Error received was not 'vkCmdClearAttachments() issued on CB object...'";
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06003729 }
Mike Stroyan2237f522015-08-18 14:40:24 -06003730
3731 vkDestroyPipelineLayout(m_device->device(), pipeline_layout);
Mike Stroyan2237f522015-08-18 14:40:24 -06003732 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
3733 vkDestroyDescriptorPool(m_device->device(), ds_pool);
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06003734}
3735
Tobin Ehlise4076782015-06-24 15:53:07 -06003736TEST_F(VkLayerTest, VtxBufferBadIndex)
3737{
3738 // Create CmdBuffer where MSAA samples doesn't match RenderPass sampleCount
3739 VkFlags msgFlags;
3740 std::string msgString;
3741 VkResult err;
3742
3743 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa88e2f52015-10-02 11:00:56 -06003744 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlise4076782015-06-24 15:53:07 -06003745 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3746 m_errorMonitor->ClearState();
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003747
3748 VkDescriptorTypeCount ds_type_count = {};
3749 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3750 ds_type_count.count = 1;
3751
3752 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3753 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3754 ds_pool_ci.pNext = NULL;
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06003755 ds_pool_ci.maxSets = 1;
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003756 ds_pool_ci.count = 1;
3757 ds_pool_ci.pTypeCount = &ds_type_count;
3758
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -06003759 VkDescriptorPool ds_pool;
3760 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
Tobin Ehlise4076782015-06-24 15:53:07 -06003761 ASSERT_VK_SUCCESS(err);
3762
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003763 VkDescriptorSetLayoutBinding dsl_binding = {};
3764 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3765 dsl_binding.arraySize = 1;
3766 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3767 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise4076782015-06-24 15:53:07 -06003768
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003769 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3770 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3771 ds_layout_ci.pNext = NULL;
3772 ds_layout_ci.count = 1;
3773 ds_layout_ci.pBinding = &dsl_binding;
3774
Tobin Ehlise4076782015-06-24 15:53:07 -06003775 VkDescriptorSetLayout ds_layout;
3776 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
3777 ASSERT_VK_SUCCESS(err);
3778
3779 VkDescriptorSet descriptorSet;
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06003780 VkDescriptorSetAllocInfo alloc_info = {};
3781 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
3782 alloc_info.count = 1;
3783 alloc_info.descriptorPool = ds_pool;
3784 alloc_info.pSetLayouts = &ds_layout;
3785 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise4076782015-06-24 15:53:07 -06003786 ASSERT_VK_SUCCESS(err);
3787
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003788 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
3789 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
3790 pipe_ms_state_ci.pNext = NULL;
3791 pipe_ms_state_ci.rasterSamples = 1;
3792 pipe_ms_state_ci.sampleShadingEnable = 0;
3793 pipe_ms_state_ci.minSampleShading = 1.0;
Cody Northrope9825b72015-08-04 14:34:54 -06003794 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlise4076782015-06-24 15:53:07 -06003795
Tony Barbourefbe9ca2015-07-15 12:50:33 -06003796 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3797 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3798 pipeline_layout_ci.pNext = NULL;
3799 pipeline_layout_ci.descriptorSetCount = 1;
3800 pipeline_layout_ci.pSetLayouts = &ds_layout;
3801 VkPipelineLayout pipeline_layout;
Tobin Ehlise4076782015-06-24 15:53:07 -06003802
Tobin Ehlise4076782015-06-24 15:53:07 -06003803 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
3804 ASSERT_VK_SUCCESS(err);
3805
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06003806 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3807 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // TODO - We shouldn't need a fragment shader
Tony Barbour3c9e3b12015-08-06 11:21:08 -06003808 // but add it to be able to run on more devices
Tony Barbourd7d828b2015-08-06 10:16:07 -06003809 VkPipelineObj pipe(m_device);
3810 pipe.AddShader(&vs);
Tony Barbour3c9e3b12015-08-06 11:21:08 -06003811 pipe.AddShader(&fs);
Tony Barbourd7d828b2015-08-06 10:16:07 -06003812 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisa88e2f52015-10-02 11:00:56 -06003813 pipe.SetViewport(m_viewports);
3814 pipe.SetScissor(m_scissors);
Tony Barbourd7d828b2015-08-06 10:16:07 -06003815 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbour1490c912015-07-28 10:17:20 -06003816
3817 BeginCommandBuffer();
Tony Barbourd7d828b2015-08-06 10:16:07 -06003818 vkCmdBindPipeline(m_cmdBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisd28acef2015-09-09 15:12:35 -06003819 // Don't care about actual data, just need to get to draw to flag error
3820 static const float vbo_data[3] = {1.f, 0.f, 1.f};
3821 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void*) &vbo_data);
3822 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter4ff11cc2015-09-23 12:31:50 -06003823 Draw(1, 0, 0, 0);
Tobin Ehlise4076782015-06-24 15:53:07 -06003824
3825 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06003826 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after binding Vtx Buffer w/o VBO attached to PSO.";
Tobin Ehlisd28acef2015-09-09 15:12:35 -06003827 if (!strstr(msgString.c_str(),"Vtx Buffer Index 1 was bound, but no vtx buffers are attached to PSO.")) {
Tobin Ehlisa88e2f52015-10-02 11:00:56 -06003828 FAIL() << "Error received was not 'Vtx Buffer Index 0 was bound, but no vtx buffers are attached to PSO.' but instead was '" << msgString.c_str() << "'";
Tobin Ehlise4076782015-06-24 15:53:07 -06003829 }
Mike Stroyan2237f522015-08-18 14:40:24 -06003830
3831 vkDestroyPipelineLayout(m_device->device(), pipeline_layout);
Mike Stroyan2237f522015-08-18 14:40:24 -06003832 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
3833 vkDestroyDescriptorPool(m_device->device(), ds_pool);
Tobin Ehlise4076782015-06-24 15:53:07 -06003834}
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06003835#endif // DRAW_STATE_TESTS
3836
Tobin Ehlis57e6a612015-05-26 16:11:58 -06003837#if THREADING_TESTS
Mike Stroyan09aae812015-05-12 16:00:45 -06003838#if GTEST_IS_THREADSAFE
3839struct thread_data_struct {
3840 VkCmdBuffer cmdBuffer;
3841 VkEvent event;
3842 bool bailout;
3843};
3844
3845extern "C" void *AddToCommandBuffer(void *arg)
3846{
3847 struct thread_data_struct *data = (struct thread_data_struct *) arg;
3848 std::string msgString;
3849
3850 for (int i = 0; i<10000; i++) {
Tony Barbourc2e987e2015-06-29 16:20:35 -06003851 vkCmdSetEvent(data->cmdBuffer, data->event, VK_PIPELINE_STAGE_ALL_GPU_COMMANDS);
Mike Stroyan09aae812015-05-12 16:00:45 -06003852 if (data->bailout) {
3853 break;
3854 }
3855 }
3856 return NULL;
3857}
3858
3859TEST_F(VkLayerTest, ThreadCmdBufferCollision)
3860{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06003861 VkFlags msgFlags;
Mike Stroyan09aae812015-05-12 16:00:45 -06003862 std::string msgString;
Mike Stroyan7016f4f2015-07-13 14:45:35 -06003863 test_platform_thread thread;
Mike Stroyan09aae812015-05-12 16:00:45 -06003864
3865 ASSERT_NO_FATAL_FAILURE(InitState());
3866 ASSERT_NO_FATAL_FAILURE(InitViewport());
3867 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3868
Mike Stroyan09aae812015-05-12 16:00:45 -06003869 m_errorMonitor->ClearState();
Mark Lobodzinskia0f061c2015-09-30 16:19:16 -06003870
Courtney Goeltzenleuchter831c1832015-10-23 14:21:05 -06003871 // Calls AllocCommandBuffers
Mark Lobodzinskia0f061c2015-09-30 16:19:16 -06003872 VkCommandBufferObj cmdBuffer(m_device, m_cmdPool);
3873
3874 // Avoid creating RenderPass
3875 cmdBuffer.BeginCommandBuffer();
Mike Stroyan09aae812015-05-12 16:00:45 -06003876
3877 VkEventCreateInfo event_info;
3878 VkEvent event;
Mike Stroyan09aae812015-05-12 16:00:45 -06003879 VkResult err;
3880
3881 memset(&event_info, 0, sizeof(event_info));
3882 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
3883
3884 err = vkCreateEvent(device(), &event_info, &event);
3885 ASSERT_VK_SUCCESS(err);
3886
Mike Stroyan09aae812015-05-12 16:00:45 -06003887 err = vkResetEvent(device(), event);
3888 ASSERT_VK_SUCCESS(err);
3889
3890 struct thread_data_struct data;
Mark Lobodzinskia0f061c2015-09-30 16:19:16 -06003891 data.cmdBuffer = cmdBuffer.GetBufferHandle();
Mike Stroyan09aae812015-05-12 16:00:45 -06003892 data.event = event;
3893 data.bailout = false;
3894 m_errorMonitor->SetBailout(&data.bailout);
3895 // Add many entries to command buffer from another thread.
Mike Stroyan7016f4f2015-07-13 14:45:35 -06003896 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyan09aae812015-05-12 16:00:45 -06003897 // Add many entries to command buffer from this thread at the same time.
3898 AddToCommandBuffer(&data);
Mark Lobodzinskia0f061c2015-09-30 16:19:16 -06003899
Mike Stroyan7016f4f2015-07-13 14:45:35 -06003900 test_platform_thread_join(thread, NULL);
Mark Lobodzinskia0f061c2015-09-30 16:19:16 -06003901 cmdBuffer.EndCommandBuffer();
Mike Stroyan09aae812015-05-12 16:00:45 -06003902
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06003903 msgFlags = m_errorMonitor->GetState(&msgString);
Cody Northrop1684adb2015-08-05 11:15:02 -06003904 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an err from using one VkCommandBufferObj in two threads";
Mike Stroyan09aae812015-05-12 16:00:45 -06003905 if (!strstr(msgString.c_str(),"THREADING ERROR")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -05003906 FAIL() << "Error received was not 'THREADING ERROR'";
Mike Stroyan09aae812015-05-12 16:00:45 -06003907 }
3908
Mike Stroyan2237f522015-08-18 14:40:24 -06003909 vkDestroyEvent(device(), event);
Mike Stroyan09aae812015-05-12 16:00:45 -06003910}
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06003911#endif // GTEST_IS_THREADSAFE
3912#endif // THREADING_TESTS
3913
Chris Forbes5af3bf22015-05-25 11:13:08 +12003914#if SHADER_CHECKER_TESTS
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06003915TEST_F(VkLayerTest, InvalidSPIRVCodeSize)
3916{
3917 VkFlags msgFlags;
3918 std::string msgString;
3919 ASSERT_NO_FATAL_FAILURE(InitState());
3920 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3921
3922 m_errorMonitor->ClearState();
3923
3924 VkShaderModule module;
3925 VkShaderModuleCreateInfo moduleCreateInfo;
3926 struct icd_spv_header spv;
3927
3928 spv.magic = ICD_SPV_MAGIC;
3929 spv.version = ICD_SPV_VERSION;
3930 spv.gen_magic = 0;
3931
3932 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
3933 moduleCreateInfo.pNext = NULL;
Chia-I Wu036b1612015-10-26 19:22:06 +08003934 moduleCreateInfo.pCode = (const uint32_t *) &spv;
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06003935 moduleCreateInfo.codeSize = 4;
3936 moduleCreateInfo.flags = 0;
3937 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, &module);
3938
3939 msgFlags = m_errorMonitor->GetState(&msgString);
3940
Chris Forbes96b81762015-09-18 11:40:23 +12003941 ASSERT_NE(0, msgFlags & VK_DBG_REPORT_ERROR_BIT);
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06003942 if (!strstr(msgString.c_str(),"Shader is not SPIR-V")) {
3943 FAIL() << "Incorrect warning: " << msgString;
3944 }
3945}
3946
3947TEST_F(VkLayerTest, InvalidSPIRVMagic)
3948{
3949 VkFlags msgFlags;
3950 std::string msgString;
3951 ASSERT_NO_FATAL_FAILURE(InitState());
3952 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3953
3954 m_errorMonitor->ClearState();
3955
3956 VkShaderModule module;
3957 VkShaderModuleCreateInfo moduleCreateInfo;
3958 struct icd_spv_header spv;
3959
3960 spv.magic = ~ICD_SPV_MAGIC;
3961 spv.version = ICD_SPV_VERSION;
3962 spv.gen_magic = 0;
3963
3964 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
3965 moduleCreateInfo.pNext = NULL;
Chia-I Wu036b1612015-10-26 19:22:06 +08003966 moduleCreateInfo.pCode = (const uint32_t *) &spv;
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06003967 moduleCreateInfo.codeSize = sizeof(spv) + 10;
3968 moduleCreateInfo.flags = 0;
3969 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, &module);
3970
3971 msgFlags = m_errorMonitor->GetState(&msgString);
3972
Chris Forbes96b81762015-09-18 11:40:23 +12003973 ASSERT_NE(0, msgFlags & VK_DBG_REPORT_ERROR_BIT);
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06003974 if (!strstr(msgString.c_str(),"Shader is not SPIR-V")) {
3975 FAIL() << "Incorrect warning: " << msgString;
3976 }
3977}
3978
3979TEST_F(VkLayerTest, InvalidSPIRVVersion)
3980{
3981 VkFlags msgFlags;
3982 std::string msgString;
3983 ASSERT_NO_FATAL_FAILURE(InitState());
3984 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3985
3986 m_errorMonitor->ClearState();
3987
3988 VkShaderModule module;
3989 VkShaderModuleCreateInfo moduleCreateInfo;
3990 struct icd_spv_header spv;
3991
3992 spv.magic = ICD_SPV_MAGIC;
3993 spv.version = ~ICD_SPV_VERSION;
3994 spv.gen_magic = 0;
3995
3996 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
3997 moduleCreateInfo.pNext = NULL;
3998
Chia-I Wu036b1612015-10-26 19:22:06 +08003999 moduleCreateInfo.pCode = (const uint32_t *) &spv;
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06004000 moduleCreateInfo.codeSize = sizeof(spv) + 10;
4001 moduleCreateInfo.flags = 0;
4002 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, &module);
4003
4004 msgFlags = m_errorMonitor->GetState(&msgString);
4005
Chris Forbes96b81762015-09-18 11:40:23 +12004006 ASSERT_NE(0, msgFlags & VK_DBG_REPORT_ERROR_BIT);
Courtney Goeltzenleuchter201387f2015-09-16 12:58:29 -06004007 if (!strstr(msgString.c_str(),"Shader is not SPIR-V")) {
4008 FAIL() << "Incorrect warning: " << msgString;
4009 }
4010}
4011
Chris Forbes5af3bf22015-05-25 11:13:08 +12004012TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed)
4013{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004014 VkFlags msgFlags;
Chris Forbes5af3bf22015-05-25 11:13:08 +12004015 std::string msgString;
4016 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisf2f97402015-09-11 12:57:55 -06004017 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes5af3bf22015-05-25 11:13:08 +12004018
4019 char const *vsSource =
4020 "#version 140\n"
4021 "#extension GL_ARB_separate_shader_objects: require\n"
4022 "#extension GL_ARB_shading_language_420pack: require\n"
4023 "\n"
4024 "layout(location=0) out float x;\n"
4025 "void main(){\n"
4026 " gl_Position = vec4(1);\n"
4027 " x = 0;\n"
4028 "}\n";
4029 char const *fsSource =
4030 "#version 140\n"
4031 "#extension GL_ARB_separate_shader_objects: require\n"
4032 "#extension GL_ARB_shading_language_420pack: require\n"
4033 "\n"
4034 "layout(location=0) out vec4 color;\n"
4035 "void main(){\n"
4036 " color = vec4(1);\n"
4037 "}\n";
4038
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06004039 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4040 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes5af3bf22015-05-25 11:13:08 +12004041
4042 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08004043 pipe.AddColorAttachment();
Chris Forbes5af3bf22015-05-25 11:13:08 +12004044 pipe.AddShader(&vs);
4045 pipe.AddShader(&fs);
4046
Chris Forbes5af3bf22015-05-25 11:13:08 +12004047 VkDescriptorSetObj descriptorSet(m_device);
4048 descriptorSet.AppendDummy();
Tony Barbour1490c912015-07-28 10:17:20 -06004049 descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
Chris Forbes5af3bf22015-05-25 11:13:08 +12004050
4051 m_errorMonitor->ClearState();
Tony Barboured132432015-08-04 16:23:11 -06004052 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes5af3bf22015-05-25 11:13:08 +12004053
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004054 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes5af3bf22015-05-25 11:13:08 +12004055
Cody Northrop1684adb2015-08-05 11:15:02 -06004056 ASSERT_NE(0, msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes5af3bf22015-05-25 11:13:08 +12004057 if (!strstr(msgString.c_str(),"not consumed by fragment shader")) {
4058 FAIL() << "Incorrect warning: " << msgString;
4059 }
4060}
Chris Forbes5af3bf22015-05-25 11:13:08 +12004061
Chris Forbes3c10b852015-05-25 11:13:13 +12004062TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided)
4063{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004064 VkFlags msgFlags;
Chris Forbes3c10b852015-05-25 11:13:13 +12004065 std::string msgString;
4066 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisf2f97402015-09-11 12:57:55 -06004067 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes3c10b852015-05-25 11:13:13 +12004068
4069 char const *vsSource =
4070 "#version 140\n"
4071 "#extension GL_ARB_separate_shader_objects: require\n"
4072 "#extension GL_ARB_shading_language_420pack: require\n"
4073 "\n"
4074 "void main(){\n"
4075 " gl_Position = vec4(1);\n"
4076 "}\n";
4077 char const *fsSource =
4078 "#version 140\n"
4079 "#extension GL_ARB_separate_shader_objects: require\n"
4080 "#extension GL_ARB_shading_language_420pack: require\n"
4081 "\n"
4082 "layout(location=0) in float x;\n"
4083 "layout(location=0) out vec4 color;\n"
4084 "void main(){\n"
4085 " color = vec4(x);\n"
4086 "}\n";
4087
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06004088 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4089 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes3c10b852015-05-25 11:13:13 +12004090
4091 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08004092 pipe.AddColorAttachment();
Chris Forbes3c10b852015-05-25 11:13:13 +12004093 pipe.AddShader(&vs);
4094 pipe.AddShader(&fs);
4095
Chris Forbes3c10b852015-05-25 11:13:13 +12004096 VkDescriptorSetObj descriptorSet(m_device);
4097 descriptorSet.AppendDummy();
Tony Barbour1490c912015-07-28 10:17:20 -06004098 descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
Chris Forbes3c10b852015-05-25 11:13:13 +12004099
4100 m_errorMonitor->ClearState();
Tony Barboured132432015-08-04 16:23:11 -06004101 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes3c10b852015-05-25 11:13:13 +12004102
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004103 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes3c10b852015-05-25 11:13:13 +12004104
Cody Northrop1684adb2015-08-05 11:15:02 -06004105 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT));
Chris Forbes3c10b852015-05-25 11:13:13 +12004106 if (!strstr(msgString.c_str(),"not written by vertex shader")) {
4107 FAIL() << "Incorrect error: " << msgString;
4108 }
4109}
4110
Chris Forbescc281692015-05-25 11:13:17 +12004111TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch)
4112{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004113 VkFlags msgFlags;
Chris Forbescc281692015-05-25 11:13:17 +12004114 std::string msgString;
4115 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisf2f97402015-09-11 12:57:55 -06004116 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbescc281692015-05-25 11:13:17 +12004117
4118 char const *vsSource =
4119 "#version 140\n"
4120 "#extension GL_ARB_separate_shader_objects: require\n"
4121 "#extension GL_ARB_shading_language_420pack: require\n"
4122 "\n"
4123 "layout(location=0) out int x;\n"
4124 "void main(){\n"
4125 " x = 0;\n"
4126 " gl_Position = vec4(1);\n"
4127 "}\n";
4128 char const *fsSource =
4129 "#version 140\n"
4130 "#extension GL_ARB_separate_shader_objects: require\n"
4131 "#extension GL_ARB_shading_language_420pack: require\n"
4132 "\n"
4133 "layout(location=0) in float x;\n" /* VS writes int */
4134 "layout(location=0) out vec4 color;\n"
4135 "void main(){\n"
4136 " color = vec4(x);\n"
4137 "}\n";
4138
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06004139 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4140 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbescc281692015-05-25 11:13:17 +12004141
4142 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08004143 pipe.AddColorAttachment();
Chris Forbescc281692015-05-25 11:13:17 +12004144 pipe.AddShader(&vs);
4145 pipe.AddShader(&fs);
4146
Chris Forbescc281692015-05-25 11:13:17 +12004147 VkDescriptorSetObj descriptorSet(m_device);
4148 descriptorSet.AppendDummy();
Tony Barbour1490c912015-07-28 10:17:20 -06004149 descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
Chris Forbescc281692015-05-25 11:13:17 +12004150
4151 m_errorMonitor->ClearState();
Tony Barboured132432015-08-04 16:23:11 -06004152 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbescc281692015-05-25 11:13:17 +12004153
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004154 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbescc281692015-05-25 11:13:17 +12004155
Cody Northrop1684adb2015-08-05 11:15:02 -06004156 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT));
Chris Forbescc281692015-05-25 11:13:17 +12004157 if (!strstr(msgString.c_str(),"Type mismatch on location 0")) {
4158 FAIL() << "Incorrect error: " << msgString;
4159 }
4160}
4161
Chris Forbes8291c052015-05-25 11:13:28 +12004162TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed)
4163{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004164 VkFlags msgFlags;
Chris Forbes8291c052015-05-25 11:13:28 +12004165 std::string msgString;
4166 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisf2f97402015-09-11 12:57:55 -06004167 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes8291c052015-05-25 11:13:28 +12004168
4169 VkVertexInputBindingDescription input_binding;
4170 memset(&input_binding, 0, sizeof(input_binding));
4171
4172 VkVertexInputAttributeDescription input_attrib;
4173 memset(&input_attrib, 0, sizeof(input_attrib));
4174 input_attrib.format = VK_FORMAT_R32_SFLOAT;
4175
4176 char const *vsSource =
4177 "#version 140\n"
4178 "#extension GL_ARB_separate_shader_objects: require\n"
4179 "#extension GL_ARB_shading_language_420pack: require\n"
4180 "\n"
4181 "void main(){\n"
4182 " gl_Position = vec4(1);\n"
4183 "}\n";
4184 char const *fsSource =
4185 "#version 140\n"
4186 "#extension GL_ARB_separate_shader_objects: require\n"
4187 "#extension GL_ARB_shading_language_420pack: require\n"
4188 "\n"
4189 "layout(location=0) out vec4 color;\n"
4190 "void main(){\n"
4191 " color = vec4(1);\n"
4192 "}\n";
4193
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06004194 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4195 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes8291c052015-05-25 11:13:28 +12004196
4197 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08004198 pipe.AddColorAttachment();
Chris Forbes8291c052015-05-25 11:13:28 +12004199 pipe.AddShader(&vs);
4200 pipe.AddShader(&fs);
4201
4202 pipe.AddVertexInputBindings(&input_binding, 1);
4203 pipe.AddVertexInputAttribs(&input_attrib, 1);
4204
Chris Forbes8291c052015-05-25 11:13:28 +12004205 VkDescriptorSetObj descriptorSet(m_device);
4206 descriptorSet.AppendDummy();
Tony Barbour1490c912015-07-28 10:17:20 -06004207 descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
Chris Forbes8291c052015-05-25 11:13:28 +12004208
4209 m_errorMonitor->ClearState();
Tony Barboured132432015-08-04 16:23:11 -06004210 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes8291c052015-05-25 11:13:28 +12004211
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004212 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes8291c052015-05-25 11:13:28 +12004213
Cody Northrop1684adb2015-08-05 11:15:02 -06004214 ASSERT_NE(0, msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes8291c052015-05-25 11:13:28 +12004215 if (!strstr(msgString.c_str(),"location 0 not consumed by VS")) {
4216 FAIL() << "Incorrect warning: " << msgString;
4217 }
4218}
4219
Chris Forbes37367e62015-05-25 11:13:29 +12004220TEST_F(VkLayerTest, CreatePipelineAttribNotProvided)
4221{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004222 VkFlags msgFlags;
Chris Forbes37367e62015-05-25 11:13:29 +12004223 std::string msgString;
4224 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisf2f97402015-09-11 12:57:55 -06004225 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes37367e62015-05-25 11:13:29 +12004226
4227 char const *vsSource =
4228 "#version 140\n"
4229 "#extension GL_ARB_separate_shader_objects: require\n"
4230 "#extension GL_ARB_shading_language_420pack: require\n"
4231 "\n"
4232 "layout(location=0) in vec4 x;\n" /* not provided */
4233 "void main(){\n"
4234 " gl_Position = x;\n"
4235 "}\n";
4236 char const *fsSource =
4237 "#version 140\n"
4238 "#extension GL_ARB_separate_shader_objects: require\n"
4239 "#extension GL_ARB_shading_language_420pack: require\n"
4240 "\n"
4241 "layout(location=0) out vec4 color;\n"
4242 "void main(){\n"
4243 " color = vec4(1);\n"
4244 "}\n";
4245
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06004246 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4247 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes37367e62015-05-25 11:13:29 +12004248
4249 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08004250 pipe.AddColorAttachment();
Chris Forbes37367e62015-05-25 11:13:29 +12004251 pipe.AddShader(&vs);
4252 pipe.AddShader(&fs);
4253
Chris Forbes37367e62015-05-25 11:13:29 +12004254 VkDescriptorSetObj descriptorSet(m_device);
4255 descriptorSet.AppendDummy();
Tony Barbour1490c912015-07-28 10:17:20 -06004256 descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
Chris Forbes37367e62015-05-25 11:13:29 +12004257
4258 m_errorMonitor->ClearState();
Tony Barboured132432015-08-04 16:23:11 -06004259 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes37367e62015-05-25 11:13:29 +12004260
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004261 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes37367e62015-05-25 11:13:29 +12004262
Cody Northrop1684adb2015-08-05 11:15:02 -06004263 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT));
Chris Forbes37367e62015-05-25 11:13:29 +12004264 if (!strstr(msgString.c_str(),"VS consumes input at location 0 but not provided")) {
4265 FAIL() << "Incorrect warning: " << msgString;
4266 }
4267}
4268
Chris Forbesa4b02322015-05-25 11:13:31 +12004269TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch)
4270{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004271 VkFlags msgFlags;
Chris Forbesa4b02322015-05-25 11:13:31 +12004272 std::string msgString;
4273 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisf2f97402015-09-11 12:57:55 -06004274 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa4b02322015-05-25 11:13:31 +12004275
4276 VkVertexInputBindingDescription input_binding;
4277 memset(&input_binding, 0, sizeof(input_binding));
4278
4279 VkVertexInputAttributeDescription input_attrib;
4280 memset(&input_attrib, 0, sizeof(input_attrib));
4281 input_attrib.format = VK_FORMAT_R32_SFLOAT;
4282
4283 char const *vsSource =
4284 "#version 140\n"
4285 "#extension GL_ARB_separate_shader_objects: require\n"
4286 "#extension GL_ARB_shading_language_420pack: require\n"
4287 "\n"
4288 "layout(location=0) in int x;\n" /* attrib provided float */
4289 "void main(){\n"
4290 " gl_Position = vec4(x);\n"
4291 "}\n";
4292 char const *fsSource =
4293 "#version 140\n"
4294 "#extension GL_ARB_separate_shader_objects: require\n"
4295 "#extension GL_ARB_shading_language_420pack: require\n"
4296 "\n"
4297 "layout(location=0) out vec4 color;\n"
4298 "void main(){\n"
4299 " color = vec4(1);\n"
4300 "}\n";
4301
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06004302 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4303 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa4b02322015-05-25 11:13:31 +12004304
4305 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08004306 pipe.AddColorAttachment();
Chris Forbesa4b02322015-05-25 11:13:31 +12004307 pipe.AddShader(&vs);
4308 pipe.AddShader(&fs);
4309
4310 pipe.AddVertexInputBindings(&input_binding, 1);
4311 pipe.AddVertexInputAttribs(&input_attrib, 1);
4312
Chris Forbesa4b02322015-05-25 11:13:31 +12004313 VkDescriptorSetObj descriptorSet(m_device);
4314 descriptorSet.AppendDummy();
Tony Barbour1490c912015-07-28 10:17:20 -06004315 descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
Chris Forbesa4b02322015-05-25 11:13:31 +12004316
4317 m_errorMonitor->ClearState();
Tony Barboured132432015-08-04 16:23:11 -06004318 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa4b02322015-05-25 11:13:31 +12004319
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004320 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbesa4b02322015-05-25 11:13:31 +12004321
Cody Northrop1684adb2015-08-05 11:15:02 -06004322 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT));
Chris Forbesa4b02322015-05-25 11:13:31 +12004323 if (!strstr(msgString.c_str(),"location 0 does not match VS input type")) {
4324 FAIL() << "Incorrect error: " << msgString;
4325 }
4326}
4327
Chris Forbes0bf8fe12015-06-12 11:16:41 +12004328TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict)
4329{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004330 VkFlags msgFlags;
Chris Forbes0bf8fe12015-06-12 11:16:41 +12004331 std::string msgString;
4332 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisf2f97402015-09-11 12:57:55 -06004333 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes0bf8fe12015-06-12 11:16:41 +12004334
4335 /* Two binding descriptions for binding 0 */
4336 VkVertexInputBindingDescription input_bindings[2];
4337 memset(input_bindings, 0, sizeof(input_bindings));
4338
4339 VkVertexInputAttributeDescription input_attrib;
4340 memset(&input_attrib, 0, sizeof(input_attrib));
4341 input_attrib.format = VK_FORMAT_R32_SFLOAT;
4342
4343 char const *vsSource =
4344 "#version 140\n"
4345 "#extension GL_ARB_separate_shader_objects: require\n"
4346 "#extension GL_ARB_shading_language_420pack: require\n"
4347 "\n"
4348 "layout(location=0) in float x;\n" /* attrib provided float */
4349 "void main(){\n"
4350 " gl_Position = vec4(x);\n"
4351 "}\n";
4352 char const *fsSource =
4353 "#version 140\n"
4354 "#extension GL_ARB_separate_shader_objects: require\n"
4355 "#extension GL_ARB_shading_language_420pack: require\n"
4356 "\n"
4357 "layout(location=0) out vec4 color;\n"
4358 "void main(){\n"
4359 " color = vec4(1);\n"
4360 "}\n";
4361
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06004362 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4363 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12004364
4365 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08004366 pipe.AddColorAttachment();
Chris Forbes0bf8fe12015-06-12 11:16:41 +12004367 pipe.AddShader(&vs);
4368 pipe.AddShader(&fs);
4369
4370 pipe.AddVertexInputBindings(input_bindings, 2);
4371 pipe.AddVertexInputAttribs(&input_attrib, 1);
4372
Chris Forbes0bf8fe12015-06-12 11:16:41 +12004373 VkDescriptorSetObj descriptorSet(m_device);
4374 descriptorSet.AppendDummy();
Tony Barbour1490c912015-07-28 10:17:20 -06004375 descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12004376
4377 m_errorMonitor->ClearState();
Tony Barboured132432015-08-04 16:23:11 -06004378 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes0bf8fe12015-06-12 11:16:41 +12004379
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004380 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12004381
Cody Northrop1684adb2015-08-05 11:15:02 -06004382 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT));
Chris Forbes0bf8fe12015-06-12 11:16:41 +12004383 if (!strstr(msgString.c_str(),"Duplicate vertex input binding descriptions for binding 0")) {
4384 FAIL() << "Incorrect error: " << msgString;
4385 }
4386}
Chris Forbes4c948702015-05-25 11:13:32 +12004387
Chris Forbesc12ef122015-05-25 11:13:40 +12004388/* TODO: would be nice to test the mixed broadcast & custom case, but the GLSL->SPV compiler
4389 * rejects it. */
4390
4391TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten)
4392{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004393 VkFlags msgFlags;
Chris Forbesc12ef122015-05-25 11:13:40 +12004394 std::string msgString;
4395 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc12ef122015-05-25 11:13:40 +12004396
4397 char const *vsSource =
4398 "#version 140\n"
4399 "#extension GL_ARB_separate_shader_objects: require\n"
4400 "#extension GL_ARB_shading_language_420pack: require\n"
4401 "\n"
4402 "void main(){\n"
4403 " gl_Position = vec4(1);\n"
4404 "}\n";
4405 char const *fsSource =
4406 "#version 140\n"
4407 "#extension GL_ARB_separate_shader_objects: require\n"
4408 "#extension GL_ARB_shading_language_420pack: require\n"
4409 "\n"
4410 "void main(){\n"
4411 "}\n";
4412
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06004413 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4414 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc12ef122015-05-25 11:13:40 +12004415
4416 VkPipelineObj pipe(m_device);
4417 pipe.AddShader(&vs);
4418 pipe.AddShader(&fs);
4419
Chia-I Wuc278df82015-07-07 11:50:03 +08004420 /* set up CB 0, not written */
4421 pipe.AddColorAttachment();
4422 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc12ef122015-05-25 11:13:40 +12004423
Chris Forbesc12ef122015-05-25 11:13:40 +12004424 VkDescriptorSetObj descriptorSet(m_device);
4425 descriptorSet.AppendDummy();
Tony Barbour1490c912015-07-28 10:17:20 -06004426 descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
Chris Forbesc12ef122015-05-25 11:13:40 +12004427
4428 m_errorMonitor->ClearState();
Tony Barboured132432015-08-04 16:23:11 -06004429 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc12ef122015-05-25 11:13:40 +12004430
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004431 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbesc12ef122015-05-25 11:13:40 +12004432
Cody Northrop1684adb2015-08-05 11:15:02 -06004433 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT));
Chris Forbesc12ef122015-05-25 11:13:40 +12004434 if (!strstr(msgString.c_str(),"Attachment 0 not written by FS")) {
4435 FAIL() << "Incorrect error: " << msgString;
4436 }
4437}
4438
Chris Forbes5d15a4f2015-05-25 11:13:43 +12004439TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed)
4440{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004441 VkFlags msgFlags;
Chris Forbes5d15a4f2015-05-25 11:13:43 +12004442 std::string msgString;
4443 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes5d15a4f2015-05-25 11:13:43 +12004444
4445 char const *vsSource =
4446 "#version 140\n"
4447 "#extension GL_ARB_separate_shader_objects: require\n"
4448 "#extension GL_ARB_shading_language_420pack: require\n"
4449 "\n"
4450 "void main(){\n"
4451 " gl_Position = vec4(1);\n"
4452 "}\n";
4453 char const *fsSource =
4454 "#version 140\n"
4455 "#extension GL_ARB_separate_shader_objects: require\n"
4456 "#extension GL_ARB_shading_language_420pack: require\n"
4457 "\n"
4458 "layout(location=0) out vec4 x;\n"
4459 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
4460 "void main(){\n"
4461 " x = vec4(1);\n"
4462 " y = vec4(1);\n"
4463 "}\n";
4464
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06004465 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4466 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12004467
4468 VkPipelineObj pipe(m_device);
4469 pipe.AddShader(&vs);
4470 pipe.AddShader(&fs);
4471
Chia-I Wuc278df82015-07-07 11:50:03 +08004472 /* set up CB 0, not written */
4473 pipe.AddColorAttachment();
4474 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes5d15a4f2015-05-25 11:13:43 +12004475 /* FS writes CB 1, but we don't configure it */
4476
Chris Forbes5d15a4f2015-05-25 11:13:43 +12004477 VkDescriptorSetObj descriptorSet(m_device);
4478 descriptorSet.AppendDummy();
Tony Barbour1490c912015-07-28 10:17:20 -06004479 descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12004480
4481 m_errorMonitor->ClearState();
Tony Barboured132432015-08-04 16:23:11 -06004482 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes5d15a4f2015-05-25 11:13:43 +12004483
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004484 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12004485
Cody Northrop1684adb2015-08-05 11:15:02 -06004486 ASSERT_NE(0, msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12004487 if (!strstr(msgString.c_str(),"FS writes to output location 1 with no matching attachment")) {
4488 FAIL() << "Incorrect warning: " << msgString;
4489 }
4490}
4491
Chris Forbes7d64a4f2015-05-25 11:13:44 +12004492TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch)
4493{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004494 VkFlags msgFlags;
Chris Forbes7d64a4f2015-05-25 11:13:44 +12004495 std::string msgString;
4496 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes7d64a4f2015-05-25 11:13:44 +12004497
4498 char const *vsSource =
4499 "#version 140\n"
4500 "#extension GL_ARB_separate_shader_objects: require\n"
4501 "#extension GL_ARB_shading_language_420pack: require\n"
4502 "\n"
4503 "void main(){\n"
4504 " gl_Position = vec4(1);\n"
4505 "}\n";
4506 char const *fsSource =
4507 "#version 140\n"
4508 "#extension GL_ARB_separate_shader_objects: require\n"
4509 "#extension GL_ARB_shading_language_420pack: require\n"
4510 "\n"
4511 "layout(location=0) out ivec4 x;\n" /* not UNORM */
4512 "void main(){\n"
4513 " x = ivec4(1);\n"
4514 "}\n";
4515
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06004516 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4517 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12004518
4519 VkPipelineObj pipe(m_device);
4520 pipe.AddShader(&vs);
4521 pipe.AddShader(&fs);
4522
Chia-I Wuc278df82015-07-07 11:50:03 +08004523 /* set up CB 0; type is UNORM by default */
4524 pipe.AddColorAttachment();
4525 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes7d64a4f2015-05-25 11:13:44 +12004526
Chris Forbes7d64a4f2015-05-25 11:13:44 +12004527 VkDescriptorSetObj descriptorSet(m_device);
4528 descriptorSet.AppendDummy();
Tony Barbour1490c912015-07-28 10:17:20 -06004529 descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12004530
4531 m_errorMonitor->ClearState();
Tony Barboured132432015-08-04 16:23:11 -06004532 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes7d64a4f2015-05-25 11:13:44 +12004533
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06004534 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12004535
Cody Northrop1684adb2015-08-05 11:15:02 -06004536 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT));
Chris Forbes7d64a4f2015-05-25 11:13:44 +12004537 if (!strstr(msgString.c_str(),"does not match FS output type")) {
4538 FAIL() << "Incorrect error: " << msgString;
4539 }
4540}
Chris Forbesc2050732015-06-05 14:43:36 +12004541
Chris Forbes76ce7882015-08-14 12:04:59 +12004542TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided)
4543{
4544 VkFlags msgFlags;
4545 std::string msgString;
4546 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes76ce7882015-08-14 12:04:59 +12004547
4548 char const *vsSource =
4549 "#version 140\n"
4550 "#extension GL_ARB_separate_shader_objects: require\n"
4551 "#extension GL_ARB_shading_language_420pack: require\n"
4552 "\n"
4553 "void main(){\n"
4554 " gl_Position = vec4(1);\n"
4555 "}\n";
4556 char const *fsSource =
4557 "#version 140\n"
4558 "#extension GL_ARB_separate_shader_objects: require\n"
4559 "#extension GL_ARB_shading_language_420pack: require\n"
4560 "\n"
4561 "layout(location=0) out vec4 x;\n"
4562 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
4563 "void main(){\n"
4564 " x = vec4(bar.y);\n"
4565 "}\n";
4566
4567 m_errorMonitor->ClearState();
4568
Courtney Goeltzenleuchter8e2f0972015-10-21 17:08:06 -06004569 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4570 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes76ce7882015-08-14 12:04:59 +12004571
4572
4573 VkPipelineObj pipe(m_device);
4574 pipe.AddShader(&vs);
4575 pipe.AddShader(&fs);
4576
4577 /* set up CB 0; type is UNORM by default */
4578 pipe.AddColorAttachment();
4579 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4580
4581 VkDescriptorSetObj descriptorSet(m_device);
4582 descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
4583
4584 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
4585
4586 /* should have generated an error -- pipeline layout does not
4587 * provide a uniform buffer in 0.0
4588 */
4589 msgFlags = m_errorMonitor->GetState(&msgString);
Courtney Goeltzenleuchter0abdb662015-10-07 13:28:58 -06004590 ASSERT_TRUE((msgFlags & VK_DBG_REPORT_ERROR_BIT) == VK_DBG_REPORT_ERROR_BIT);
Chris Forbes76ce7882015-08-14 12:04:59 +12004591 if (!strstr(msgString.c_str(),"not declared in pipeline layout")) {
4592 FAIL() << "Incorrect error: " << msgString;
4593 }
4594}
4595
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06004596#endif // SHADER_CHECKER_TESTS
4597
4598#if DEVICE_LIMITS_TESTS
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -06004599TEST_F(VkLayerTest, CreateImageLimitsViolationWidth)
4600{
4601 VkFlags msgFlags;
4602 std::string msgString;
4603
4604 ASSERT_NO_FATAL_FAILURE(InitState());
4605 m_errorMonitor->ClearState();
4606
4607 // Create an image
4608 VkImage image;
4609
4610 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4611 const int32_t tex_width = 32;
4612 const int32_t tex_height = 32;
4613
4614 VkImageCreateInfo image_create_info = {};
4615 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4616 image_create_info.pNext = NULL;
4617 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4618 image_create_info.format = tex_format;
4619 image_create_info.extent.width = tex_width;
4620 image_create_info.extent.height = tex_height;
4621 image_create_info.extent.depth = 1;
4622 image_create_info.mipLevels = 1;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -06004623 image_create_info.arrayLayers = 1;
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -06004624 image_create_info.samples = 1;
4625 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4626 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4627 image_create_info.flags = 0;
4628
4629 // Introduce error by sending down a bogus width extent
4630 image_create_info.extent.width = 65536;
4631 vkCreateImage(m_device->device(), &image_create_info, &image);
4632
4633 msgFlags = m_errorMonitor->GetState(&msgString);
4634 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error while creating an image" <<
4635 "with extents outside the queried limits";
4636 if (!strstr(msgString.c_str(),"CreateImage extents exceed allowable limits for format")) {
4637 FAIL() << "Error received did not match expected error message from vkCreateImage in DeviceLimits layer";
4638 }
4639}
4640
4641TEST_F(VkLayerTest, CreateImageResourceSizeViolation)
4642{
4643 VkFlags msgFlags;
4644 std::string msgString;
4645
4646 ASSERT_NO_FATAL_FAILURE(InitState());
4647 m_errorMonitor->ClearState();
4648
4649 // Create an image
4650 VkImage image;
4651
4652 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4653 const int32_t tex_width = 32;
4654 const int32_t tex_height = 32;
4655
4656 VkImageCreateInfo image_create_info = {};
4657 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4658 image_create_info.pNext = NULL;
4659 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4660 image_create_info.format = tex_format;
4661 image_create_info.extent.width = tex_width;
4662 image_create_info.extent.height = tex_height;
4663 image_create_info.extent.depth = 1;
4664 image_create_info.mipLevels = 1;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -06004665 image_create_info.arrayLayers = 1;
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -06004666 image_create_info.samples = 1;
4667 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4668 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4669 image_create_info.flags = 0;
4670
4671 // Introduce error by sending down individually allowable values that result in a surface size
4672 // exceeding the device maximum
4673 image_create_info.extent.width = 8192;
4674 image_create_info.extent.height = 8192;
4675 image_create_info.extent.depth = 16;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -06004676 image_create_info.arrayLayers = 4;
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -06004677 image_create_info.samples = 2;
4678 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4679 vkCreateImage(m_device->device(), &image_create_info, &image);
4680
4681 msgFlags = m_errorMonitor->GetState(&msgString);
4682 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error while creating an image" <<
4683 "with resource size exceeding queried limit";
4684 if (!strstr(msgString.c_str(),"CreateImage resource size exceeds allowable maximum")) {
4685 FAIL() << "Error received did not match expected error message from vkCreateImage in DeviceLimits layer";
4686 }
4687}
4688
Mike Stroyan43909d82015-09-25 13:39:21 -06004689TEST_F(VkLayerTest, UpdateBufferAlignment)
4690{
4691 VkFlags msgFlags;
4692 std::string msgString;
4693 uint32_t updateData[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
4694
4695 ASSERT_NO_FATAL_FAILURE(InitState());
4696
4697 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
4698 vk_testing::Buffer buffer;
4699 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
4700
4701 BeginCommandBuffer();
4702 // Introduce failure by using offset that is not multiple of 4
4703 m_cmdBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
4704 msgFlags = m_errorMonitor->GetState(&msgString);
4705 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an err after calling UpdateBuffer with bad offset";
4706 if (!strstr(msgString.c_str(),"destOffset, is not a multiple of 4")) {
4707 FAIL() << "Error received was not 'vkCmdUpdateBuffer parameter, VkDeviceSize destOffset, is not a multiple of 4'";
4708 }
4709 // Introduce failure by using size that is not multiple of 4
4710 m_cmdBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
4711 msgFlags = m_errorMonitor->GetState(&msgString);
4712 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an err after calling UpdateBuffer with bad size";
4713 if (!strstr(msgString.c_str(),"dataSize, is not a multiple of 4")) {
4714 FAIL() << "Error received was not 'vkCmdUpdateBuffer parameter, VkDeviceSize dataSize, is not a multiple of 4'";
4715 }
4716 EndCommandBuffer();
4717}
4718
4719TEST_F(VkLayerTest, FillBufferAlignment)
4720{
4721 VkFlags msgFlags;
4722 std::string msgString;
4723
4724 ASSERT_NO_FATAL_FAILURE(InitState());
4725
4726 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
4727 vk_testing::Buffer buffer;
4728 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
4729
4730 BeginCommandBuffer();
4731 // Introduce failure by using offset that is not multiple of 4
4732 m_cmdBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
4733 msgFlags = m_errorMonitor->GetState(&msgString);
4734 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an err after calling FillBuffer with bad offset";
4735 if (!strstr(msgString.c_str(),"destOffset, is not a multiple of 4")) {
4736 FAIL() << "Error received was not 'vkCmdFillBuffer parameter, VkDeviceSize destOffset, is not a multiple of 4'";
4737 }
4738 // Introduce failure by using size that is not multiple of 4
4739 m_cmdBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
4740 msgFlags = m_errorMonitor->GetState(&msgString);
4741 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an err after calling FillBuffer with bad size";
4742 if (!strstr(msgString.c_str(),"fillSize, is not a multiple of 4")) {
4743 FAIL() << "Error received was not 'vkCmdFillBuffer parameter, VkDeviceSize fillSize, is not a multiple of 4'";
4744 }
4745 EndCommandBuffer();
4746}
4747
Mark Lobodzinskic11cd2c2015-09-17 09:44:05 -06004748#endif // DEVICE_LIMITS_TESTS
Chris Forbes7d64a4f2015-05-25 11:13:44 +12004749
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06004750#if IMAGE_TESTS
4751TEST_F(VkLayerTest, InvalidImageView)
4752{
4753 VkFlags msgFlags;
4754 std::string msgString;
4755 VkResult err;
4756
4757 ASSERT_NO_FATAL_FAILURE(InitState());
4758 m_errorMonitor->ClearState();
4759
Mike Stroyan43909d82015-09-25 13:39:21 -06004760 // Create an image and try to create a view with bad baseMipLevel
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06004761 VkImage image;
4762
4763 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4764 const int32_t tex_width = 32;
4765 const int32_t tex_height = 32;
4766
4767 VkImageCreateInfo image_create_info = {};
4768 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4769 image_create_info.pNext = NULL;
4770 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4771 image_create_info.format = tex_format;
4772 image_create_info.extent.width = tex_width;
4773 image_create_info.extent.height = tex_height;
4774 image_create_info.extent.depth = 1;
4775 image_create_info.mipLevels = 1;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -06004776 image_create_info.arrayLayers = 1;
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06004777 image_create_info.samples = 1;
4778 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4779 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4780 image_create_info.flags = 0;
4781
4782 err = vkCreateImage(m_device->device(), &image_create_info, &image);
4783 ASSERT_VK_SUCCESS(err);
4784
4785 VkImageViewCreateInfo image_view_create_info = {};
4786 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4787 image_view_create_info.image = image;
4788 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
4789 image_view_create_info.format = tex_format;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06004790 image_view_create_info.subresourceRange.numLayers = 1;
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06004791 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06004792 image_view_create_info.subresourceRange.numLevels = 1;
Mark Lobodzinskib4092de2015-10-23 14:20:31 -06004793 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06004794
4795 VkImageView view;
4796 err = vkCreateImageView(m_device->device(), &image_view_create_info, &view);
4797
4798 msgFlags = m_errorMonitor->GetState(&msgString);
4799 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error while creating an invalid ImageView";
4800 if (!strstr(msgString.c_str(),"vkCreateImageView called with baseMipLevel 10 ")) {
Mike Stroyan43909d82015-09-25 13:39:21 -06004801 FAIL() << "Error received was not 'vkCreateImageView called with baseMipLevel 10...' but instead '" << msgString.c_str() << "'";
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06004802 }
4803}
Mike Stroyan43909d82015-09-25 13:39:21 -06004804
Mark Lobodzinskib4092de2015-10-23 14:20:31 -06004805TEST_F(VkLayerTest, InvalidImageViewAspect)
4806{
4807 VkFlags msgFlags;
4808 std::string msgString;
4809 VkResult err;
4810
4811 ASSERT_NO_FATAL_FAILURE(InitState());
4812 m_errorMonitor->ClearState();
4813
4814 // Create an image and try to create a view with an invalid aspectMask
4815 VkImage image;
4816
4817 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4818 const int32_t tex_width = 32;
4819 const int32_t tex_height = 32;
4820
4821 VkImageCreateInfo image_create_info = {};
4822 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4823 image_create_info.pNext = NULL;
4824 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4825 image_create_info.format = tex_format;
4826 image_create_info.extent.width = tex_width;
4827 image_create_info.extent.height = tex_height;
4828 image_create_info.extent.depth = 1;
4829 image_create_info.mipLevels = 1;
4830 image_create_info.samples = 1;
4831 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4832 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4833 image_create_info.flags = 0;
4834
4835 err = vkCreateImage(m_device->device(), &image_create_info, &image);
4836 ASSERT_VK_SUCCESS(err);
4837
4838 VkImageViewCreateInfo image_view_create_info = {};
4839 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4840 image_view_create_info.image = image;
4841 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
4842 image_view_create_info.format = tex_format;
4843 image_view_create_info.subresourceRange.baseMipLevel = 0;
4844 image_view_create_info.subresourceRange.numLevels = 1;
4845 // Cause an error by setting an invalid image aspect
4846 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
4847
4848 VkImageView view;
4849 err = vkCreateImageView(m_device->device(), &image_view_create_info, &view);
4850
4851 msgFlags = m_errorMonitor->GetState(&msgString);
4852 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error when specifying an invalid ImageView aspect";
4853 if (!strstr(msgString.c_str(),"vkCreateImageView: Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set")) {
4854 FAIL() << "Error received was not 'VkCreateImageView: Color image formats must have ...' but instead '" << msgString.c_str() << "'";
4855 }
4856}
4857
Mike Stroyan43909d82015-09-25 13:39:21 -06004858TEST_F(VkLayerTest, CopyImageTypeMismatch)
4859{
4860 VkFlags msgFlags;
4861 std::string msgString;
4862 VkResult err;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06004863 bool pass;
Mike Stroyan43909d82015-09-25 13:39:21 -06004864
4865 ASSERT_NO_FATAL_FAILURE(InitState());
4866 m_errorMonitor->ClearState();
4867
4868 // Create two images of different types and try to copy between them
4869 VkImage srcImage;
4870 VkImage destImage;
4871 VkDeviceMemory srcMem;
4872 VkDeviceMemory destMem;
4873 VkMemoryRequirements memReqs;
4874
4875 VkImageCreateInfo image_create_info = {};
4876 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4877 image_create_info.pNext = NULL;
4878 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4879 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4880 image_create_info.extent.width = 32;
4881 image_create_info.extent.height = 32;
4882 image_create_info.extent.depth = 1;
4883 image_create_info.mipLevels = 1;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -06004884 image_create_info.arrayLayers = 1;
Mike Stroyan43909d82015-09-25 13:39:21 -06004885 image_create_info.samples = 1;
4886 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4887 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT;
4888 image_create_info.flags = 0;
4889
4890 err = vkCreateImage(m_device->device(), &image_create_info, &srcImage);
4891 ASSERT_VK_SUCCESS(err);
4892
4893 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4894 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT;
4895
4896 err = vkCreateImage(m_device->device(), &image_create_info, &destImage);
4897 ASSERT_VK_SUCCESS(err);
4898
4899 // Allocate memory
4900 VkMemoryAllocInfo memAlloc = {};
4901 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
4902 memAlloc.pNext = NULL;
4903 memAlloc.allocationSize = 0;
4904 memAlloc.memoryTypeIndex = 0;
4905
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06004906 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06004907 memAlloc.allocationSize = memReqs.size;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06004908 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
4909 ASSERT_TRUE(pass);
Mike Stroyan43909d82015-09-25 13:39:21 -06004910 err = vkAllocMemory(m_device->device(), &memAlloc, &srcMem);
4911 ASSERT_VK_SUCCESS(err);
4912
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06004913 vkGetImageMemoryRequirements(m_device->device(), destImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06004914 memAlloc.allocationSize = memReqs.size;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06004915 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan43909d82015-09-25 13:39:21 -06004916 ASSERT_VK_SUCCESS(err);
4917 err = vkAllocMemory(m_device->device(), &memAlloc, &destMem);
4918 ASSERT_VK_SUCCESS(err);
4919
4920 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
4921 ASSERT_VK_SUCCESS(err);
4922 err = vkBindImageMemory(m_device->device(), destImage, destMem, 0);
4923 ASSERT_VK_SUCCESS(err);
4924
4925 BeginCommandBuffer();
4926 VkImageCopy copyRegion;
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -06004927 copyRegion.srcSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06004928 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06004929 copyRegion.srcSubresource.baseArrayLayer = 0;
4930 copyRegion.srcSubresource.numLayers = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06004931 copyRegion.srcOffset.x = 0;
4932 copyRegion.srcOffset.y = 0;
4933 copyRegion.srcOffset.z = 0;
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -06004934 copyRegion.destSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06004935 copyRegion.destSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06004936 copyRegion.destSubresource.baseArrayLayer = 0;
4937 copyRegion.destSubresource.numLayers = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06004938 copyRegion.destOffset.x = 0;
4939 copyRegion.destOffset.y = 0;
4940 copyRegion.destOffset.z = 0;
4941 copyRegion.extent.width = 1;
4942 copyRegion.extent.height = 1;
4943 copyRegion.extent.depth = 1;
4944 m_cmdBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, destImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
4945 EndCommandBuffer();
4946
4947 msgFlags = m_errorMonitor->GetState(&msgString);
4948 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error from vkCmdCopyImage type mismatch";
4949 if (!strstr(msgString.c_str(),"vkCmdCopyImage called with unmatched source and dest image types")) {
4950 FAIL() << "Error received was not 'vkCmdCopyImage called with unmatched source and dest image types' but instead '" << msgString.c_str() << "'";
4951 }
4952
4953 vkDestroyImage(m_device->device(), srcImage);
4954 vkDestroyImage(m_device->device(), destImage);
4955 vkFreeMemory(m_device->device(), srcMem);
4956 vkFreeMemory(m_device->device(), destMem);
4957}
4958
4959TEST_F(VkLayerTest, CopyImageFormatSizeMismatch)
4960{
4961 // TODO : Create two images with different format sizes and vkCmdCopyImage between them
4962}
4963
4964TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch)
4965{
4966 VkFlags msgFlags;
4967 std::string msgString;
4968 VkResult err;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06004969 bool pass;
Mike Stroyan43909d82015-09-25 13:39:21 -06004970
4971 ASSERT_NO_FATAL_FAILURE(InitState());
4972 m_errorMonitor->ClearState();
4973
4974 // Create two images of different types and try to copy between them
4975 VkImage srcImage;
4976 VkImage destImage;
4977 VkDeviceMemory srcMem;
4978 VkDeviceMemory destMem;
4979 VkMemoryRequirements memReqs;
4980
4981 VkImageCreateInfo image_create_info = {};
4982 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4983 image_create_info.pNext = NULL;
4984 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4985 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4986 image_create_info.extent.width = 32;
4987 image_create_info.extent.height = 32;
4988 image_create_info.extent.depth = 1;
4989 image_create_info.mipLevels = 1;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -06004990 image_create_info.arrayLayers = 1;
Mike Stroyan43909d82015-09-25 13:39:21 -06004991 image_create_info.samples = 1;
4992 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4993 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT;
4994 image_create_info.flags = 0;
4995
4996 err = vkCreateImage(m_device->device(), &image_create_info, &srcImage);
4997 ASSERT_VK_SUCCESS(err);
4998
4999 image_create_info.imageType = VK_IMAGE_TYPE_1D;
5000 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT;
5001
5002 err = vkCreateImage(m_device->device(), &image_create_info, &destImage);
5003 ASSERT_VK_SUCCESS(err);
5004
5005 // Allocate memory
5006 VkMemoryAllocInfo memAlloc = {};
5007 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
5008 memAlloc.pNext = NULL;
5009 memAlloc.allocationSize = 0;
5010 memAlloc.memoryTypeIndex = 0;
5011
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06005012 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06005013 memAlloc.allocationSize = memReqs.size;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06005014 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
5015 ASSERT_TRUE(pass);
Mike Stroyan43909d82015-09-25 13:39:21 -06005016 err = vkAllocMemory(m_device->device(), &memAlloc, &srcMem);
5017 ASSERT_VK_SUCCESS(err);
5018
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06005019 vkGetImageMemoryRequirements(m_device->device(), destImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06005020 memAlloc.allocationSize = memReqs.size;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06005021 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
5022 ASSERT_TRUE(pass);
Mike Stroyan43909d82015-09-25 13:39:21 -06005023 err = vkAllocMemory(m_device->device(), &memAlloc, &destMem);
5024 ASSERT_VK_SUCCESS(err);
5025
5026 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
5027 ASSERT_VK_SUCCESS(err);
5028 err = vkBindImageMemory(m_device->device(), destImage, destMem, 0);
5029 ASSERT_VK_SUCCESS(err);
5030
5031 BeginCommandBuffer();
5032 VkImageCopy copyRegion;
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -06005033 copyRegion.srcSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06005034 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06005035 copyRegion.srcSubresource.baseArrayLayer = 0;
5036 copyRegion.srcSubresource.numLayers = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06005037 copyRegion.srcOffset.x = 0;
5038 copyRegion.srcOffset.y = 0;
5039 copyRegion.srcOffset.z = 0;
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -06005040 copyRegion.destSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06005041 copyRegion.destSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06005042 copyRegion.destSubresource.baseArrayLayer = 0;
5043 copyRegion.destSubresource.numLayers = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06005044 copyRegion.destOffset.x = 0;
5045 copyRegion.destOffset.y = 0;
5046 copyRegion.destOffset.z = 0;
5047 copyRegion.extent.width = 1;
5048 copyRegion.extent.height = 1;
5049 copyRegion.extent.depth = 1;
5050 m_cmdBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, destImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
5051 EndCommandBuffer();
5052
5053 msgFlags = m_errorMonitor->GetState(&msgString);
5054 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error from vkCmdCopyImage type mismatch";
5055 if (!strstr(msgString.c_str(),"vkCmdCopyImage called with unmatched source and dest image types")) {
5056 FAIL() << "Error received was not 'vkCmdCopyImage called with unmatched source and dest image types' but instead '" << msgString.c_str() << "'";
5057 }
5058
5059 vkDestroyImage(m_device->device(), srcImage);
5060 vkDestroyImage(m_device->device(), destImage);
5061 vkFreeMemory(m_device->device(), srcMem);
5062 vkFreeMemory(m_device->device(), destMem);
5063}
5064
5065TEST_F(VkLayerTest, ResolveImageLowSampleCount)
5066{
5067 VkFlags msgFlags;
5068 std::string msgString;
5069 VkResult err;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06005070 bool pass;
Mike Stroyan43909d82015-09-25 13:39:21 -06005071
5072 ASSERT_NO_FATAL_FAILURE(InitState());
5073 m_errorMonitor->ClearState();
5074
5075 // Create two images of sample count 1 and try to Resolve between them
5076 VkImage srcImage;
5077 VkImage destImage;
5078 VkDeviceMemory srcMem;
5079 VkDeviceMemory destMem;
5080 VkMemoryRequirements memReqs;
5081
5082 VkImageCreateInfo image_create_info = {};
5083 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5084 image_create_info.pNext = NULL;
5085 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5086 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
5087 image_create_info.extent.width = 32;
5088 image_create_info.extent.height = 1;
5089 image_create_info.extent.depth = 1;
5090 image_create_info.mipLevels = 1;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -06005091 image_create_info.arrayLayers = 1;
Mike Stroyan43909d82015-09-25 13:39:21 -06005092 image_create_info.samples = 1;
5093 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
5094 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT;
5095 image_create_info.flags = 0;
5096
5097 err = vkCreateImage(m_device->device(), &image_create_info, &srcImage);
5098 ASSERT_VK_SUCCESS(err);
5099
5100 image_create_info.imageType = VK_IMAGE_TYPE_1D;
5101 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT;
5102
5103 err = vkCreateImage(m_device->device(), &image_create_info, &destImage);
5104 ASSERT_VK_SUCCESS(err);
5105
5106 // Allocate memory
5107 VkMemoryAllocInfo memAlloc = {};
5108 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
5109 memAlloc.pNext = NULL;
5110 memAlloc.allocationSize = 0;
5111 memAlloc.memoryTypeIndex = 0;
5112
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06005113 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06005114 memAlloc.allocationSize = memReqs.size;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06005115 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
5116 ASSERT_TRUE(pass);
Mike Stroyan43909d82015-09-25 13:39:21 -06005117 err = vkAllocMemory(m_device->device(), &memAlloc, &srcMem);
5118 ASSERT_VK_SUCCESS(err);
5119
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06005120 vkGetImageMemoryRequirements(m_device->device(), destImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06005121 memAlloc.allocationSize = memReqs.size;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06005122 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
5123 ASSERT_TRUE(pass);
Mike Stroyan43909d82015-09-25 13:39:21 -06005124 err = vkAllocMemory(m_device->device(), &memAlloc, &destMem);
5125 ASSERT_VK_SUCCESS(err);
5126
5127 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
5128 ASSERT_VK_SUCCESS(err);
5129 err = vkBindImageMemory(m_device->device(), destImage, destMem, 0);
5130 ASSERT_VK_SUCCESS(err);
5131
5132 BeginCommandBuffer();
5133 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
5134 //VK_IMAGE_LAYOUT_UNDEFINED = 0,
5135 //VK_IMAGE_LAYOUT_GENERAL = 1,
5136 VkImageResolve resolveRegion;
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -06005137 resolveRegion.srcSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06005138 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06005139 resolveRegion.srcSubresource.baseArrayLayer = 0;
5140 resolveRegion.srcSubresource.numLayers = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06005141 resolveRegion.srcOffset.x = 0;
5142 resolveRegion.srcOffset.y = 0;
5143 resolveRegion.srcOffset.z = 0;
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -06005144 resolveRegion.destSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06005145 resolveRegion.destSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06005146 resolveRegion.destSubresource.baseArrayLayer = 0;
5147 resolveRegion.destSubresource.numLayers = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06005148 resolveRegion.destOffset.x = 0;
5149 resolveRegion.destOffset.y = 0;
5150 resolveRegion.destOffset.z = 0;
5151 resolveRegion.extent.width = 1;
5152 resolveRegion.extent.height = 1;
5153 resolveRegion.extent.depth = 1;
5154 m_cmdBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, destImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
5155 EndCommandBuffer();
5156
5157 msgFlags = m_errorMonitor->GetState(&msgString);
5158 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error from vkCmdResolveImage type mismatch";
5159 if (!strstr(msgString.c_str(),"vkCmdResolveImage called with source sample count less than 2.")) {
5160 FAIL() << "Error received was not 'vkCmdResolveImage called with source sample count less than 2.' but instead '" << msgString.c_str() << "'";
5161 }
5162
5163 vkDestroyImage(m_device->device(), srcImage);
5164 vkDestroyImage(m_device->device(), destImage);
5165 vkFreeMemory(m_device->device(), srcMem);
5166 vkFreeMemory(m_device->device(), destMem);
5167}
5168
5169TEST_F(VkLayerTest, ResolveImageHighSampleCount)
5170{
5171 VkFlags msgFlags;
5172 std::string msgString;
5173 VkResult err;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06005174 bool pass;
Mike Stroyan43909d82015-09-25 13:39:21 -06005175
5176 ASSERT_NO_FATAL_FAILURE(InitState());
5177 m_errorMonitor->ClearState();
5178
5179 // Create two images of sample count 2 and try to Resolve between them
5180 VkImage srcImage;
5181 VkImage destImage;
5182 VkDeviceMemory srcMem;
5183 VkDeviceMemory destMem;
5184 VkMemoryRequirements memReqs;
5185
5186 VkImageCreateInfo image_create_info = {};
5187 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5188 image_create_info.pNext = NULL;
5189 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5190 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
5191 image_create_info.extent.width = 32;
5192 image_create_info.extent.height = 1;
5193 image_create_info.extent.depth = 1;
5194 image_create_info.mipLevels = 1;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -06005195 image_create_info.arrayLayers = 1;
Mike Stroyan43909d82015-09-25 13:39:21 -06005196 image_create_info.samples = 2;
5197 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Cody Northropb3bf94f2015-10-27 13:50:04 -06005198 // Note: Some implementations expect color attachment usage for any multisample surface
5199 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06005200 image_create_info.flags = 0;
5201
5202 err = vkCreateImage(m_device->device(), &image_create_info, &srcImage);
5203 ASSERT_VK_SUCCESS(err);
5204
5205 image_create_info.imageType = VK_IMAGE_TYPE_1D;
Cody Northropb3bf94f2015-10-27 13:50:04 -06005206 // Note: Some implementations expect color attachment usage for any multisample surface
5207 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06005208
5209 err = vkCreateImage(m_device->device(), &image_create_info, &destImage);
5210 ASSERT_VK_SUCCESS(err);
5211
5212 // Allocate memory
5213 VkMemoryAllocInfo memAlloc = {};
5214 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
5215 memAlloc.pNext = NULL;
5216 memAlloc.allocationSize = 0;
5217 memAlloc.memoryTypeIndex = 0;
5218
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06005219 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06005220 memAlloc.allocationSize = memReqs.size;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06005221 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
5222 ASSERT_TRUE(pass);
Mike Stroyan43909d82015-09-25 13:39:21 -06005223 err = vkAllocMemory(m_device->device(), &memAlloc, &srcMem);
5224 ASSERT_VK_SUCCESS(err);
5225
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06005226 vkGetImageMemoryRequirements(m_device->device(), destImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06005227 memAlloc.allocationSize = memReqs.size;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06005228 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
5229 ASSERT_TRUE(pass);
Mike Stroyan43909d82015-09-25 13:39:21 -06005230 err = vkAllocMemory(m_device->device(), &memAlloc, &destMem);
5231 ASSERT_VK_SUCCESS(err);
5232
5233 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
5234 ASSERT_VK_SUCCESS(err);
5235 err = vkBindImageMemory(m_device->device(), destImage, destMem, 0);
5236 ASSERT_VK_SUCCESS(err);
5237
5238 BeginCommandBuffer();
5239 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
5240 //VK_IMAGE_LAYOUT_UNDEFINED = 0,
5241 //VK_IMAGE_LAYOUT_GENERAL = 1,
5242 VkImageResolve resolveRegion;
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -06005243 resolveRegion.srcSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06005244 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06005245 resolveRegion.srcSubresource.baseArrayLayer = 0;
5246 resolveRegion.srcSubresource.numLayers = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06005247 resolveRegion.srcOffset.x = 0;
5248 resolveRegion.srcOffset.y = 0;
5249 resolveRegion.srcOffset.z = 0;
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -06005250 resolveRegion.destSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06005251 resolveRegion.destSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06005252 resolveRegion.destSubresource.baseArrayLayer = 0;
5253 resolveRegion.destSubresource.numLayers = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06005254 resolveRegion.destOffset.x = 0;
5255 resolveRegion.destOffset.y = 0;
5256 resolveRegion.destOffset.z = 0;
5257 resolveRegion.extent.width = 1;
5258 resolveRegion.extent.height = 1;
5259 resolveRegion.extent.depth = 1;
5260 m_cmdBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, destImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
5261 EndCommandBuffer();
5262
5263 msgFlags = m_errorMonitor->GetState(&msgString);
5264 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error from vkCmdResolveImage type mismatch";
5265 if (!strstr(msgString.c_str(),"vkCmdResolveImage called with dest sample count greater than 1.")) {
5266 FAIL() << "Error received was not 'vkCmdResolveImage called with dest sample count greater than 1.' but instead '" << msgString.c_str() << "'";
5267 }
5268
5269 vkDestroyImage(m_device->device(), srcImage);
5270 vkDestroyImage(m_device->device(), destImage);
5271 vkFreeMemory(m_device->device(), srcMem);
5272 vkFreeMemory(m_device->device(), destMem);
5273}
5274
5275TEST_F(VkLayerTest, ResolveImageFormatMismatch)
5276{
5277 VkFlags msgFlags;
5278 std::string msgString;
5279 VkResult err;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06005280 bool pass;
Mike Stroyan43909d82015-09-25 13:39:21 -06005281
5282 ASSERT_NO_FATAL_FAILURE(InitState());
5283 m_errorMonitor->ClearState();
5284
5285 // Create two images of different types and try to copy between them
5286 VkImage srcImage;
5287 VkImage destImage;
5288 VkDeviceMemory srcMem;
5289 VkDeviceMemory destMem;
5290 VkMemoryRequirements memReqs;
5291
5292 VkImageCreateInfo image_create_info = {};
5293 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5294 image_create_info.pNext = NULL;
5295 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5296 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
5297 image_create_info.extent.width = 32;
5298 image_create_info.extent.height = 1;
5299 image_create_info.extent.depth = 1;
5300 image_create_info.mipLevels = 1;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -06005301 image_create_info.arrayLayers = 1;
Mike Stroyan43909d82015-09-25 13:39:21 -06005302 image_create_info.samples = 2;
5303 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Cody Northropb3bf94f2015-10-27 13:50:04 -06005304 // Note: Some implementations expect color attachment usage for any multisample surface
5305 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06005306 image_create_info.flags = 0;
5307
5308 err = vkCreateImage(m_device->device(), &image_create_info, &srcImage);
5309 ASSERT_VK_SUCCESS(err);
5310
Cody Northropb3bf94f2015-10-27 13:50:04 -06005311 // Set format to something other than source image
5312 image_create_info.format = VK_FORMAT_R32_SFLOAT;
5313 // Note: Some implementations expect color attachment usage for any multisample surface
5314 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06005315 image_create_info.samples = 1;
5316
5317 err = vkCreateImage(m_device->device(), &image_create_info, &destImage);
5318 ASSERT_VK_SUCCESS(err);
5319
5320 // Allocate memory
5321 VkMemoryAllocInfo memAlloc = {};
5322 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
5323 memAlloc.pNext = NULL;
5324 memAlloc.allocationSize = 0;
5325 memAlloc.memoryTypeIndex = 0;
5326
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06005327 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06005328 memAlloc.allocationSize = memReqs.size;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06005329 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
5330 ASSERT_TRUE(pass);
Mike Stroyan43909d82015-09-25 13:39:21 -06005331 err = vkAllocMemory(m_device->device(), &memAlloc, &srcMem);
5332 ASSERT_VK_SUCCESS(err);
5333
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06005334 vkGetImageMemoryRequirements(m_device->device(), destImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06005335 memAlloc.allocationSize = memReqs.size;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06005336 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
5337 ASSERT_TRUE(pass);
Mike Stroyan43909d82015-09-25 13:39:21 -06005338 err = vkAllocMemory(m_device->device(), &memAlloc, &destMem);
5339 ASSERT_VK_SUCCESS(err);
5340
5341 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
5342 ASSERT_VK_SUCCESS(err);
5343 err = vkBindImageMemory(m_device->device(), destImage, destMem, 0);
5344 ASSERT_VK_SUCCESS(err);
5345
5346 BeginCommandBuffer();
5347 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
5348 //VK_IMAGE_LAYOUT_UNDEFINED = 0,
5349 //VK_IMAGE_LAYOUT_GENERAL = 1,
5350 VkImageResolve resolveRegion;
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -06005351 resolveRegion.srcSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06005352 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06005353 resolveRegion.srcSubresource.baseArrayLayer = 0;
5354 resolveRegion.srcSubresource.numLayers = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06005355 resolveRegion.srcOffset.x = 0;
5356 resolveRegion.srcOffset.y = 0;
5357 resolveRegion.srcOffset.z = 0;
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -06005358 resolveRegion.destSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06005359 resolveRegion.destSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06005360 resolveRegion.destSubresource.baseArrayLayer = 0;
5361 resolveRegion.destSubresource.numLayers = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06005362 resolveRegion.destOffset.x = 0;
5363 resolveRegion.destOffset.y = 0;
5364 resolveRegion.destOffset.z = 0;
5365 resolveRegion.extent.width = 1;
5366 resolveRegion.extent.height = 1;
5367 resolveRegion.extent.depth = 1;
5368 m_cmdBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, destImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
5369 EndCommandBuffer();
5370
5371 msgFlags = m_errorMonitor->GetState(&msgString);
5372 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error from vkCmdResolveImage format mismatch";
5373 if (!strstr(msgString.c_str(),"vkCmdResolveImage called with unmatched source and dest formats.")) {
5374 FAIL() << "Error received was not 'vkCmdResolveImage called with unmatched source and dest formats.' but instead '" << msgString.c_str() << "'";
5375 }
5376
5377 vkDestroyImage(m_device->device(), srcImage);
5378 vkDestroyImage(m_device->device(), destImage);
5379 vkFreeMemory(m_device->device(), srcMem);
5380 vkFreeMemory(m_device->device(), destMem);
5381}
5382
5383TEST_F(VkLayerTest, ResolveImageTypeMismatch)
5384{
5385 VkFlags msgFlags;
5386 std::string msgString;
5387 VkResult err;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06005388 bool pass;
Mike Stroyan43909d82015-09-25 13:39:21 -06005389
5390 ASSERT_NO_FATAL_FAILURE(InitState());
5391 m_errorMonitor->ClearState();
5392
5393 // Create two images of different types and try to copy between them
5394 VkImage srcImage;
5395 VkImage destImage;
5396 VkDeviceMemory srcMem;
5397 VkDeviceMemory destMem;
5398 VkMemoryRequirements memReqs;
5399
5400 VkImageCreateInfo image_create_info = {};
5401 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5402 image_create_info.pNext = NULL;
5403 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5404 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
5405 image_create_info.extent.width = 32;
5406 image_create_info.extent.height = 1;
5407 image_create_info.extent.depth = 1;
5408 image_create_info.mipLevels = 1;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -06005409 image_create_info.arrayLayers = 1;
Mike Stroyan43909d82015-09-25 13:39:21 -06005410 image_create_info.samples = 2;
5411 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Cody Northropb3bf94f2015-10-27 13:50:04 -06005412 // Note: Some implementations expect color attachment usage for any multisample surface
5413 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06005414 image_create_info.flags = 0;
5415
5416 err = vkCreateImage(m_device->device(), &image_create_info, &srcImage);
5417 ASSERT_VK_SUCCESS(err);
5418
5419 image_create_info.imageType = VK_IMAGE_TYPE_1D;
Cody Northropb3bf94f2015-10-27 13:50:04 -06005420 // Note: Some implementations expect color attachment usage for any multisample surface
5421 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06005422 image_create_info.samples = 1;
5423
5424 err = vkCreateImage(m_device->device(), &image_create_info, &destImage);
5425 ASSERT_VK_SUCCESS(err);
5426
5427 // Allocate memory
5428 VkMemoryAllocInfo memAlloc = {};
5429 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
5430 memAlloc.pNext = NULL;
5431 memAlloc.allocationSize = 0;
5432 memAlloc.memoryTypeIndex = 0;
5433
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06005434 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06005435 memAlloc.allocationSize = memReqs.size;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06005436 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
5437 ASSERT_TRUE(pass);
Mike Stroyan43909d82015-09-25 13:39:21 -06005438 err = vkAllocMemory(m_device->device(), &memAlloc, &srcMem);
5439 ASSERT_VK_SUCCESS(err);
5440
Courtney Goeltzenleuchter01d2ae12015-10-20 16:40:38 -06005441 vkGetImageMemoryRequirements(m_device->device(), destImage, &memReqs);
Mike Stroyan43909d82015-09-25 13:39:21 -06005442 memAlloc.allocationSize = memReqs.size;
Courtney Goeltzenleuchter37a43a62015-10-22 11:03:31 -06005443 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
5444 ASSERT_TRUE(pass);
Mike Stroyan43909d82015-09-25 13:39:21 -06005445 err = vkAllocMemory(m_device->device(), &memAlloc, &destMem);
5446 ASSERT_VK_SUCCESS(err);
5447
5448 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
5449 ASSERT_VK_SUCCESS(err);
5450 err = vkBindImageMemory(m_device->device(), destImage, destMem, 0);
5451 ASSERT_VK_SUCCESS(err);
5452
5453 BeginCommandBuffer();
5454 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
5455 //VK_IMAGE_LAYOUT_UNDEFINED = 0,
5456 //VK_IMAGE_LAYOUT_GENERAL = 1,
5457 VkImageResolve resolveRegion;
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -06005458 resolveRegion.srcSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06005459 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06005460 resolveRegion.srcSubresource.baseArrayLayer = 0;
5461 resolveRegion.srcSubresource.numLayers = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06005462 resolveRegion.srcOffset.x = 0;
5463 resolveRegion.srcOffset.y = 0;
5464 resolveRegion.srcOffset.z = 0;
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -06005465 resolveRegion.destSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyan43909d82015-09-25 13:39:21 -06005466 resolveRegion.destSubresource.mipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06005467 resolveRegion.destSubresource.baseArrayLayer = 0;
5468 resolveRegion.destSubresource.numLayers = 0;
Mike Stroyan43909d82015-09-25 13:39:21 -06005469 resolveRegion.destOffset.x = 0;
5470 resolveRegion.destOffset.y = 0;
5471 resolveRegion.destOffset.z = 0;
5472 resolveRegion.extent.width = 1;
5473 resolveRegion.extent.height = 1;
5474 resolveRegion.extent.depth = 1;
5475 m_cmdBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, destImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
5476 EndCommandBuffer();
5477
5478 msgFlags = m_errorMonitor->GetState(&msgString);
5479 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive an error from vkCmdResolveImage type mismatch";
5480 if (!strstr(msgString.c_str(),"vkCmdResolveImage called with unmatched source and dest image types.")) {
5481 FAIL() << "Error received was not 'vkCmdResolveImage called with unmatched source and dest image types.' but instead '" << msgString.c_str() << "'";
5482 }
5483
5484 vkDestroyImage(m_device->device(), srcImage);
5485 vkDestroyImage(m_device->device(), destImage);
5486 vkFreeMemory(m_device->device(), srcMem);
5487 vkFreeMemory(m_device->device(), destMem);
5488}
Tobin Ehlisb46be812015-10-23 16:00:08 -06005489
5490TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError)
5491{
5492 // Create a single Image descriptor and cause it to first hit an error due
5493 // to using a DS format, then cause it to hit error due to COLOR_BIT not set in aspect
5494 // The image format check comes 2nd in validation so we trigger it first,
5495 // then when we cause aspect fail next, bad format check will be preempted
5496 VkFlags msgFlags;
5497 std::string msgString;
5498 VkResult err;
5499
5500 ASSERT_NO_FATAL_FAILURE(InitState());
5501 m_errorMonitor->ClearState();
5502 VkDescriptorTypeCount ds_type_count = {};
5503 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
5504 ds_type_count.count = 1;
5505
5506 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5507 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5508 ds_pool_ci.pNext = NULL;
5509 ds_pool_ci.maxSets = 1;
5510 ds_pool_ci.count = 1;
5511 ds_pool_ci.pTypeCount = &ds_type_count;
5512
5513 VkDescriptorPool ds_pool;
5514 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, &ds_pool);
5515 ASSERT_VK_SUCCESS(err);
5516
5517 VkDescriptorSetLayoutBinding dsl_binding = {};
5518 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
5519 dsl_binding.arraySize = 1;
5520 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5521 dsl_binding.pImmutableSamplers = NULL;
5522
5523 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5524 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5525 ds_layout_ci.pNext = NULL;
5526 ds_layout_ci.count = 1;
5527 ds_layout_ci.pBinding = &dsl_binding;
5528 VkDescriptorSetLayout ds_layout;
5529 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
5530 ASSERT_VK_SUCCESS(err);
5531
5532 VkDescriptorSet descriptorSet;
5533 VkDescriptorSetAllocInfo alloc_info = {};
5534 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO;
5535 alloc_info.count = 1;
5536 alloc_info.descriptorPool = ds_pool;
5537 alloc_info.pSetLayouts = &ds_layout;
5538 err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
5539 ASSERT_VK_SUCCESS(err);
5540
5541 VkImage image_bad;
5542 VkImage image_good;
5543 // One bad format and one good format for Color attachment
5544 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
5545 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
5546 const int32_t tex_width = 32;
5547 const int32_t tex_height = 32;
5548
5549 VkImageCreateInfo image_create_info = {};
5550 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5551 image_create_info.pNext = NULL;
5552 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5553 image_create_info.format = tex_format_bad;
5554 image_create_info.extent.width = tex_width;
5555 image_create_info.extent.height = tex_height;
5556 image_create_info.extent.depth = 1;
5557 image_create_info.mipLevels = 1;
5558 image_create_info.arrayLayers = 1;
5559 image_create_info.samples = 1;
5560 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5561 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
5562 image_create_info.flags = 0;
5563
5564 err = vkCreateImage(m_device->device(), &image_create_info, &image_bad);
5565 ASSERT_VK_SUCCESS(err);
5566 image_create_info.format = tex_format_good;
5567 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
5568 err = vkCreateImage(m_device->device(), &image_create_info, &image_good);
5569 ASSERT_VK_SUCCESS(err);
5570
5571 VkImageViewCreateInfo image_view_create_info = {};
5572 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5573 image_view_create_info.image = image_bad;
5574 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5575 image_view_create_info.format = tex_format_bad;
5576 image_view_create_info.subresourceRange.baseArrayLayer = 0;
5577 image_view_create_info.subresourceRange.baseMipLevel = 0;
5578 image_view_create_info.subresourceRange.numLayers = 1;
5579 image_view_create_info.subresourceRange.numLevels = 1;
5580 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5581
5582 VkImageView view;
5583 err = vkCreateImageView(m_device->device(), &image_view_create_info, &view);
5584 msgFlags = m_errorMonitor->GetState(&msgString);
5585 ASSERT_TRUE(0 != (msgFlags & VK_DBG_REPORT_ERROR_BIT)) << "Did not receive error after creating ImageView for DS image w/ COLOR aspect bit set.";
5586 if (!strstr(msgString.c_str(),"Combination depth/stencil image formats can have only the ")) {
5587 FAIL() << "Error received was not 'Combination depth/stencil image formats can have only the....' but instead '" << msgString.c_str() << "'";
5588 }
5589
5590 vkDestroyImage(m_device->device(), image_bad);
5591 vkDestroyImage(m_device->device(), image_good);
5592 vkDestroyImageView(m_device->device(), view);
5593 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout);
5594 vkDestroyDescriptorPool(m_device->device(), ds_pool);
5595}
5596
Tobin Ehlis342b9bf2015-09-22 10:11:37 -06005597#endif // IMAGE_TESTS
5598
Tony Barbour30486ea2015-04-07 13:44:53 -06005599int main(int argc, char **argv) {
5600 int result;
5601
5602 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour01999182015-04-09 12:58:51 -06005603 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour30486ea2015-04-07 13:44:53 -06005604
5605 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
5606
5607 result = RUN_ALL_TESTS();
5608
Tony Barbour01999182015-04-09 12:58:51 -06005609 VkTestFramework::Finish();
Tony Barbour30486ea2015-04-07 13:44:53 -06005610 return result;
5611}