blob: a3dbd0e2777826b47efcefbc48c0765fedfb33b5 [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"
Tony Barbour30486ea2015-04-07 13:44:53 -06003#include "gtest-1.7.0/include/gtest/gtest.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"
Tony Barbour30486ea2015-04-07 13:44:53 -06006
Mark Lobodzinski5f25be42015-05-14 15:08:13 -05007#define GLM_FORCE_RADIANS
8#include "glm/glm.hpp"
9#include <glm/gtc/matrix_transform.hpp>
10
Tobin Ehlis57e6a612015-05-26 16:11:58 -060011#define MEM_TRACKER_TESTS 1
12#define OBJ_TRACKER_TESTS 1
13#define DRAW_STATE_TESTS 1
14#define THREADING_TESTS 1
Chris Forbes5af3bf22015-05-25 11:13:08 +120015#define SHADER_CHECKER_TESTS 1
Tobin Ehlis57e6a612015-05-26 16:11:58 -060016
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050017//--------------------------------------------------------------------------------------
18// Mesh and VertexFormat Data
19//--------------------------------------------------------------------------------------
20struct Vertex
21{
22 float posX, posY, posZ, posW; // Position data
23 float r, g, b, a; // Color
24};
25
26#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
27
28typedef enum _BsoFailSelect {
29 BsoFailNone = 0x00000000,
30 BsoFailRaster = 0x00000001,
31 BsoFailViewport = 0x00000002,
32 BsoFailColorBlend = 0x00000004,
33 BsoFailDepthStencil = 0x00000008,
34} BsoFailSelect;
35
36struct vktriangle_vs_uniform {
37 // Must start with MVP
38 float mvp[4][4];
39 float position[3][4];
40 float color[3][4];
41};
42
Mark Lobodzinski6bbdff12015-06-02 09:41:30 -050043static const char bindStateVertShaderText[] =
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050044 "#version 130\n"
45 "vec2 vertices[3];\n"
46 "void main() {\n"
47 " vertices[0] = vec2(-1.0, -1.0);\n"
48 " vertices[1] = vec2( 1.0, -1.0);\n"
49 " vertices[2] = vec2( 0.0, 1.0);\n"
50 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
51 "}\n";
52
Mark Lobodzinski6bbdff12015-06-02 09:41:30 -050053static const char bindStateFragShaderText[] =
Cody Northrop74a2d2c2015-06-16 17:32:04 -060054 "#version 140\n"
55 "#extension GL_ARB_separate_shader_objects: require\n"
56 "#extension GL_ARB_shading_language_420pack: require\n"
57 "\n"
58 "layout(location = 0) out vec4 uFragColor;\n"
59 "void main(){\n"
60 " uFragColor = vec4(0,1,0,1);\n"
61 "}\n";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050062
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060063static void myDbgFunc(
64 VkFlags msgFlags,
65 VkObjectType objType,
66 VkObject srcObject,
67 size_t location,
68 int32_t msgCode,
69 const char* pLayerPrefix,
70 const char* pMsg,
71 void* pUserData);
Tony Barbour30486ea2015-04-07 13:44:53 -060072
73class ErrorMonitor {
74public:
Tony Barbour0c1bdc62015-04-29 17:34:29 -060075 ErrorMonitor()
Tony Barbour30486ea2015-04-07 13:44:53 -060076 {
Mike Stroyan09aae812015-05-12 16:00:45 -060077 pthread_mutexattr_t attr;
78 pthread_mutexattr_init(&attr);
79 pthread_mutex_init(&m_mutex, &attr);
80 pthread_mutex_lock(&m_mutex);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060081 m_msgFlags = VK_DBG_REPORT_INFO_BIT;
Mike Stroyan09aae812015-05-12 16:00:45 -060082 m_bailout = NULL;
83 pthread_mutex_unlock(&m_mutex);
Tony Barbour30486ea2015-04-07 13:44:53 -060084 }
85 void ClearState()
86 {
Mike Stroyan09aae812015-05-12 16:00:45 -060087 pthread_mutex_lock(&m_mutex);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060088 m_msgFlags = VK_DBG_REPORT_INFO_BIT;
Tony Barbour30486ea2015-04-07 13:44:53 -060089 m_msgString.clear();
Mike Stroyan09aae812015-05-12 16:00:45 -060090 pthread_mutex_unlock(&m_mutex);
Tony Barbour30486ea2015-04-07 13:44:53 -060091 }
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060092 VkFlags GetState(std::string *msgString)
Tony Barbour30486ea2015-04-07 13:44:53 -060093 {
Mike Stroyan09aae812015-05-12 16:00:45 -060094 pthread_mutex_lock(&m_mutex);
Tony Barbour30486ea2015-04-07 13:44:53 -060095 *msgString = m_msgString;
Mike Stroyan09aae812015-05-12 16:00:45 -060096 pthread_mutex_unlock(&m_mutex);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060097 return m_msgFlags;
Tony Barbour30486ea2015-04-07 13:44:53 -060098 }
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060099 void SetState(VkFlags msgFlags, const char *msgString)
Tony Barbour30486ea2015-04-07 13:44:53 -0600100 {
Mike Stroyan09aae812015-05-12 16:00:45 -0600101 pthread_mutex_lock(&m_mutex);
102 if (m_bailout != NULL) {
103 *m_bailout = true;
104 }
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600105 m_msgFlags = msgFlags;
Tony Barbour8508b8e2015-04-09 10:48:04 -0600106 m_msgString.reserve(strlen(msgString));
107 m_msgString = msgString;
Mike Stroyan09aae812015-05-12 16:00:45 -0600108 pthread_mutex_unlock(&m_mutex);
109 }
110 void SetBailout(bool *bailout)
111 {
112 m_bailout = bailout;
Tony Barbour30486ea2015-04-07 13:44:53 -0600113 }
114
115private:
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600116 VkFlags m_msgFlags;
Mike Stroyan09aae812015-05-12 16:00:45 -0600117 std::string m_msgString;
118 pthread_mutex_t m_mutex;
119 bool* m_bailout;
Tony Barbour30486ea2015-04-07 13:44:53 -0600120};
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500121
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600122static void myDbgFunc(
123 VkFlags msgFlags,
124 VkObjectType objType,
125 VkObject srcObject,
126 size_t location,
127 int32_t msgCode,
128 const char* pLayerPrefix,
129 const char* pMsg,
130 void* pUserData)
Tony Barbour30486ea2015-04-07 13:44:53 -0600131{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600132 if (msgFlags & (VK_DBG_REPORT_WARN_BIT | VK_DBG_REPORT_ERROR_BIT)) {
Tony Barbour8508b8e2015-04-09 10:48:04 -0600133 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600134 errMonitor->SetState(msgFlags, pMsg);
Tony Barbour8508b8e2015-04-09 10:48:04 -0600135 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600136}
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500137
Tony Barbour01999182015-04-09 12:58:51 -0600138class VkLayerTest : public VkRenderFramework
Tony Barbour30486ea2015-04-07 13:44:53 -0600139{
140public:
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600141 VkResult BeginCommandBuffer(VkCommandBufferObj &cmdBuffer);
142 VkResult EndCommandBuffer(VkCommandBufferObj &cmdBuffer);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500143 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
144 void GenericDrawPreparation(VkCommandBufferObj *cmdBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask);
Tony Barbour30486ea2015-04-07 13:44:53 -0600145
146protected:
Tony Barbour01999182015-04-09 12:58:51 -0600147 VkMemoryRefManager m_memoryRefManager;
148 ErrorMonitor *m_errorMonitor;
Tony Barbour30486ea2015-04-07 13:44:53 -0600149
150 virtual void SetUp() {
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600151 std::vector<const char *> instance_layer_names;
152 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600153 std::vector<const char *> instance_extension_names;
154 std::vector<const char *> device_extension_names;
Tony Barbour950ebc02015-04-23 12:55:36 -0600155
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600156 instance_extension_names.push_back(DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterde53c5b2015-06-16 15:59:11 -0600157 /*
158 * Since CreateDbgMsgCallback is an instance level extension call
159 * any extension / layer that utilizes that feature also needs
160 * to be enabled at create instance time.
161 */
Mike Stroyaned254572015-06-17 16:32:06 -0600162 // Use Threading layer first to protect others from ThreadCmdBufferCollision test
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600163 instance_layer_names.push_back("Threading");
164 instance_layer_names.push_back("ObjectTracker");
165 instance_layer_names.push_back("MemTracker");
166 instance_layer_names.push_back("DrawState");
167 instance_layer_names.push_back("ShaderChecker");
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600168
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600169 device_layer_names.push_back("Threading");
170 device_layer_names.push_back("ObjectTracker");
171 device_layer_names.push_back("MemTracker");
172 device_layer_names.push_back("DrawState");
173 device_layer_names.push_back("ShaderChecker");
Tony Barbour30486ea2015-04-07 13:44:53 -0600174
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600175 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour30486ea2015-04-07 13:44:53 -0600176 this->app_info.pNext = NULL;
177 this->app_info.pAppName = "layer_tests";
178 this->app_info.appVersion = 1;
179 this->app_info.pEngineName = "unittest";
180 this->app_info.engineVersion = 1;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600181 this->app_info.apiVersion = VK_API_VERSION;
Tony Barbour30486ea2015-04-07 13:44:53 -0600182
Tony Barbour0c1bdc62015-04-29 17:34:29 -0600183 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600184 InitFramework(instance_layer_names, device_layer_names,
185 instance_extension_names, device_extension_names,
186 myDbgFunc, m_errorMonitor);
Tony Barbour30486ea2015-04-07 13:44:53 -0600187 }
188
189 virtual void TearDown() {
190 // Clean up resources before we reset
Tony Barbour30486ea2015-04-07 13:44:53 -0600191 ShutdownFramework();
Tony Barbour8508b8e2015-04-09 10:48:04 -0600192 delete m_errorMonitor;
Tony Barbour30486ea2015-04-07 13:44:53 -0600193 }
194};
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500195
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600196VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour30486ea2015-04-07 13:44:53 -0600197{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600198 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600199
200 result = cmdBuffer.BeginCommandBuffer();
201
202 /*
203 * For render test all drawing happens in a single render pass
204 * on a single command buffer.
205 */
Chris Forbesfe133ef2015-06-16 14:05:59 +1200206 if (VK_SUCCESS == result && renderPass()) {
Tony Barbour30486ea2015-04-07 13:44:53 -0600207 cmdBuffer.BeginRenderPass(renderPass(), framebuffer());
208 }
209
210 return result;
211}
212
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600213VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour30486ea2015-04-07 13:44:53 -0600214{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600215 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600216
Chris Forbesfe133ef2015-06-16 14:05:59 +1200217 if (renderPass()) {
Chia-I Wu88eaa3b2015-06-26 15:34:39 +0800218 cmdBuffer.EndRenderPass();
Chris Forbesfe133ef2015-06-16 14:05:59 +1200219 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600220
221 result = cmdBuffer.EndCommandBuffer();
222
223 return result;
224}
225
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500226void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask)
227{
228 // Create identity matrix
229 int i;
230 struct vktriangle_vs_uniform data;
231
232 glm::mat4 Projection = glm::mat4(1.0f);
233 glm::mat4 View = glm::mat4(1.0f);
234 glm::mat4 Model = glm::mat4(1.0f);
235 glm::mat4 MVP = Projection * View * Model;
236 const int matrixSize = sizeof(MVP);
237 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
238
239 memcpy(&data.mvp, &MVP[0][0], matrixSize);
240
241 static const Vertex tri_data[] =
242 {
243 { XYZ1( -1, -1, 0 ), XYZ1( 1.f, 0.f, 0.f ) },
244 { XYZ1( 1, -1, 0 ), XYZ1( 0.f, 1.f, 0.f ) },
245 { XYZ1( 0, 1, 0 ), XYZ1( 0.f, 0.f, 1.f ) },
246 };
247
248 for (i=0; i<3; i++) {
249 data.position[i][0] = tri_data[i].posX;
250 data.position[i][1] = tri_data[i].posY;
251 data.position[i][2] = tri_data[i].posZ;
252 data.position[i][3] = tri_data[i].posW;
253 data.color[i][0] = tri_data[i].r;
254 data.color[i][1] = tri_data[i].g;
255 data.color[i][2] = tri_data[i].b;
256 data.color[i][3] = tri_data[i].a;
257 }
258
259 ASSERT_NO_FATAL_FAILURE(InitState());
260 ASSERT_NO_FATAL_FAILURE(InitViewport());
261
262 VkConstantBufferObj constantBuffer(m_device, bufSize*2, sizeof(float), (const void*) &data);
263
264 VkShaderObj vs(m_device,vertShaderText,VK_SHADER_STAGE_VERTEX, this);
265 VkShaderObj ps(m_device,fragShaderText, VK_SHADER_STAGE_FRAGMENT, this);
266
267 VkPipelineObj pipelineobj(m_device);
268 pipelineobj.AddShader(&vs);
269 pipelineobj.AddShader(&ps);
270
271 VkDescriptorSetObj descriptorSet(m_device);
272 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
273
274 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
275 VkCommandBufferObj cmdBuffer(m_device);
276 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
277
278 ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
279
280 GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet, failMask);
281
282 // render triangle
283 cmdBuffer.Draw(0, 3, 0, 1);
284
285 // finalize recording of the command buffer
286 EndCommandBuffer(cmdBuffer);
287
288 cmdBuffer.QueueCommandBuffer();
289}
290
291void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *cmdBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask)
292{
293 if (m_depthStencil->Initialized()) {
294 cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
295 } else {
296 cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
297 }
298
299 cmdBuffer->PrepareAttachments();
300 if ((failMask & BsoFailRaster) != BsoFailRaster) {
301 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_RASTER, m_stateRaster);
302 }
303 if ((failMask & BsoFailViewport) != BsoFailViewport) {
304 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_VIEWPORT, m_stateViewport);
305 }
306 if ((failMask & BsoFailColorBlend) != BsoFailColorBlend) {
307 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_COLOR_BLEND, m_colorBlend);
308 }
309 if ((failMask & BsoFailDepthStencil) != BsoFailDepthStencil) {
310 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_DEPTH_STENCIL, m_stateDepthStencil);
311 }
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600312 // Make sure depthWriteEnable is set so that DepthStencil fail test will work correctly
313 VkStencilOpState stencil = {
314 .stencilFailOp = VK_STENCIL_OP_KEEP,
315 .stencilPassOp = VK_STENCIL_OP_KEEP,
316 .stencilDepthFailOp = VK_STENCIL_OP_KEEP,
317 .stencilCompareOp = VK_COMPARE_OP_NEVER
318 };
319 VkPipelineDsStateCreateInfo ds_ci = {
320 .sType = VK_STRUCTURE_TYPE_PIPELINE_DS_STATE_CREATE_INFO,
321 .pNext = NULL,
322 .format = VK_FORMAT_D24_UNORM_S8_UINT,
323 .depthTestEnable = VK_FALSE,
324 .depthWriteEnable = VK_TRUE,
325 .depthCompareOp = VK_COMPARE_OP_NEVER,
326 .depthBoundsEnable = VK_FALSE,
327 .stencilTestEnable = VK_FALSE,
328 .front = stencil,
329 .back = stencil
330 };
331 pipelineobj.SetDepthStencil(&ds_ci);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500332 descriptorSet.CreateVKDescriptorSet(cmdBuffer);
333 pipelineobj.CreateVKPipeline(descriptorSet);
334 cmdBuffer->BindPipeline(pipelineobj);
335 cmdBuffer->BindDescriptorSet(descriptorSet);
336}
337
338// ********************************************************************************************************************
339// ********************************************************************************************************************
340// ********************************************************************************************************************
341// ********************************************************************************************************************
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600342#if MEM_TRACKER_TESTS
Mark Lobodzinski81078192015-05-19 10:28:29 -0500343TEST_F(VkLayerTest, CallResetCmdBufferBeforeCompletion)
344{
345 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600346 VkFlags msgFlags;
Mark Lobodzinski81078192015-05-19 10:28:29 -0500347 std::string msgString;
348
349 VkFenceCreateInfo fenceInfo = {};
350 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
351 fenceInfo.pNext = NULL;
352 fenceInfo.flags = 0;
353
354 ASSERT_NO_FATAL_FAILURE(InitState());
355 ASSERT_NO_FATAL_FAILURE(InitViewport());
356 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
357
358 VkCommandBufferObj cmdBuffer(m_device);
359 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
360
361 BeginCommandBuffer(cmdBuffer);
362 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
363 EndCommandBuffer(cmdBuffer);
364
365 testFence.init(*m_device, fenceInfo);
366
367 // Bypass framework since it does the waits automatically
368 VkResult err = VK_SUCCESS;
369 err = vkQueueSubmit( m_device->m_queue, 1, &cmdBuffer.obj(), testFence.obj());
370 ASSERT_VK_SUCCESS( err );
371
372 m_errorMonitor->ClearState();
373 // Introduce failure by calling begin again before checking fence
374 vkResetCommandBuffer(cmdBuffer.obj());
375
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600376 msgFlags = m_errorMonitor->GetState(&msgString);
377 ASSERT_TRUE(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 -0500378 if (!strstr(msgString.c_str(),"Resetting CB")) {
379 FAIL() << "Error received was not 'Resetting CB (0xaddress) before it has completed. You must check CB flag before'";
380 }
381}
382
383TEST_F(VkLayerTest, CallBeginCmdBufferBeforeCompletion)
384{
385 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600386 VkFlags msgFlags;
Mark Lobodzinski81078192015-05-19 10:28:29 -0500387 std::string msgString;
388
389 VkFenceCreateInfo fenceInfo = {};
390 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
391 fenceInfo.pNext = NULL;
392 fenceInfo.flags = 0;
393
394 ASSERT_NO_FATAL_FAILURE(InitState());
395 ASSERT_NO_FATAL_FAILURE(InitViewport());
396 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
397
398 VkCommandBufferObj cmdBuffer(m_device);
399 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
400
401 BeginCommandBuffer(cmdBuffer);
402 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
403 EndCommandBuffer(cmdBuffer);
404
405 testFence.init(*m_device, fenceInfo);
406
407 // Bypass framework since it does the waits automatically
408 VkResult err = VK_SUCCESS;
409 err = vkQueueSubmit( m_device->m_queue, 1, &cmdBuffer.obj(), testFence.obj());
410 ASSERT_VK_SUCCESS( err );
411
412 m_errorMonitor->ClearState();
413 // Introduce failure by calling begin again before checking fence
414 BeginCommandBuffer(cmdBuffer);
415
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600416 msgFlags = m_errorMonitor->GetState(&msgString);
417 ASSERT_TRUE(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 -0500418 if (!strstr(msgString.c_str(),"Calling vkBeginCommandBuffer() on active CB")) {
419 FAIL() << "Error received was not 'Calling vkBeginCommandBuffer() on an active CB (0xaddress) before it has completed'";
420 }
421}
422
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500423TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit)
424{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600425 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500426 std::string msgString;
427 VkResult err;
428
429 ASSERT_NO_FATAL_FAILURE(InitState());
430 m_errorMonitor->ClearState();
431
432 // Create an image, allocate memory, free it, and then try to bind it
433 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500434 VkDeviceMemory mem;
435 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500436
437 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
438 const int32_t tex_width = 32;
439 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500440
441 const VkImageCreateInfo image_create_info = {
442 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
443 .pNext = NULL,
444 .imageType = VK_IMAGE_TYPE_2D,
445 .format = tex_format,
446 .extent = { tex_width, tex_height, 1 },
447 .mipLevels = 1,
448 .arraySize = 1,
449 .samples = 1,
450 .tiling = VK_IMAGE_TILING_LINEAR,
451 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
452 .flags = 0,
453 };
454 VkMemoryAllocInfo mem_alloc = {
455 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
456 .pNext = NULL,
457 .allocationSize = 0,
458 // Introduce failure, do NOT set memProps to VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Mark Lobodzinski72346292015-07-02 16:49:40 -0600459 .memoryTypeIndex = 1,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500460 };
461
462 err = vkCreateImage(m_device->device(), &image_create_info, &image);
463 ASSERT_VK_SUCCESS(err);
464
Tony Barbour426b9052015-06-24 16:06:58 -0600465 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500466 VK_OBJECT_TYPE_IMAGE,
467 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500468 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500469 ASSERT_VK_SUCCESS(err);
470
Mark Lobodzinski23182612015-05-29 09:32:35 -0500471 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500472
473 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500474 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500475 ASSERT_VK_SUCCESS(err);
476
477 // Try to bind free memory that has been freed
Mark Lobodzinski23182612015-05-29 09:32:35 -0500478 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500479 ASSERT_VK_SUCCESS(err);
480
481 // Map memory as if to initialize the image
482 void *mappedAddress = NULL;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500483 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, &mappedAddress);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500484
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600485 msgFlags = m_errorMonitor->GetState(&msgString);
486 ASSERT_TRUE(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 -0500487 if (!strstr(msgString.c_str(),"Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT")) {
488 FAIL() << "Error received did not match expected error message from vkMapMemory in MemTracker";
489 }
490}
491
492TEST_F(VkLayerTest, BindInvalidMemory)
493{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600494 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500495 std::string msgString;
496 VkResult err;
497
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
510 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600511 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
512 .pNext = NULL,
513 .imageType = VK_IMAGE_TYPE_2D,
514 .format = tex_format,
515 .extent = { tex_width, tex_height, 1 },
516 .mipLevels = 1,
517 .arraySize = 1,
518 .samples = 1,
519 .tiling = VK_IMAGE_TILING_LINEAR,
520 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
521 .flags = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500522 };
523 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600524 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
525 .pNext = NULL,
526 .allocationSize = 0,
527 .memoryTypeIndex = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500528 };
529
530 err = vkCreateImage(m_device->device(), &image_create_info, &image);
531 ASSERT_VK_SUCCESS(err);
532
Tony Barbour426b9052015-06-24 16:06:58 -0600533 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500534 VK_OBJECT_TYPE_IMAGE,
535 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500536 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500537 ASSERT_VK_SUCCESS(err);
538
Mark Lobodzinski23182612015-05-29 09:32:35 -0500539 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500540
Mark Lobodzinski72346292015-07-02 16:49:40 -0600541 err = m_device->gpu().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
542 ASSERT_VK_SUCCESS(err);
543
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500544 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500545 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500546 ASSERT_VK_SUCCESS(err);
547
548 // Introduce validation failure, free memory before binding
Mark Lobodzinski23182612015-05-29 09:32:35 -0500549 vkFreeMemory(m_device->device(), mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500550 ASSERT_VK_SUCCESS(err);
551
552 // Try to bind free memory that has been freed
Mark Lobodzinski23182612015-05-29 09:32:35 -0500553 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500554 ASSERT_VK_SUCCESS(err);
555
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600556 msgFlags = m_errorMonitor->GetState(&msgString);
557 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error while tring to bind a freed memory object";
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500558 if (!strstr(msgString.c_str(),"couldn't find info for mem obj")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500559 FAIL() << "Error received did not match expected error message from BindObjectMemory in MemTracker";
560 }
561}
562
563TEST_F(VkLayerTest, FreeBoundMemory)
564{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600565 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500566 std::string msgString;
567 VkResult err;
568
569 ASSERT_NO_FATAL_FAILURE(InitState());
570 m_errorMonitor->ClearState();
571
572 // Create an image, allocate memory, free it, and then try to bind it
573 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500574 VkDeviceMemory mem;
575 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500576
577 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
578 const int32_t tex_width = 32;
579 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500580
581 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600582 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
583 .pNext = NULL,
584 .imageType = VK_IMAGE_TYPE_2D,
585 .format = tex_format,
586 .extent = { tex_width, tex_height, 1 },
587 .mipLevels = 1,
588 .arraySize = 1,
589 .samples = 1,
590 .tiling = VK_IMAGE_TILING_LINEAR,
591 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
592 .flags = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500593 };
594 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600595 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
596 .pNext = NULL,
597 .allocationSize = 0,
598 .memoryTypeIndex = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500599 };
600
601 err = vkCreateImage(m_device->device(), &image_create_info, &image);
602 ASSERT_VK_SUCCESS(err);
603
Tony Barbour426b9052015-06-24 16:06:58 -0600604 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500605 VK_OBJECT_TYPE_IMAGE,
606 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500607 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500608 ASSERT_VK_SUCCESS(err);
609
Mark Lobodzinski23182612015-05-29 09:32:35 -0500610 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500611
Mark Lobodzinski72346292015-07-02 16:49:40 -0600612 err = m_device->gpu().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
613 ASSERT_VK_SUCCESS(err);
614
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500615 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500616 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500617 ASSERT_VK_SUCCESS(err);
618
619 // Bind memory to Image object
Mark Lobodzinski23182612015-05-29 09:32:35 -0500620 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500621 ASSERT_VK_SUCCESS(err);
622
623 // Introduce validation failure, free memory while still bound to object
Mark Lobodzinski23182612015-05-29 09:32:35 -0500624 vkFreeMemory(m_device->device(), mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500625 ASSERT_VK_SUCCESS(err);
626
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600627 msgFlags = m_errorMonitor->GetState(&msgString);
Courtney Goeltzenleuchter7dc4c8b2015-06-13 21:48:47 -0600628 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an warning while tring to free bound memory";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500629 if (!strstr(msgString.c_str(),"Freeing memory object while it still has references")) {
630 FAIL() << "Warning received did not match expected message from freeMemObjInfo in MemTracker";
631 }
632}
633
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500634TEST_F(VkLayerTest, RebindMemory)
635{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600636 VkFlags msgFlags;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500637 std::string msgString;
638 VkResult err;
639
640 ASSERT_NO_FATAL_FAILURE(InitState());
641 m_errorMonitor->ClearState();
642
643 // Create an image, allocate memory, free it, and then try to bind it
644 VkImage image;
645 VkDeviceMemory mem1;
646 VkDeviceMemory mem2;
647 VkMemoryRequirements mem_reqs;
648
649 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
650 const int32_t tex_width = 32;
651 const int32_t tex_height = 32;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500652
653 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600654 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
655 .pNext = NULL,
656 .imageType = VK_IMAGE_TYPE_2D,
657 .format = tex_format,
658 .extent = { tex_width, tex_height, 1 },
659 .mipLevels = 1,
660 .arraySize = 1,
661 .samples = 1,
662 .tiling = VK_IMAGE_TILING_LINEAR,
663 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
664 .flags = 0,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500665 };
666 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600667 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
668 .pNext = NULL,
669 .allocationSize = 0,
670 .memoryTypeIndex = 0,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500671 };
672
673 err = vkCreateImage(m_device->device(), &image_create_info, &image);
674 ASSERT_VK_SUCCESS(err);
675
Tony Barbour426b9052015-06-24 16:06:58 -0600676 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500677 VK_OBJECT_TYPE_IMAGE,
678 image,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500679 &mem_reqs);
680 ASSERT_VK_SUCCESS(err);
681
682 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski72346292015-07-02 16:49:40 -0600683 err = m_device->gpu().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
684 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500685
686 // allocate 2 memory objects
687 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem1);
688 ASSERT_VK_SUCCESS(err);
689 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem2);
690 ASSERT_VK_SUCCESS(err);
691
692 // Bind first memory object to Image object
693 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem1, 0);
694 ASSERT_VK_SUCCESS(err);
695
696 // Introduce validation failure, try to bind a different memory object to the same image object
697 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem2, 0);
698 ASSERT_VK_SUCCESS(err);
699
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600700 msgFlags = m_errorMonitor->GetState(&msgString);
701 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error while tring to rebind an object";
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500702 if (!strstr(msgString.c_str(),"which has already been bound to mem object")) {
703 FAIL() << "Error received did not match expected message when rebinding memory to an object";
704 }
705}
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500706
707TEST_F(VkLayerTest, BindMemoryToDestroyedObject)
708{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600709 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500710 std::string msgString;
711 VkResult err;
712
713 ASSERT_NO_FATAL_FAILURE(InitState());
714 m_errorMonitor->ClearState();
715
716 // Create an image object, allocate memory, destroy the object and then try to bind it
717 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500718 VkDeviceMemory mem;
719 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500720
721 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
722 const int32_t tex_width = 32;
723 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500724
725 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600726 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
727 .pNext = NULL,
728 .imageType = VK_IMAGE_TYPE_2D,
729 .format = tex_format,
730 .extent = { tex_width, tex_height, 1 },
731 .mipLevels = 1,
732 .arraySize = 1,
733 .samples = 1,
734 .tiling = VK_IMAGE_TILING_LINEAR,
735 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
736 .flags = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500737 };
738 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600739 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
740 .pNext = NULL,
741 .allocationSize = 0,
742 .memoryTypeIndex = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500743 };
744
745 err = vkCreateImage(m_device->device(), &image_create_info, &image);
746 ASSERT_VK_SUCCESS(err);
747
Tony Barbour426b9052015-06-24 16:06:58 -0600748 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500749 VK_OBJECT_TYPE_IMAGE,
750 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500751 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500752 ASSERT_VK_SUCCESS(err);
753
Mark Lobodzinski23182612015-05-29 09:32:35 -0500754 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski72346292015-07-02 16:49:40 -0600755 err = m_device->gpu().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
756 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500757
758 // Allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500759 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500760 ASSERT_VK_SUCCESS(err);
761
762 // Introduce validation failure, destroy Image object before binding
763 vkDestroyObject(m_device->device(), VK_OBJECT_TYPE_IMAGE, image);
764 ASSERT_VK_SUCCESS(err);
765
766 // Now Try to bind memory to this destroyted object
Mark Lobodzinski23182612015-05-29 09:32:35 -0500767 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500768 ASSERT_VK_SUCCESS(err);
769
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600770 msgFlags = m_errorMonitor->GetState(&msgString);
771 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error while binding memory to a destroyed object";
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500772 if (!strstr(msgString.c_str(),"that's not in global list")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500773 FAIL() << "Error received did not match expected error message from updateObjectBinding in MemTracker";
774 }
775}
776
Tony Barbour8508b8e2015-04-09 10:48:04 -0600777TEST_F(VkLayerTest, SubmitSignaledFence)
Tony Barbour30486ea2015-04-07 13:44:53 -0600778{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600779 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600780 VkFlags msgFlags;
Tony Barbour30486ea2015-04-07 13:44:53 -0600781 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600782
783 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600784 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
785 fenceInfo.pNext = NULL;
786 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour30486ea2015-04-07 13:44:53 -0600787
Tony Barbour30486ea2015-04-07 13:44:53 -0600788 ASSERT_NO_FATAL_FAILURE(InitState());
789 ASSERT_NO_FATAL_FAILURE(InitViewport());
790 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
791
Tony Barbour01999182015-04-09 12:58:51 -0600792 VkCommandBufferObj cmdBuffer(m_device);
Tony Barbour30486ea2015-04-07 13:44:53 -0600793 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
794
Tony Barbour8508b8e2015-04-09 10:48:04 -0600795 BeginCommandBuffer(cmdBuffer);
Tony Barbour30486ea2015-04-07 13:44:53 -0600796 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour8508b8e2015-04-09 10:48:04 -0600797 EndCommandBuffer(cmdBuffer);
Tony Barbour30486ea2015-04-07 13:44:53 -0600798
799 testFence.init(*m_device, fenceInfo);
800 m_errorMonitor->ClearState();
Tony Barbour8508b8e2015-04-09 10:48:04 -0600801 cmdBuffer.QueueCommandBuffer(testFence.obj());
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600802 msgFlags = m_errorMonitor->GetState(&msgString);
803 ASSERT_TRUE(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 -0600804 if (!strstr(msgString.c_str(),"submitted in SIGNALED state. Fences must be reset before being submitted")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500805 FAIL() << "Error received was not 'VkQueueSubmit with fence in SIGNALED_STATE'";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600806 }
807
808}
809
810TEST_F(VkLayerTest, ResetUnsignaledFence)
811{
812 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600813 VkFlags msgFlags;
Tony Barbour8508b8e2015-04-09 10:48:04 -0600814 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600815 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600816 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
817 fenceInfo.pNext = NULL;
818
Tony Barbour8508b8e2015-04-09 10:48:04 -0600819 ASSERT_NO_FATAL_FAILURE(InitState());
820 testFence.init(*m_device, fenceInfo);
821 m_errorMonitor->ClearState();
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600822 VkFence fences[1] = {testFence.obj()};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600823 vkResetFences(m_device->device(), 1, fences);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600824 msgFlags = m_errorMonitor->GetState(&msgString);
825 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from submitting fence with UNSIGNALED state to vkResetFences";
Tony Barbour01999182015-04-09 12:58:51 -0600826 if (!strstr(msgString.c_str(),"submitted to VkResetFences in UNSIGNALED STATE")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500827 FAIL() << "Error received was not 'VkResetFences with fence in UNSIGNALED_STATE'";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600828 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600829
830}
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600831
832TEST_F(VkLayerTest, InvalidUsageBits)
833{
834 // Initiate Draw w/o a PSO bound
835 VkFlags msgFlags;
836 std::string msgString;
837
838 ASSERT_NO_FATAL_FAILURE(InitState());
839 m_errorMonitor->ClearState();
840 VkCommandBufferObj cmdBuffer(m_device);
841 BeginCommandBuffer(cmdBuffer);
842
843 const VkExtent3D e3d = {
844 .width = 128,
845 .height = 128,
846 .depth = 1,
847 };
848 const VkImageCreateInfo ici = {
849 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
850 .pNext = NULL,
851 .imageType = VK_IMAGE_TYPE_2D,
852 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
853 .extent = e3d,
854 .mipLevels = 1,
855 .arraySize = 1,
856 .samples = 1,
857 .tiling = VK_IMAGE_TILING_LINEAR,
858 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_BIT
859 .flags = 0,
860 };
861
862 VkImage dsi;
863 vkCreateImage(m_device->device(), &ici, &dsi);
864 VkDepthStencilView dsv;
865 const VkDepthStencilViewCreateInfo dsvci = {
866 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
867 .pNext = NULL,
868 .image = dsi,
869 .mipLevel = 0,
870 .baseArraySlice = 0,
871 .arraySize = 1,
872 .flags = 0,
873 };
874 vkCreateDepthStencilView(m_device->device(), &dsvci, &dsv);
875 msgFlags = m_errorMonitor->GetState(&msgString);
876 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after attempting to create DSView w/ image lacking USAGE_DS_BIT flag";
877 if (!strstr(msgString.c_str(),"Invalid usage flag for image ")) {
878 FAIL() << "Error received was not 'Invalid usage flag for image...'";
879 }
880}
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600881#endif
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600882#if OBJ_TRACKER_TESTS
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500883TEST_F(VkLayerTest, RasterStateNotBound)
884{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600885 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500886 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600887 ASSERT_NO_FATAL_FAILURE(InitState());
888 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500889 TEST_DESCRIPTION("Simple Draw Call that validates failure when a raster state object is not bound beforehand");
890
891 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailRaster);
892
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600893 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600894 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Not Binding a Raster State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500895 if (!strstr(msgString.c_str(),"Raster object not bound to this command buffer")) {
896 FAIL() << "Error received was not 'Raster object not bound to this command buffer'";
897 }
898}
899
900TEST_F(VkLayerTest, ViewportStateNotBound)
901{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600902 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500903 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600904 ASSERT_NO_FATAL_FAILURE(InitState());
905 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500906 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport state object is not bound beforehand");
907
908 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
909
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600910 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600911 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Not Binding a Viewport State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500912 if (!strstr(msgString.c_str(),"Viewport object not bound to this command buffer")) {
913 FAIL() << "Error received was not 'Viewport object not bound to this command buffer'";
914 }
915}
916
917TEST_F(VkLayerTest, ColorBlendStateNotBound)
918{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600919 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500920 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600921 ASSERT_NO_FATAL_FAILURE(InitState());
922 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500923 TEST_DESCRIPTION("Simple Draw Call that validates failure when a color-blend state object is not bound beforehand");
924
925 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailColorBlend);
926
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600927 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600928 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Not Binding a ColorBlend State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500929 if (!strstr(msgString.c_str(),"Color-blend object not bound to this command buffer")) {
930 FAIL() << "Error received was not 'Color-blend object not bound to this command buffer'";
931 }
932}
933
934TEST_F(VkLayerTest, DepthStencilStateNotBound)
935{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600936 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500937 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600938 ASSERT_NO_FATAL_FAILURE(InitState());
939 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500940 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth-stencil state object is not bound beforehand");
941
942 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthStencil);
943
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600944 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600945 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Not Binding a DepthStencil State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500946 if (!strstr(msgString.c_str(),"Depth-stencil object not bound to this command buffer")) {
947 FAIL() << "Error received was not 'Depth-stencil object not bound to this command buffer'";
948 }
Tony Barbourdb686622015-05-06 09:35:56 -0600949}
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600950#endif
951#if DRAW_STATE_TESTS
Tobin Ehlise4076782015-06-24 15:53:07 -0600952TEST_F(VkLayerTest, BindPipelineNoRenderPass)
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600953{
954 // Initiate Draw w/o a PSO bound
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600955 VkFlags msgFlags;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600956 std::string msgString;
957
958 ASSERT_NO_FATAL_FAILURE(InitState());
959 m_errorMonitor->ClearState();
960 VkCommandBufferObj cmdBuffer(m_device);
961 BeginCommandBuffer(cmdBuffer);
962 VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
963 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600964 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlise4076782015-06-24 15:53:07 -0600965 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding pipeline to CmdBuffer w/o active RenderPass";
966 if (!strstr(msgString.c_str(),"Incorrectly binding graphics pipeline ")) {
967 FAIL() << "Error received was not 'Incorrectly binding graphics pipeline (0xbaadb1be) without an active RenderPass'";
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600968 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600969}
970
971TEST_F(VkLayerTest, InvalidDescriptorPool)
972{
973 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
974 // The DS check for this is after driver has been called to validate DS internal data struct
975 // Attempt to clear DS Pool with bad object
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600976/* VkFlags msgFlags;
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600977 std::string msgString;
978 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
979 vkResetDescriptorPool(device(), badPool);
980
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600981 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600982 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Resetting an invalid DescriptorPool Object";
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600983 if (!strstr(msgString.c_str(),"Unable to find pool node for pool 0xbaad6001 specified in vkResetDescriptorPool() call")) {
984 FAIL() << "Error received was note 'Unable to find pool node for pool 0xbaad6001 specified in vkResetDescriptorPool() call'";
985 }*/
986}
987
988TEST_F(VkLayerTest, InvalidDescriptorSet)
989{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600990 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
991 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600992 // Create a valid cmd buffer
993 // call vkCmdBindDescriptorSets w/ false DS
994}
995
996TEST_F(VkLayerTest, InvalidDescriptorSetLayout)
997{
998 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
999 // The DS check for this is after driver has been called to validate DS internal data struct
1000}
1001
1002TEST_F(VkLayerTest, InvalidPipeline)
1003{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001004 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1005 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001006 // Create a valid cmd buffer
1007 // call vkCmdBindPipeline w/ false Pipeline
Tobin Ehlise4076782015-06-24 15:53:07 -06001008// VkFlags msgFlags;
1009// std::string msgString;
1010//
1011// ASSERT_NO_FATAL_FAILURE(InitState());
1012// m_errorMonitor->ClearState();
1013// VkCommandBufferObj cmdBuffer(m_device);
1014// BeginCommandBuffer(cmdBuffer);
1015// VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
1016// vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
1017// msgFlags = m_errorMonitor->GetState(&msgString);
1018// ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding invalid pipeline to CmdBuffer";
1019// if (!strstr(msgString.c_str(),"Attempt to bind Pipeline ")) {
1020// FAIL() << "Error received was not 'Attempt to bind Pipeline 0xbaadb1be that doesn't exist!'";
1021// }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001022}
1023
Tobin Ehlis254eca02015-06-25 15:46:59 -06001024TEST_F(VkLayerTest, DescriptorSetNotUpdated)
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001025{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001026 // Create and update CmdBuffer then call QueueSubmit w/o calling End on CmdBuffer
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001027 VkFlags msgFlags;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001028 std::string msgString;
1029 VkResult err;
1030
1031 ASSERT_NO_FATAL_FAILURE(InitState());
1032 m_errorMonitor->ClearState();
1033 VkCommandBufferObj cmdBuffer(m_device);
1034 const VkDescriptorTypeCount ds_type_count = {
1035 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1036 .count = 1,
1037 };
1038 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1039 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1040 .pNext = NULL,
1041 .count = 1,
1042 .pTypeCount = &ds_type_count,
1043 };
1044 VkDescriptorPool ds_pool;
1045 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1046 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001047
1048 const VkDescriptorSetLayoutBinding dsl_binding = {
1049 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001050 .arraySize = 1,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001051 .stageFlags = VK_SHADER_STAGE_ALL,
1052 .pImmutableSamplers = NULL,
1053 };
1054
1055 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1056 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1057 .pNext = NULL,
1058 .count = 1,
1059 .pBinding = &dsl_binding,
1060 };
1061 VkDescriptorSetLayout ds_layout;
1062 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1063 ASSERT_VK_SUCCESS(err);
1064
1065 VkDescriptorSet descriptorSet;
1066 uint32_t ds_count = 0;
1067 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1068 ASSERT_VK_SUCCESS(err);
1069
1070 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1071 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1072 .pNext = NULL,
1073 .descriptorSetCount = 1,
1074 .pSetLayouts = &ds_layout,
1075 };
1076
1077 VkPipelineLayout pipeline_layout;
1078 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1079 ASSERT_VK_SUCCESS(err);
1080
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001081 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001082
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001083 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1084 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1085 .pNext = NULL,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001086 .stage = VK_SHADER_STAGE_VERTEX,
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001087 .shader = vs.obj(),
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001088 .linkConstBufferCount = 0,
1089 .pLinkConstBufferInfo = NULL,
1090 .pSpecializationInfo = NULL,
1091 };
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001092 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001093 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1094 .pNext = NULL,
1095 .stageCount = 1,
1096 .pStages = &pipe_vs_ci,
1097 .pVertexInputState = NULL,
1098 .pIaState = NULL,
1099 .pTessState = NULL,
1100 .pVpState = NULL,
1101 .pRsState = NULL,
1102 .pMsState = NULL,
1103 .pDsState = NULL,
1104 .pCbState = NULL,
1105 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1106 .layout = pipeline_layout,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001107 };
1108
1109 VkPipeline pipeline;
1110 err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
1111 ASSERT_VK_SUCCESS(err);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001112 ASSERT_NO_FATAL_FAILURE(InitState());
1113 ASSERT_NO_FATAL_FAILURE(InitViewport());
1114 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1115 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1116 BeginCommandBuffer(cmdBuffer);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001117 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinskia65c4632015-06-15 13:21:21 -06001118 vkCmdBindDescriptorSets(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001119
Tobin Ehlis254eca02015-06-25 15:46:59 -06001120 msgFlags = m_errorMonitor->GetState(&msgString);
1121 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT) << "Did not warn after binding a DescriptorSet that was never updated.";
1122 if (!strstr(msgString.c_str()," bound but it was never updated. ")) {
1123 FAIL() << "Error received was not 'DS <blah> bound but it was never updated. You may want to either update it or not bind it.'";
1124 }
1125}
1126
1127TEST_F(VkLayerTest, NoBeginCmdBuffer)
1128{
1129 VkFlags msgFlags;
1130 std::string msgString;
1131
1132 ASSERT_NO_FATAL_FAILURE(InitState());
1133 m_errorMonitor->ClearState();
1134 VkCommandBufferObj cmdBuffer(m_device);
1135 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
1136 vkEndCommandBuffer(cmdBuffer.GetBufferHandle());
1137 msgFlags = m_errorMonitor->GetState(&msgString);
1138 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after ending a CmdBuffer w/o calling BeginCommandBuffer()";
1139 if (!strstr(msgString.c_str(),"You must call vkBeginCommandBuffer() before this call to ")) {
1140 FAIL() << "Error received was not 'You must call vkBeginCommandBuffer() before this call to vkEndCommandBuffer()'";
1141 }
1142}
1143
1144TEST_F(VkLayerTest, InvalidPipelineCreateState)
1145{
1146 // Attempt to Create Gfx Pipeline w/o a VS
1147 VkFlags msgFlags;
1148 std::string msgString;
1149 VkResult err;
1150
1151 ASSERT_NO_FATAL_FAILURE(InitState());
1152 m_errorMonitor->ClearState();
1153 VkCommandBufferObj cmdBuffer(m_device);
1154 const VkDescriptorTypeCount ds_type_count = {
1155 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1156 .count = 1,
1157 };
1158 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1159 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1160 .pNext = NULL,
1161 .count = 1,
1162 .pTypeCount = &ds_type_count,
1163 };
1164 VkDescriptorPool ds_pool;
1165 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1166 ASSERT_VK_SUCCESS(err);
1167
1168 const VkDescriptorSetLayoutBinding dsl_binding = {
1169 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1170 .arraySize = 1,
1171 .stageFlags = VK_SHADER_STAGE_ALL,
1172 .pImmutableSamplers = NULL,
1173 };
1174
1175 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1176 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1177 .pNext = NULL,
1178 .count = 1,
1179 .pBinding = &dsl_binding,
1180 };
1181 VkDescriptorSetLayout ds_layout;
1182 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1183 ASSERT_VK_SUCCESS(err);
1184
1185 VkDescriptorSet descriptorSet;
1186 uint32_t ds_count = 0;
1187 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1188 ASSERT_VK_SUCCESS(err);
1189
1190 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1191 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1192 .pNext = NULL,
1193 .descriptorSetCount = 1,
1194 .pSetLayouts = &ds_layout,
1195 };
1196
1197 VkPipelineLayout pipeline_layout;
1198 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1199 ASSERT_VK_SUCCESS(err);
1200
1201 const VkGraphicsPipelineCreateInfo gp_ci = {
1202 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1203 .pNext = NULL,
1204 .stageCount = 0,
1205 .pStages = NULL, // Creating Gfx Pipeline w/o VS is a violation
1206 .pVertexInputState = NULL,
1207 .pIaState = NULL,
1208 .pTessState = NULL,
1209 .pVpState = NULL,
1210 .pRsState = NULL,
1211 .pMsState = NULL,
1212 .pDsState = NULL,
1213 .pCbState = NULL,
1214 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1215 .layout = pipeline_layout,
1216 };
1217
1218 VkPipeline pipeline;
1219 err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001220
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001221 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001222 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after creating Gfx Pipeline w/o VS.";
1223 if (!strstr(msgString.c_str(),"Invalid Pipeline CreateInfo State: Vtx Shader required")) {
1224 FAIL() << "Error received was not 'Invalid Pipeline CreateInfo State: Vtx Shader required'";
1225 }
1226}
1227
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001228TEST_F(VkLayerTest, NullRenderPass)
1229{
1230 // Bind a NULL RenderPass
1231 VkFlags msgFlags;
1232 std::string msgString;
1233
1234 ASSERT_NO_FATAL_FAILURE(InitState());
1235 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1236 m_errorMonitor->ClearState();
1237 VkCommandBufferObj cmdBuffer(m_device);
1238
1239 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1240 BeginCommandBuffer(cmdBuffer);
1241 // Don't care about RenderPass handle b/c error should be flagged before that
1242 vkCmdBeginRenderPass(cmdBuffer.GetBufferHandle(), NULL);
1243
1244 msgFlags = m_errorMonitor->GetState(&msgString);
1245 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding NULL RenderPass.";
1246 if (!strstr(msgString.c_str(),"You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()")) {
1247 FAIL() << "Error received was not 'You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()'";
1248 }
1249}
1250
Tobin Ehlis254eca02015-06-25 15:46:59 -06001251TEST_F(VkLayerTest, RenderPassWithinRenderPass)
1252{
1253 // Bind a BeginRenderPass within an active RenderPass
1254 VkFlags msgFlags;
1255 std::string msgString;
1256
1257 ASSERT_NO_FATAL_FAILURE(InitState());
1258 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1259 m_errorMonitor->ClearState();
1260 VkCommandBufferObj cmdBuffer(m_device);
1261
1262 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1263 BeginCommandBuffer(cmdBuffer);
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001264 // Just create a dummy Renderpass that's non-NULL so we can get to the proper error
1265 const VkRenderPassBegin rp_begin = {
1266 .renderPass = (VkRenderPass) 0xc001d00d,
1267 .framebuffer = NULL
1268 };
1269 vkCmdBeginRenderPass(cmdBuffer.GetBufferHandle(), &rp_begin);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001270
1271 msgFlags = m_errorMonitor->GetState(&msgString);
1272 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding RenderPass w/i an active RenderPass.";
1273 if (!strstr(msgString.c_str(),"Cannot call vkCmdBeginRenderPass() during an active RenderPass ")) {
1274 FAIL() << "Error received was not 'Cannot call vkCmdBeginRenderPass() during an active RenderPass...'";
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001275 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001276}
1277
1278TEST_F(VkLayerTest, InvalidDynamicStateObject)
1279{
1280 // Create a valid cmd buffer
1281 // call vkCmdBindDynamicStateObject w/ false DS Obj
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001282 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1283 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001284}
Tobin Ehlis201b1ba2015-05-27 14:55:35 -06001285
Tobin Ehlise4076782015-06-24 15:53:07 -06001286TEST_F(VkLayerTest, VtxBufferNoRenderPass)
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001287{
1288 // Bind VBO out-of-bounds for given PSO
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001289 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001290 std::string msgString;
1291 VkResult err;
1292
1293 ASSERT_NO_FATAL_FAILURE(InitState());
1294 m_errorMonitor->ClearState();
1295 VkCommandBufferObj cmdBuffer(m_device);
1296 const VkDescriptorTypeCount ds_type_count = {
1297 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1298 .count = 1,
1299 };
1300 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1301 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1302 .pNext = NULL,
1303 .count = 1,
1304 .pTypeCount = &ds_type_count,
1305 };
1306 VkDescriptorPool ds_pool;
1307 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1308 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001309
1310 const VkDescriptorSetLayoutBinding dsl_binding = {
1311 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001312 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001313 .stageFlags = VK_SHADER_STAGE_ALL,
1314 .pImmutableSamplers = NULL,
1315 };
1316
1317 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1318 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1319 .pNext = NULL,
1320 .count = 1,
1321 .pBinding = &dsl_binding,
1322 };
1323 VkDescriptorSetLayout ds_layout;
1324 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1325 ASSERT_VK_SUCCESS(err);
1326
1327 VkDescriptorSet descriptorSet;
1328 uint32_t ds_count = 0;
1329 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1330 ASSERT_VK_SUCCESS(err);
1331
1332 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1333 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1334 .pNext = NULL,
1335 .descriptorSetCount = 1,
1336 .pSetLayouts = &ds_layout,
1337 };
1338
1339 VkPipelineLayout pipeline_layout;
1340 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1341 ASSERT_VK_SUCCESS(err);
1342
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001343 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001344
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001345 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1346 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1347 .pNext = NULL,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001348 .stage = VK_SHADER_STAGE_VERTEX,
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001349 .shader = vs.obj(),
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001350 .linkConstBufferCount = 0,
1351 .pLinkConstBufferInfo = NULL,
1352 .pSpecializationInfo = NULL,
1353 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001354 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001355 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1356 .pNext = NULL,
1357 .stageCount = 1,
1358 .pStages = &pipe_vs_ci,
1359 .pVertexInputState = NULL,
1360 .pIaState = NULL,
1361 .pTessState = NULL,
1362 .pVpState = NULL,
1363 .pRsState = NULL,
1364 .pMsState = NULL,
1365 .pDsState = NULL,
1366 .pCbState = NULL,
1367 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1368 .layout = pipeline_layout,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001369 };
1370
1371 VkPipeline pipeline;
1372 err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
1373 ASSERT_VK_SUCCESS(err);
1374
1375 err= cmdBuffer.BeginCommandBuffer();
1376 ASSERT_VK_SUCCESS(err);
1377 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1378 // Should error before calling to driver so don't care about actual data
1379 vkCmdBindVertexBuffers(cmdBuffer.GetBufferHandle(), 0, 1, NULL, NULL);
1380
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001381 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlise4076782015-06-24 15:53:07 -06001382 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after vkCmdBindVertexBuffers() w/o active RenderPass.";
1383 if (!strstr(msgString.c_str(),"Incorrect call to vkCmdBindVertexBuffers() without an active RenderPass.")) {
1384 FAIL() << "Error received was not 'Incorrect call to vkCmdBindVertexBuffers() without an active RenderPass.'";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001385 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001386}
1387
1388TEST_F(VkLayerTest, DSTypeMismatch)
1389{
1390 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001391 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001392 std::string msgString;
1393 VkResult err;
1394
1395 ASSERT_NO_FATAL_FAILURE(InitState());
1396 m_errorMonitor->ClearState();
1397 //VkDescriptorSetObj descriptorSet(m_device);
1398 const VkDescriptorTypeCount ds_type_count = {
1399 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1400 .count = 1,
1401 };
1402 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1403 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1404 .pNext = NULL,
1405 .count = 1,
1406 .pTypeCount = &ds_type_count,
1407 };
1408 VkDescriptorPool ds_pool;
1409 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1410 ASSERT_VK_SUCCESS(err);
1411 const VkDescriptorSetLayoutBinding dsl_binding = {
1412 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001413 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001414 .stageFlags = VK_SHADER_STAGE_ALL,
1415 .pImmutableSamplers = NULL,
1416 };
1417
1418 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1419 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1420 .pNext = NULL,
1421 .count = 1,
1422 .pBinding = &dsl_binding,
1423 };
1424 VkDescriptorSetLayout ds_layout;
1425 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1426 ASSERT_VK_SUCCESS(err);
1427
1428 VkDescriptorSet descriptorSet;
1429 uint32_t ds_count = 0;
1430 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1431 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001432
1433 const VkSamplerCreateInfo sampler_ci = {
1434 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1435 .pNext = NULL,
1436 .magFilter = VK_TEX_FILTER_NEAREST,
1437 .minFilter = VK_TEX_FILTER_NEAREST,
1438 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1439 .addressU = VK_TEX_ADDRESS_CLAMP,
1440 .addressV = VK_TEX_ADDRESS_CLAMP,
1441 .addressW = VK_TEX_ADDRESS_CLAMP,
1442 .mipLodBias = 1.0,
1443 .maxAnisotropy = 1,
1444 .compareOp = VK_COMPARE_OP_NEVER,
1445 .minLod = 1.0,
1446 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001447 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001448 };
1449 VkSampler sampler;
1450 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1451 ASSERT_VK_SUCCESS(err);
1452
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001453 VkDescriptorInfo descriptor_info;
1454 memset(&descriptor_info, 0, sizeof(descriptor_info));
1455 descriptor_info.sampler = sampler;
1456
1457 VkWriteDescriptorSet descriptor_write;
1458 memset(&descriptor_write, 0, sizeof(descriptor_write));
1459 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1460 descriptor_write.destSet = descriptorSet;
1461 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001462 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001463 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1464 descriptor_write.pDescriptors = &descriptor_info;
1465
1466 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1467
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001468 msgFlags = m_errorMonitor->GetState(&msgString);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001469 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after updating BUFFER Descriptor w/ incorrect type of SAMPLER.";
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001470 if (!strstr(msgString.c_str(),"Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET does not match ")) {
1471 FAIL() << "Error received was not 'Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET does not match overlapping binding type!'";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001472 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001473}
1474
1475TEST_F(VkLayerTest, DSUpdateOutOfBounds)
1476{
1477 // For overlapping Update, have arrayIndex exceed that of layout
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001478 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001479 std::string msgString;
1480 VkResult err;
1481
1482 ASSERT_NO_FATAL_FAILURE(InitState());
1483 m_errorMonitor->ClearState();
1484 //VkDescriptorSetObj descriptorSet(m_device);
1485 const VkDescriptorTypeCount ds_type_count = {
1486 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1487 .count = 1,
1488 };
1489 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1490 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1491 .pNext = NULL,
1492 .count = 1,
1493 .pTypeCount = &ds_type_count,
1494 };
1495 VkDescriptorPool ds_pool;
1496 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1497 ASSERT_VK_SUCCESS(err);
1498 const VkDescriptorSetLayoutBinding dsl_binding = {
1499 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001500 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001501 .stageFlags = VK_SHADER_STAGE_ALL,
1502 .pImmutableSamplers = NULL,
1503 };
1504
1505 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1506 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1507 .pNext = NULL,
1508 .count = 1,
1509 .pBinding = &dsl_binding,
1510 };
1511 VkDescriptorSetLayout ds_layout;
1512 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1513 ASSERT_VK_SUCCESS(err);
1514
1515 VkDescriptorSet descriptorSet;
1516 uint32_t ds_count = 0;
1517 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1518 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001519
1520 const VkSamplerCreateInfo sampler_ci = {
1521 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1522 .pNext = NULL,
1523 .magFilter = VK_TEX_FILTER_NEAREST,
1524 .minFilter = VK_TEX_FILTER_NEAREST,
1525 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1526 .addressU = VK_TEX_ADDRESS_CLAMP,
1527 .addressV = VK_TEX_ADDRESS_CLAMP,
1528 .addressW = VK_TEX_ADDRESS_CLAMP,
1529 .mipLodBias = 1.0,
1530 .maxAnisotropy = 1,
1531 .compareOp = VK_COMPARE_OP_NEVER,
1532 .minLod = 1.0,
1533 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001534 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001535 };
1536 VkSampler sampler;
1537 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1538 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001539
1540 VkDescriptorInfo descriptor_info;
1541 memset(&descriptor_info, 0, sizeof(descriptor_info));
1542 descriptor_info.sampler = sampler;
1543
1544 VkWriteDescriptorSet descriptor_write;
1545 memset(&descriptor_write, 0, sizeof(descriptor_write));
1546 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1547 descriptor_write.destSet = descriptorSet;
1548 descriptor_write.destArrayElement = 1; /* This index out of bounds for the update */
1549 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001550 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001551 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1552 descriptor_write.pDescriptors = &descriptor_info;
1553
1554 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1555
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001556 msgFlags = m_errorMonitor->GetState(&msgString);
1557 ASSERT_TRUE(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 +08001558 if (!strstr(msgString.c_str(),"Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET is out of bounds for matching binding")) {
1559 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 -06001560 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001561}
1562
1563TEST_F(VkLayerTest, InvalidDSUpdateIndex)
1564{
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001565 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001566 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001567 std::string msgString;
1568 VkResult err;
1569
1570 ASSERT_NO_FATAL_FAILURE(InitState());
1571 m_errorMonitor->ClearState();
1572 //VkDescriptorSetObj descriptorSet(m_device);
1573 const VkDescriptorTypeCount ds_type_count = {
1574 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1575 .count = 1,
1576 };
1577 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1578 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1579 .pNext = NULL,
1580 .count = 1,
1581 .pTypeCount = &ds_type_count,
1582 };
1583 VkDescriptorPool ds_pool;
1584 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1585 ASSERT_VK_SUCCESS(err);
1586 const VkDescriptorSetLayoutBinding dsl_binding = {
1587 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001588 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001589 .stageFlags = VK_SHADER_STAGE_ALL,
1590 .pImmutableSamplers = NULL,
1591 };
1592
1593 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1594 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1595 .pNext = NULL,
1596 .count = 1,
1597 .pBinding = &dsl_binding,
1598 };
1599 VkDescriptorSetLayout ds_layout;
1600 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1601 ASSERT_VK_SUCCESS(err);
1602
1603 VkDescriptorSet descriptorSet;
1604 uint32_t ds_count = 0;
1605 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1606 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001607
1608 const VkSamplerCreateInfo sampler_ci = {
1609 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1610 .pNext = NULL,
1611 .magFilter = VK_TEX_FILTER_NEAREST,
1612 .minFilter = VK_TEX_FILTER_NEAREST,
1613 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1614 .addressU = VK_TEX_ADDRESS_CLAMP,
1615 .addressV = VK_TEX_ADDRESS_CLAMP,
1616 .addressW = VK_TEX_ADDRESS_CLAMP,
1617 .mipLodBias = 1.0,
1618 .maxAnisotropy = 1,
1619 .compareOp = VK_COMPARE_OP_NEVER,
1620 .minLod = 1.0,
1621 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001622 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001623 };
1624 VkSampler sampler;
1625 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1626 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001627
1628 VkDescriptorInfo descriptor_info;
1629 memset(&descriptor_info, 0, sizeof(descriptor_info));
1630 descriptor_info.sampler = sampler;
1631
1632 VkWriteDescriptorSet descriptor_write;
1633 memset(&descriptor_write, 0, sizeof(descriptor_write));
1634 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1635 descriptor_write.destSet = descriptorSet;
1636 descriptor_write.destBinding = 2;
1637 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001638 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001639 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1640 descriptor_write.pDescriptors = &descriptor_info;
1641
1642 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1643
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001644 msgFlags = m_errorMonitor->GetState(&msgString);
1645 ASSERT_TRUE(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 -06001646 if (!strstr(msgString.c_str()," does not have binding to match update binding ")) {
1647 FAIL() << "Error received was not 'Descriptor Set <blah> does not have binding to match update binding '";
1648 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001649}
1650
1651TEST_F(VkLayerTest, InvalidDSUpdateStruct)
1652{
1653 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_* types
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001654 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001655 std::string msgString;
1656 VkResult err;
1657
1658 ASSERT_NO_FATAL_FAILURE(InitState());
1659 m_errorMonitor->ClearState();
1660 //VkDescriptorSetObj descriptorSet(m_device);
1661 const VkDescriptorTypeCount ds_type_count = {
1662 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1663 .count = 1,
1664 };
1665 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1666 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1667 .pNext = NULL,
1668 .count = 1,
1669 .pTypeCount = &ds_type_count,
1670 };
1671 VkDescriptorPool ds_pool;
1672 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1673 ASSERT_VK_SUCCESS(err);
1674 const VkDescriptorSetLayoutBinding dsl_binding = {
1675 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001676 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001677 .stageFlags = VK_SHADER_STAGE_ALL,
1678 .pImmutableSamplers = NULL,
1679 };
1680
1681 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1682 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1683 .pNext = NULL,
1684 .count = 1,
1685 .pBinding = &dsl_binding,
1686 };
1687 VkDescriptorSetLayout ds_layout;
1688 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1689 ASSERT_VK_SUCCESS(err);
1690
1691 VkDescriptorSet descriptorSet;
1692 uint32_t ds_count = 0;
1693 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1694 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001695
1696 const VkSamplerCreateInfo sampler_ci = {
1697 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1698 .pNext = NULL,
1699 .magFilter = VK_TEX_FILTER_NEAREST,
1700 .minFilter = VK_TEX_FILTER_NEAREST,
1701 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1702 .addressU = VK_TEX_ADDRESS_CLAMP,
1703 .addressV = VK_TEX_ADDRESS_CLAMP,
1704 .addressW = VK_TEX_ADDRESS_CLAMP,
1705 .mipLodBias = 1.0,
1706 .maxAnisotropy = 1,
1707 .compareOp = VK_COMPARE_OP_NEVER,
1708 .minLod = 1.0,
1709 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001710 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001711 };
1712 VkSampler sampler;
1713 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1714 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001715
1716
1717 VkDescriptorInfo descriptor_info;
1718 memset(&descriptor_info, 0, sizeof(descriptor_info));
1719 descriptor_info.sampler = sampler;
1720
1721 VkWriteDescriptorSet descriptor_write;
1722 memset(&descriptor_write, 0, sizeof(descriptor_write));
1723 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
1724 descriptor_write.destSet = descriptorSet;
1725 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001726 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001727 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1728 descriptor_write.pDescriptors = &descriptor_info;
1729
1730 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1731
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001732 msgFlags = m_errorMonitor->GetState(&msgString);
1733 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after updating Descriptor w/ invalid struct type.";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001734 if (!strstr(msgString.c_str(),"Unexpected UPDATE struct of type ")) {
1735 FAIL() << "Error received was not 'Unexpected UPDATE struct of type '";
1736 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001737}
1738
1739TEST_F(VkLayerTest, NumSamplesMismatch)
1740{
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001741 // Create CmdBuffer where MSAA samples doesn't match RenderPass sampleCount
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001742 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001743 std::string msgString;
1744 VkResult err;
1745
1746 ASSERT_NO_FATAL_FAILURE(InitState());
1747 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1748 m_errorMonitor->ClearState();
1749 VkCommandBufferObj cmdBuffer(m_device);
1750 const VkDescriptorTypeCount ds_type_count = {
1751 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1752 .count = 1,
1753 };
1754 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1755 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1756 .pNext = NULL,
1757 .count = 1,
1758 .pTypeCount = &ds_type_count,
1759 };
1760 VkDescriptorPool ds_pool;
1761 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1762 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001763
1764 const VkDescriptorSetLayoutBinding dsl_binding = {
1765 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001766 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001767 .stageFlags = VK_SHADER_STAGE_ALL,
1768 .pImmutableSamplers = NULL,
1769 };
1770
1771 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1772 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1773 .pNext = NULL,
1774 .count = 1,
1775 .pBinding = &dsl_binding,
1776 };
1777 VkDescriptorSetLayout ds_layout;
1778 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1779 ASSERT_VK_SUCCESS(err);
1780
1781 VkDescriptorSet descriptorSet;
1782 uint32_t ds_count = 0;
1783 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1784 ASSERT_VK_SUCCESS(err);
1785
1786 const VkPipelineMsStateCreateInfo pipe_ms_state_ci = {
1787 .sType = VK_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO,
1788 .pNext = NULL,
Tony Barboure094edf2015-06-26 10:18:34 -06001789 .rasterSamples = 4,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001790 .multisampleEnable = 1,
1791 .sampleShadingEnable = 0,
1792 .minSampleShading = 1.0,
1793 .sampleMask = 15,
1794 };
1795
1796 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1797 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1798 .pNext = NULL,
1799 .descriptorSetCount = 1,
1800 .pSetLayouts = &ds_layout,
1801 };
1802
1803 VkPipelineLayout pipeline_layout;
1804 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1805 ASSERT_VK_SUCCESS(err);
1806
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001807 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001808
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001809 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1810 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1811 .pNext = NULL,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001812 .stage = VK_SHADER_STAGE_VERTEX,
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001813 .shader = vs.obj(),
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001814 .linkConstBufferCount = 0,
1815 .pLinkConstBufferInfo = NULL,
1816 .pSpecializationInfo = NULL,
1817 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001818 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001819 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1820 .pNext = NULL,
1821 .stageCount = 1,
1822 .pStages = &pipe_vs_ci,
1823 .pVertexInputState = NULL,
1824 .pIaState = NULL,
1825 .pTessState = NULL,
1826 .pVpState = NULL,
1827 .pRsState = NULL,
1828 .pMsState = &pipe_ms_state_ci,
1829 .pDsState = NULL,
1830 .pCbState = NULL,
1831 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1832 .layout = pipeline_layout,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001833 };
1834
1835 VkPipeline pipeline;
1836 err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
1837 ASSERT_VK_SUCCESS(err);
1838
1839 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1840 BeginCommandBuffer(cmdBuffer);
1841 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1842
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001843 msgFlags = m_errorMonitor->GetState(&msgString);
1844 ASSERT_TRUE(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 -06001845 if (!strstr(msgString.c_str(),"Num samples mismatch! ")) {
1846 FAIL() << "Error received was not 'Num samples mismatch!...'";
1847 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001848}
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06001849
Tobin Ehlise4076782015-06-24 15:53:07 -06001850TEST_F(VkLayerTest, PipelineNotBound)
1851{
1852 VkFlags msgFlags;
1853 std::string msgString;
1854 VkResult err;
1855
1856 ASSERT_NO_FATAL_FAILURE(InitState());
1857 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1858 m_errorMonitor->ClearState();
1859 VkCommandBufferObj cmdBuffer(m_device);
1860 const VkDescriptorTypeCount ds_type_count = {
1861 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1862 .count = 1,
1863 };
1864 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1865 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1866 .pNext = NULL,
1867 .count = 1,
1868 .pTypeCount = &ds_type_count,
1869 };
1870 VkDescriptorPool ds_pool;
1871 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1872 ASSERT_VK_SUCCESS(err);
1873
1874 const VkDescriptorSetLayoutBinding dsl_binding = {
1875 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1876 .arraySize = 1,
1877 .stageFlags = VK_SHADER_STAGE_ALL,
1878 .pImmutableSamplers = NULL,
1879 };
1880
1881 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1882 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1883 .pNext = NULL,
1884 .count = 1,
1885 .pBinding = &dsl_binding,
1886 };
1887 VkDescriptorSetLayout ds_layout;
1888 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1889 ASSERT_VK_SUCCESS(err);
1890
1891 VkDescriptorSet descriptorSet;
1892 uint32_t ds_count = 0;
1893 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1894 ASSERT_VK_SUCCESS(err);
1895
1896 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1897 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1898 .pNext = NULL,
1899 .descriptorSetCount = 1,
1900 .pSetLayouts = &ds_layout,
1901 };
1902
1903 VkPipelineLayout pipeline_layout;
1904 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1905 ASSERT_VK_SUCCESS(err);
1906
Tobin Ehlise4076782015-06-24 15:53:07 -06001907 VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
1908 //err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
1909 ASSERT_VK_SUCCESS(err);
1910
1911 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1912 BeginCommandBuffer(cmdBuffer);
1913 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
1914
1915 msgFlags = m_errorMonitor->GetState(&msgString);
1916 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding invalid pipeline to CmdBuffer";
1917 if (!strstr(msgString.c_str(),"Attempt to bind Pipeline ")) {
1918 FAIL() << "Error received was not 'Attempt to bind Pipeline 0xbaadb1be that doesn't exist!'";
1919 }
1920}
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06001921
1922TEST_F(VkLayerTest, ClearCmdNoDraw)
1923{
1924 // Create CmdBuffer where we add ClearCmd for FB Color attachment prior to issuing a Draw
1925 VkFlags msgFlags;
1926 std::string msgString;
1927 VkResult err;
1928
1929 ASSERT_NO_FATAL_FAILURE(InitState());
1930 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1931 m_errorMonitor->ClearState();
1932 VkCommandBufferObj cmdBuffer(m_device);
1933 const VkDescriptorTypeCount ds_type_count = {
1934 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1935 .count = 1,
1936 };
1937 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1938 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1939 .pNext = NULL,
1940 .count = 1,
1941 .pTypeCount = &ds_type_count,
1942 };
1943 VkDescriptorPool ds_pool;
1944 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1945 ASSERT_VK_SUCCESS(err);
1946
1947 const VkDescriptorSetLayoutBinding dsl_binding = {
1948 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1949 .arraySize = 1,
1950 .stageFlags = VK_SHADER_STAGE_ALL,
1951 .pImmutableSamplers = NULL,
1952 };
1953
1954 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1955 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1956 .pNext = NULL,
1957 .count = 1,
1958 .pBinding = &dsl_binding,
1959 };
1960 VkDescriptorSetLayout ds_layout;
1961 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1962 ASSERT_VK_SUCCESS(err);
1963
1964 VkDescriptorSet descriptorSet;
1965 uint32_t ds_count = 0;
1966 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1967 ASSERT_VK_SUCCESS(err);
1968
1969 const VkPipelineMsStateCreateInfo pipe_ms_state_ci = {
1970 .sType = VK_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO,
1971 .pNext = NULL,
1972 .rasterSamples = 4,
1973 .multisampleEnable = 1,
1974 .sampleShadingEnable = 0,
1975 .minSampleShading = 1.0,
1976 .sampleMask = 15,
1977 };
1978
1979 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1980 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1981 .pNext = NULL,
1982 .descriptorSetCount = 1,
1983 .pSetLayouts = &ds_layout,
1984 };
1985
1986 VkPipelineLayout pipeline_layout;
1987 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1988 ASSERT_VK_SUCCESS(err);
1989
1990 size_t shader_len = strlen(bindStateVertShaderText);
1991 size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
1992 void* pCode = malloc(codeSize);
1993
1994 /* try version 0 first: VkShaderStage followed by GLSL */
1995 ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
1996 ((uint32_t *) pCode)[1] = 0;
1997 ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
1998 memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
1999
2000 const VkShaderModuleCreateInfo smci = {
2001 .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
2002 .pNext = NULL,
2003 .codeSize = codeSize,
2004 .pCode = pCode,
2005 .flags = 0,
2006 };
2007 VkShaderModule vksm;
2008 err = vkCreateShaderModule(m_device->device(), &smci, &vksm);
2009 ASSERT_VK_SUCCESS(err);
2010 const VkShaderCreateInfo vs_ci = {
2011 .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
2012 .pNext = NULL,
2013 .module = vksm,
2014 .pName = "main",
2015 .flags = 0,
2016 };
2017 VkShader vs;
2018 err = vkCreateShader(m_device->device(), &vs_ci, &vs);
2019 ASSERT_VK_SUCCESS(err);
2020
2021 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
2022 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2023 .pNext = NULL,
2024 .stage = VK_SHADER_STAGE_VERTEX,
2025 .shader = vs,
2026 .linkConstBufferCount = 0,
2027 .pLinkConstBufferInfo = NULL,
2028 .pSpecializationInfo = NULL,
2029 };
2030 const VkGraphicsPipelineCreateInfo gp_ci = {
2031 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
2032 .pNext = NULL,
2033 .stageCount = 1,
2034 .pStages = &pipe_vs_ci,
2035 .pVertexInputState = NULL,
2036 .pIaState = NULL,
2037 .pTessState = NULL,
2038 .pVpState = NULL,
2039 .pRsState = NULL,
2040 .pMsState = &pipe_ms_state_ci,
2041 .pDsState = NULL,
2042 .pCbState = NULL,
2043 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
2044 .layout = pipeline_layout,
2045 };
2046
2047 VkPipeline pipeline;
2048 err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
2049 ASSERT_VK_SUCCESS(err);
2050
2051 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
2052 BeginCommandBuffer(cmdBuffer);
2053
2054 m_errorMonitor->ClearState();
2055 // Main thing we care about for this test is that the VkImage obj we're clearing matches Color Attachment of FB
2056 // Also pass down other dummy params to keep driver and paramchecker happy
2057 VkClearColorValue cCV;
2058 cCV.f32[0] = 1.0;
2059 cCV.f32[1] = 1.0;
2060 cCV.f32[2] = 1.0;
2061 cCV.f32[3] = 1.0;
2062
2063 vkCmdClearColorAttachment(cmdBuffer.GetBufferHandle(), 0, (VkImageLayout)NULL, &cCV, 0, NULL);
2064 msgFlags = m_errorMonitor->GetState(&msgString);
2065 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT) << "Did not receive error after issuing Clear Cmd on FB color attachment prior to Draw Cmd.";
2066 if (!strstr(msgString.c_str(),"vkCmdClearColorAttachment() issued on CB object ")) {
2067 FAIL() << "Error received was not 'vkCmdClearColorAttachment() issued on CB object...'";
2068 }
2069}
2070
Tobin Ehlise4076782015-06-24 15:53:07 -06002071TEST_F(VkLayerTest, VtxBufferBadIndex)
2072{
2073 // Create CmdBuffer where MSAA samples doesn't match RenderPass sampleCount
2074 VkFlags msgFlags;
2075 std::string msgString;
2076 VkResult err;
2077
2078 ASSERT_NO_FATAL_FAILURE(InitState());
2079 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2080 m_errorMonitor->ClearState();
2081 VkCommandBufferObj cmdBuffer(m_device);
2082 const VkDescriptorTypeCount ds_type_count = {
2083 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
2084 .count = 1,
2085 };
2086 const VkDescriptorPoolCreateInfo ds_pool_ci = {
2087 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
2088 .pNext = NULL,
2089 .count = 1,
2090 .pTypeCount = &ds_type_count,
2091 };
2092 VkDescriptorPool ds_pool;
2093 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
2094 ASSERT_VK_SUCCESS(err);
2095
2096 const VkDescriptorSetLayoutBinding dsl_binding = {
2097 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
2098 .arraySize = 1,
2099 .stageFlags = VK_SHADER_STAGE_ALL,
2100 .pImmutableSamplers = NULL,
2101 };
2102
2103 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
2104 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
2105 .pNext = NULL,
2106 .count = 1,
2107 .pBinding = &dsl_binding,
2108 };
2109 VkDescriptorSetLayout ds_layout;
2110 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
2111 ASSERT_VK_SUCCESS(err);
2112
2113 VkDescriptorSet descriptorSet;
2114 uint32_t ds_count = 0;
2115 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
2116 ASSERT_VK_SUCCESS(err);
2117
2118 const VkPipelineMsStateCreateInfo pipe_ms_state_ci = {
2119 .sType = VK_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO,
2120 .pNext = NULL,
Tony Barboure094edf2015-06-26 10:18:34 -06002121 .rasterSamples = 1,
Tobin Ehlise4076782015-06-24 15:53:07 -06002122 .multisampleEnable = 1,
2123 .sampleShadingEnable = 0,
2124 .minSampleShading = 1.0,
2125 .sampleMask = 15,
2126 };
2127
2128 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
2129 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
2130 .pNext = NULL,
2131 .descriptorSetCount = 1,
2132 .pSetLayouts = &ds_layout,
2133 };
2134
2135 VkPipelineLayout pipeline_layout;
2136 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
2137 ASSERT_VK_SUCCESS(err);
2138
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06002139 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlise4076782015-06-24 15:53:07 -06002140
2141 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
2142 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2143 .pNext = NULL,
2144 .stage = VK_SHADER_STAGE_VERTEX,
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06002145 .shader = vs.obj(),
Tobin Ehlise4076782015-06-24 15:53:07 -06002146 .linkConstBufferCount = 0,
2147 .pLinkConstBufferInfo = NULL,
2148 .pSpecializationInfo = NULL,
2149 };
2150 const VkGraphicsPipelineCreateInfo gp_ci = {
2151 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
2152 .pNext = NULL,
2153 .stageCount = 1,
2154 .pStages = &pipe_vs_ci,
2155 .pVertexInputState = NULL,
2156 .pIaState = NULL,
2157 .pTessState = NULL,
2158 .pVpState = NULL,
2159 .pRsState = NULL,
2160 .pMsState = &pipe_ms_state_ci,
2161 .pDsState = NULL,
2162 .pCbState = NULL,
2163 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
2164 .layout = pipeline_layout,
2165 };
2166
2167 VkPipeline pipeline;
2168 err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
2169 ASSERT_VK_SUCCESS(err);
2170
2171 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
2172 BeginCommandBuffer(cmdBuffer);
2173 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2174 // Should error before calling to driver so don't care about actual data
2175 vkCmdBindVertexBuffers(cmdBuffer.GetBufferHandle(), 0, 1, NULL, NULL);
2176
2177 msgFlags = m_errorMonitor->GetState(&msgString);
2178 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding Vtx Buffer w/o VBO attached to PSO.";
2179 if (!strstr(msgString.c_str(),"Vtx Buffer Index 0 was bound, but no vtx buffers are attached to PSO.")) {
2180 FAIL() << "Error received was not 'Vtx Buffer Index 0 was bound, but no vtx buffers are attached to PSO.'";
2181 }
2182}
Tobin Ehlis57e6a612015-05-26 16:11:58 -06002183#endif
2184#if THREADING_TESTS
Mike Stroyan09aae812015-05-12 16:00:45 -06002185#if GTEST_IS_THREADSAFE
2186struct thread_data_struct {
2187 VkCmdBuffer cmdBuffer;
2188 VkEvent event;
2189 bool bailout;
2190};
2191
2192extern "C" void *AddToCommandBuffer(void *arg)
2193{
2194 struct thread_data_struct *data = (struct thread_data_struct *) arg;
2195 std::string msgString;
2196
2197 for (int i = 0; i<10000; i++) {
Tony Barbourc2e987e2015-06-29 16:20:35 -06002198 vkCmdSetEvent(data->cmdBuffer, data->event, VK_PIPELINE_STAGE_ALL_GPU_COMMANDS);
Mike Stroyan09aae812015-05-12 16:00:45 -06002199 if (data->bailout) {
2200 break;
2201 }
2202 }
2203 return NULL;
2204}
2205
2206TEST_F(VkLayerTest, ThreadCmdBufferCollision)
2207{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002208 VkFlags msgFlags;
Mike Stroyan09aae812015-05-12 16:00:45 -06002209 std::string msgString;
2210 pthread_t thread;
2211 pthread_attr_t thread_attr;
2212
2213 ASSERT_NO_FATAL_FAILURE(InitState());
2214 ASSERT_NO_FATAL_FAILURE(InitViewport());
2215 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2216
2217 VkCommandBufferObj cmdBuffer(m_device);
2218
2219 m_errorMonitor->ClearState();
2220 pthread_attr_init(&thread_attr);
2221 BeginCommandBuffer(cmdBuffer);
2222
2223 VkEventCreateInfo event_info;
2224 VkEvent event;
2225 VkMemoryRequirements mem_req;
Mike Stroyan09aae812015-05-12 16:00:45 -06002226 VkResult err;
2227
2228 memset(&event_info, 0, sizeof(event_info));
2229 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
2230
2231 err = vkCreateEvent(device(), &event_info, &event);
2232 ASSERT_VK_SUCCESS(err);
2233
Tony Barbour426b9052015-06-24 16:06:58 -06002234 err = vkGetObjectMemoryRequirements(device(), VK_OBJECT_TYPE_EVENT, event, &mem_req);
Mike Stroyan09aae812015-05-12 16:00:45 -06002235 ASSERT_VK_SUCCESS(err);
2236
2237 VkMemoryAllocInfo mem_info;
2238 VkDeviceMemory event_mem;
2239
Mike Stroyan09aae812015-05-12 16:00:45 -06002240 memset(&mem_info, 0, sizeof(mem_info));
2241 mem_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
2242 mem_info.allocationSize = mem_req.size;
Mark Lobodzinski72346292015-07-02 16:49:40 -06002243 mem_info.memoryTypeIndex = 0;
2244
2245 err = m_device->gpu().set_memory_type(mem_req.memoryTypeBits, &mem_info, 0);
2246 ASSERT_VK_SUCCESS(err);
2247
Mike Stroyan09aae812015-05-12 16:00:45 -06002248 err = vkAllocMemory(device(), &mem_info, &event_mem);
2249 ASSERT_VK_SUCCESS(err);
2250
Mark Lobodzinski23182612015-05-29 09:32:35 -05002251 err = vkBindObjectMemory(device(), VK_OBJECT_TYPE_EVENT, event, event_mem, 0);
Mike Stroyan09aae812015-05-12 16:00:45 -06002252 ASSERT_VK_SUCCESS(err);
2253
2254 err = vkResetEvent(device(), event);
2255 ASSERT_VK_SUCCESS(err);
2256
2257 struct thread_data_struct data;
2258 data.cmdBuffer = cmdBuffer.obj();
2259 data.event = event;
2260 data.bailout = false;
2261 m_errorMonitor->SetBailout(&data.bailout);
2262 // Add many entries to command buffer from another thread.
2263 pthread_create(&thread, &thread_attr, AddToCommandBuffer, (void *)&data);
2264 // Add many entries to command buffer from this thread at the same time.
2265 AddToCommandBuffer(&data);
2266 pthread_join(thread, NULL);
2267 EndCommandBuffer(cmdBuffer);
2268
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002269 msgFlags = m_errorMonitor->GetState(&msgString);
Mike Stroyaned254572015-06-17 16:32:06 -06002270 ASSERT_TRUE(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 -06002271 if (!strstr(msgString.c_str(),"THREADING ERROR")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -05002272 FAIL() << "Error received was not 'THREADING ERROR'";
Mike Stroyan09aae812015-05-12 16:00:45 -06002273 }
2274
2275}
2276#endif
Tobin Ehlis57e6a612015-05-26 16:11:58 -06002277#endif
Chris Forbes5af3bf22015-05-25 11:13:08 +12002278#if SHADER_CHECKER_TESTS
2279TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed)
2280{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002281 VkFlags msgFlags;
Chris Forbes5af3bf22015-05-25 11:13:08 +12002282 std::string msgString;
2283 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002284 ScopedUseGlsl useGlsl(false);
Chris Forbes5af3bf22015-05-25 11:13:08 +12002285
2286 char const *vsSource =
2287 "#version 140\n"
2288 "#extension GL_ARB_separate_shader_objects: require\n"
2289 "#extension GL_ARB_shading_language_420pack: require\n"
2290 "\n"
2291 "layout(location=0) out float x;\n"
2292 "void main(){\n"
2293 " gl_Position = vec4(1);\n"
2294 " x = 0;\n"
2295 "}\n";
2296 char const *fsSource =
2297 "#version 140\n"
2298 "#extension GL_ARB_separate_shader_objects: require\n"
2299 "#extension GL_ARB_shading_language_420pack: require\n"
2300 "\n"
2301 "layout(location=0) out vec4 color;\n"
2302 "void main(){\n"
2303 " color = vec4(1);\n"
2304 "}\n";
2305
2306 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2307 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2308
2309 VkPipelineObj pipe(m_device);
2310 pipe.AddShader(&vs);
2311 pipe.AddShader(&fs);
2312
2313 VkCommandBufferObj dummyCmd(m_device);
2314 VkDescriptorSetObj descriptorSet(m_device);
2315 descriptorSet.AppendDummy();
2316 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2317
2318 m_errorMonitor->ClearState();
2319 pipe.CreateVKPipeline(descriptorSet);
2320
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002321 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes5af3bf22015-05-25 11:13:08 +12002322
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002323 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes5af3bf22015-05-25 11:13:08 +12002324 if (!strstr(msgString.c_str(),"not consumed by fragment shader")) {
2325 FAIL() << "Incorrect warning: " << msgString;
2326 }
2327}
Chris Forbes5af3bf22015-05-25 11:13:08 +12002328
Chris Forbes3c10b852015-05-25 11:13:13 +12002329TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided)
2330{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002331 VkFlags msgFlags;
Chris Forbes3c10b852015-05-25 11:13:13 +12002332 std::string msgString;
2333 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002334 ScopedUseGlsl useGlsl(false);
Chris Forbes3c10b852015-05-25 11:13:13 +12002335
2336 char const *vsSource =
2337 "#version 140\n"
2338 "#extension GL_ARB_separate_shader_objects: require\n"
2339 "#extension GL_ARB_shading_language_420pack: require\n"
2340 "\n"
2341 "void main(){\n"
2342 " gl_Position = vec4(1);\n"
2343 "}\n";
2344 char const *fsSource =
2345 "#version 140\n"
2346 "#extension GL_ARB_separate_shader_objects: require\n"
2347 "#extension GL_ARB_shading_language_420pack: require\n"
2348 "\n"
2349 "layout(location=0) in float x;\n"
2350 "layout(location=0) out vec4 color;\n"
2351 "void main(){\n"
2352 " color = vec4(x);\n"
2353 "}\n";
2354
2355 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2356 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2357
2358 VkPipelineObj pipe(m_device);
2359 pipe.AddShader(&vs);
2360 pipe.AddShader(&fs);
2361
2362 VkCommandBufferObj dummyCmd(m_device);
2363 VkDescriptorSetObj descriptorSet(m_device);
2364 descriptorSet.AppendDummy();
2365 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2366
2367 m_errorMonitor->ClearState();
2368 pipe.CreateVKPipeline(descriptorSet);
2369
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002370 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes3c10b852015-05-25 11:13:13 +12002371
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002372 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes3c10b852015-05-25 11:13:13 +12002373 if (!strstr(msgString.c_str(),"not written by vertex shader")) {
2374 FAIL() << "Incorrect error: " << msgString;
2375 }
2376}
2377
Chris Forbescc281692015-05-25 11:13:17 +12002378TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch)
2379{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002380 VkFlags msgFlags;
Chris Forbescc281692015-05-25 11:13:17 +12002381 std::string msgString;
2382 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002383 ScopedUseGlsl useGlsl(false);
Chris Forbescc281692015-05-25 11:13:17 +12002384
2385 char const *vsSource =
2386 "#version 140\n"
2387 "#extension GL_ARB_separate_shader_objects: require\n"
2388 "#extension GL_ARB_shading_language_420pack: require\n"
2389 "\n"
2390 "layout(location=0) out int x;\n"
2391 "void main(){\n"
2392 " x = 0;\n"
2393 " gl_Position = vec4(1);\n"
2394 "}\n";
2395 char const *fsSource =
2396 "#version 140\n"
2397 "#extension GL_ARB_separate_shader_objects: require\n"
2398 "#extension GL_ARB_shading_language_420pack: require\n"
2399 "\n"
2400 "layout(location=0) in float x;\n" /* VS writes int */
2401 "layout(location=0) out vec4 color;\n"
2402 "void main(){\n"
2403 " color = vec4(x);\n"
2404 "}\n";
2405
2406 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2407 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2408
2409 VkPipelineObj pipe(m_device);
2410 pipe.AddShader(&vs);
2411 pipe.AddShader(&fs);
2412
2413 VkCommandBufferObj dummyCmd(m_device);
2414 VkDescriptorSetObj descriptorSet(m_device);
2415 descriptorSet.AppendDummy();
2416 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2417
2418 m_errorMonitor->ClearState();
2419 pipe.CreateVKPipeline(descriptorSet);
2420
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002421 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbescc281692015-05-25 11:13:17 +12002422
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002423 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbescc281692015-05-25 11:13:17 +12002424 if (!strstr(msgString.c_str(),"Type mismatch on location 0")) {
2425 FAIL() << "Incorrect error: " << msgString;
2426 }
2427}
2428
Chris Forbes8291c052015-05-25 11:13:28 +12002429TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed)
2430{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002431 VkFlags msgFlags;
Chris Forbes8291c052015-05-25 11:13:28 +12002432 std::string msgString;
2433 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002434 ScopedUseGlsl useGlsl(false);
Chris Forbes8291c052015-05-25 11:13:28 +12002435
2436 VkVertexInputBindingDescription input_binding;
2437 memset(&input_binding, 0, sizeof(input_binding));
2438
2439 VkVertexInputAttributeDescription input_attrib;
2440 memset(&input_attrib, 0, sizeof(input_attrib));
2441 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2442
2443 char const *vsSource =
2444 "#version 140\n"
2445 "#extension GL_ARB_separate_shader_objects: require\n"
2446 "#extension GL_ARB_shading_language_420pack: require\n"
2447 "\n"
2448 "void main(){\n"
2449 " gl_Position = vec4(1);\n"
2450 "}\n";
2451 char const *fsSource =
2452 "#version 140\n"
2453 "#extension GL_ARB_separate_shader_objects: require\n"
2454 "#extension GL_ARB_shading_language_420pack: require\n"
2455 "\n"
2456 "layout(location=0) out vec4 color;\n"
2457 "void main(){\n"
2458 " color = vec4(1);\n"
2459 "}\n";
2460
2461 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2462 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2463
2464 VkPipelineObj pipe(m_device);
2465 pipe.AddShader(&vs);
2466 pipe.AddShader(&fs);
2467
2468 pipe.AddVertexInputBindings(&input_binding, 1);
2469 pipe.AddVertexInputAttribs(&input_attrib, 1);
2470
2471 VkCommandBufferObj dummyCmd(m_device);
2472 VkDescriptorSetObj descriptorSet(m_device);
2473 descriptorSet.AppendDummy();
2474 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2475
2476 m_errorMonitor->ClearState();
2477 pipe.CreateVKPipeline(descriptorSet);
2478
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002479 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes8291c052015-05-25 11:13:28 +12002480
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002481 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes8291c052015-05-25 11:13:28 +12002482 if (!strstr(msgString.c_str(),"location 0 not consumed by VS")) {
2483 FAIL() << "Incorrect warning: " << msgString;
2484 }
2485}
2486
Chris Forbes37367e62015-05-25 11:13:29 +12002487TEST_F(VkLayerTest, CreatePipelineAttribNotProvided)
2488{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002489 VkFlags msgFlags;
Chris Forbes37367e62015-05-25 11:13:29 +12002490 std::string msgString;
2491 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002492 ScopedUseGlsl useGlsl(false);
Chris Forbes37367e62015-05-25 11:13:29 +12002493
2494 char const *vsSource =
2495 "#version 140\n"
2496 "#extension GL_ARB_separate_shader_objects: require\n"
2497 "#extension GL_ARB_shading_language_420pack: require\n"
2498 "\n"
2499 "layout(location=0) in vec4 x;\n" /* not provided */
2500 "void main(){\n"
2501 " gl_Position = x;\n"
2502 "}\n";
2503 char const *fsSource =
2504 "#version 140\n"
2505 "#extension GL_ARB_separate_shader_objects: require\n"
2506 "#extension GL_ARB_shading_language_420pack: require\n"
2507 "\n"
2508 "layout(location=0) out vec4 color;\n"
2509 "void main(){\n"
2510 " color = vec4(1);\n"
2511 "}\n";
2512
2513 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2514 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2515
2516 VkPipelineObj pipe(m_device);
2517 pipe.AddShader(&vs);
2518 pipe.AddShader(&fs);
2519
2520 VkCommandBufferObj dummyCmd(m_device);
2521 VkDescriptorSetObj descriptorSet(m_device);
2522 descriptorSet.AppendDummy();
2523 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2524
2525 m_errorMonitor->ClearState();
2526 pipe.CreateVKPipeline(descriptorSet);
2527
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002528 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes37367e62015-05-25 11:13:29 +12002529
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002530 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes37367e62015-05-25 11:13:29 +12002531 if (!strstr(msgString.c_str(),"VS consumes input at location 0 but not provided")) {
2532 FAIL() << "Incorrect warning: " << msgString;
2533 }
2534}
2535
Chris Forbesa4b02322015-05-25 11:13:31 +12002536TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch)
2537{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002538 VkFlags msgFlags;
Chris Forbesa4b02322015-05-25 11:13:31 +12002539 std::string msgString;
2540 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002541 ScopedUseGlsl useGlsl(false);
Chris Forbesa4b02322015-05-25 11:13:31 +12002542
2543 VkVertexInputBindingDescription input_binding;
2544 memset(&input_binding, 0, sizeof(input_binding));
2545
2546 VkVertexInputAttributeDescription input_attrib;
2547 memset(&input_attrib, 0, sizeof(input_attrib));
2548 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2549
2550 char const *vsSource =
2551 "#version 140\n"
2552 "#extension GL_ARB_separate_shader_objects: require\n"
2553 "#extension GL_ARB_shading_language_420pack: require\n"
2554 "\n"
2555 "layout(location=0) in int x;\n" /* attrib provided float */
2556 "void main(){\n"
2557 " gl_Position = vec4(x);\n"
2558 "}\n";
2559 char const *fsSource =
2560 "#version 140\n"
2561 "#extension GL_ARB_separate_shader_objects: require\n"
2562 "#extension GL_ARB_shading_language_420pack: require\n"
2563 "\n"
2564 "layout(location=0) out vec4 color;\n"
2565 "void main(){\n"
2566 " color = vec4(1);\n"
2567 "}\n";
2568
2569 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2570 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2571
2572 VkPipelineObj pipe(m_device);
2573 pipe.AddShader(&vs);
2574 pipe.AddShader(&fs);
2575
2576 pipe.AddVertexInputBindings(&input_binding, 1);
2577 pipe.AddVertexInputAttribs(&input_attrib, 1);
2578
2579 VkCommandBufferObj dummyCmd(m_device);
2580 VkDescriptorSetObj descriptorSet(m_device);
2581 descriptorSet.AppendDummy();
2582 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2583
2584 m_errorMonitor->ClearState();
2585 pipe.CreateVKPipeline(descriptorSet);
2586
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002587 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbesa4b02322015-05-25 11:13:31 +12002588
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002589 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbesa4b02322015-05-25 11:13:31 +12002590 if (!strstr(msgString.c_str(),"location 0 does not match VS input type")) {
2591 FAIL() << "Incorrect error: " << msgString;
2592 }
2593}
2594
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002595TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict)
2596{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002597 VkFlags msgFlags;
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002598 std::string msgString;
2599 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002600 ScopedUseGlsl useGlsl(false);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002601
2602 /* Two binding descriptions for binding 0 */
2603 VkVertexInputBindingDescription input_bindings[2];
2604 memset(input_bindings, 0, sizeof(input_bindings));
2605
2606 VkVertexInputAttributeDescription input_attrib;
2607 memset(&input_attrib, 0, sizeof(input_attrib));
2608 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2609
2610 char const *vsSource =
2611 "#version 140\n"
2612 "#extension GL_ARB_separate_shader_objects: require\n"
2613 "#extension GL_ARB_shading_language_420pack: require\n"
2614 "\n"
2615 "layout(location=0) in float x;\n" /* attrib provided float */
2616 "void main(){\n"
2617 " gl_Position = vec4(x);\n"
2618 "}\n";
2619 char const *fsSource =
2620 "#version 140\n"
2621 "#extension GL_ARB_separate_shader_objects: require\n"
2622 "#extension GL_ARB_shading_language_420pack: require\n"
2623 "\n"
2624 "layout(location=0) out vec4 color;\n"
2625 "void main(){\n"
2626 " color = vec4(1);\n"
2627 "}\n";
2628
2629 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2630 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2631
2632 VkPipelineObj pipe(m_device);
2633 pipe.AddShader(&vs);
2634 pipe.AddShader(&fs);
2635
2636 pipe.AddVertexInputBindings(input_bindings, 2);
2637 pipe.AddVertexInputAttribs(&input_attrib, 1);
2638
2639 VkCommandBufferObj dummyCmd(m_device);
2640 VkDescriptorSetObj descriptorSet(m_device);
2641 descriptorSet.AppendDummy();
2642 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2643
2644 m_errorMonitor->ClearState();
2645 pipe.CreateVKPipeline(descriptorSet);
2646
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002647 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002648
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002649 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002650 if (!strstr(msgString.c_str(),"Duplicate vertex input binding descriptions for binding 0")) {
2651 FAIL() << "Incorrect error: " << msgString;
2652 }
2653}
Chris Forbes4c948702015-05-25 11:13:32 +12002654
Chris Forbesc12ef122015-05-25 11:13:40 +12002655/* TODO: would be nice to test the mixed broadcast & custom case, but the GLSL->SPV compiler
2656 * rejects it. */
2657
2658TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten)
2659{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002660 VkFlags msgFlags;
Chris Forbesc12ef122015-05-25 11:13:40 +12002661 std::string msgString;
2662 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002663 ScopedUseGlsl useGlsl(false);
Chris Forbesc12ef122015-05-25 11:13:40 +12002664
2665 char const *vsSource =
2666 "#version 140\n"
2667 "#extension GL_ARB_separate_shader_objects: require\n"
2668 "#extension GL_ARB_shading_language_420pack: require\n"
2669 "\n"
2670 "void main(){\n"
2671 " gl_Position = vec4(1);\n"
2672 "}\n";
2673 char const *fsSource =
2674 "#version 140\n"
2675 "#extension GL_ARB_separate_shader_objects: require\n"
2676 "#extension GL_ARB_shading_language_420pack: require\n"
2677 "\n"
2678 "void main(){\n"
2679 "}\n";
2680
2681 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2682 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2683
2684 VkPipelineObj pipe(m_device);
2685 pipe.AddShader(&vs);
2686 pipe.AddShader(&fs);
2687
2688 /* implicit CB 0 set up by the test framework, not written */
2689
2690 VkCommandBufferObj dummyCmd(m_device);
2691 VkDescriptorSetObj descriptorSet(m_device);
2692 descriptorSet.AppendDummy();
2693 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2694
2695 m_errorMonitor->ClearState();
2696 pipe.CreateVKPipeline(descriptorSet);
2697
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002698 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbesc12ef122015-05-25 11:13:40 +12002699
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002700 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbesc12ef122015-05-25 11:13:40 +12002701 if (!strstr(msgString.c_str(),"Attachment 0 not written by FS")) {
2702 FAIL() << "Incorrect error: " << msgString;
2703 }
2704}
2705
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002706TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed)
2707{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002708 VkFlags msgFlags;
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002709 std::string msgString;
2710 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002711 ScopedUseGlsl useGlsl(false);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002712
2713 char const *vsSource =
2714 "#version 140\n"
2715 "#extension GL_ARB_separate_shader_objects: require\n"
2716 "#extension GL_ARB_shading_language_420pack: require\n"
2717 "\n"
2718 "void main(){\n"
2719 " gl_Position = vec4(1);\n"
2720 "}\n";
2721 char const *fsSource =
2722 "#version 140\n"
2723 "#extension GL_ARB_separate_shader_objects: require\n"
2724 "#extension GL_ARB_shading_language_420pack: require\n"
2725 "\n"
2726 "layout(location=0) out vec4 x;\n"
2727 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
2728 "void main(){\n"
2729 " x = vec4(1);\n"
2730 " y = vec4(1);\n"
2731 "}\n";
2732
2733 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2734 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2735
2736 VkPipelineObj pipe(m_device);
2737 pipe.AddShader(&vs);
2738 pipe.AddShader(&fs);
2739
2740 /* implicit CB 0 set up by the test framework */
2741 /* FS writes CB 1, but we don't configure it */
2742
2743 VkCommandBufferObj dummyCmd(m_device);
2744 VkDescriptorSetObj descriptorSet(m_device);
2745 descriptorSet.AppendDummy();
2746 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2747
2748 m_errorMonitor->ClearState();
2749 pipe.CreateVKPipeline(descriptorSet);
2750
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002751 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002752
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002753 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002754 if (!strstr(msgString.c_str(),"FS writes to output location 1 with no matching attachment")) {
2755 FAIL() << "Incorrect warning: " << msgString;
2756 }
2757}
2758
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002759TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch)
2760{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002761 VkFlags msgFlags;
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002762 std::string msgString;
2763 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002764 ScopedUseGlsl useGlsl(false);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002765
2766 char const *vsSource =
2767 "#version 140\n"
2768 "#extension GL_ARB_separate_shader_objects: require\n"
2769 "#extension GL_ARB_shading_language_420pack: require\n"
2770 "\n"
2771 "void main(){\n"
2772 " gl_Position = vec4(1);\n"
2773 "}\n";
2774 char const *fsSource =
2775 "#version 140\n"
2776 "#extension GL_ARB_separate_shader_objects: require\n"
2777 "#extension GL_ARB_shading_language_420pack: require\n"
2778 "\n"
2779 "layout(location=0) out ivec4 x;\n" /* not UNORM */
2780 "void main(){\n"
2781 " x = ivec4(1);\n"
2782 "}\n";
2783
2784 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2785 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2786
2787 VkPipelineObj pipe(m_device);
2788 pipe.AddShader(&vs);
2789 pipe.AddShader(&fs);
2790
2791 /* implicit CB 0 set up by test framework, is UNORM. */
2792
2793 VkCommandBufferObj dummyCmd(m_device);
2794 VkDescriptorSetObj descriptorSet(m_device);
2795 descriptorSet.AppendDummy();
2796 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2797
2798 m_errorMonitor->ClearState();
2799 pipe.CreateVKPipeline(descriptorSet);
2800
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002801 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002802
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002803 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002804 if (!strstr(msgString.c_str(),"does not match FS output type")) {
2805 FAIL() << "Incorrect error: " << msgString;
2806 }
2807}
Chris Forbesc2050732015-06-05 14:43:36 +12002808
2809TEST_F(VkLayerTest, CreatePipelineNonSpirvShader)
2810{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002811 VkFlags msgFlags;
Chris Forbesc2050732015-06-05 14:43:36 +12002812 std::string msgString;
2813 ASSERT_NO_FATAL_FAILURE(InitState());
2814 /* Intentionally provided GLSL rather than compiling to SPIRV first */
Cody Northrop1cfbd172015-06-03 16:49:20 -06002815 ScopedUseGlsl useGlsl(true);
Chris Forbesc2050732015-06-05 14:43:36 +12002816
2817 char const *vsSource =
2818 "#version 140\n"
2819 "#extension GL_ARB_separate_shader_objects: require\n"
2820 "#extension GL_ARB_shading_language_420pack: require\n"
2821 "\n"
2822 "void main(){\n"
2823 " gl_Position = vec4(1);\n"
2824 "}\n";
2825 char const *fsSource =
2826 "#version 140\n"
2827 "#extension GL_ARB_separate_shader_objects: require\n"
2828 "#extension GL_ARB_shading_language_420pack: require\n"
2829 "\n"
2830 "layout(location=0) out vec4 x;\n"
2831 "void main(){\n"
2832 " x = vec4(1);\n"
2833 "}\n";
2834
2835 m_errorMonitor->ClearState();
2836
2837 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2838 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2839
2840
2841 VkPipelineObj pipe(m_device);
2842 pipe.AddShader(&vs);
2843 pipe.AddShader(&fs);
2844
2845 /* implicit CB 0 set up by test framework, is UNORM. */
2846
2847 VkCommandBufferObj dummyCmd(m_device);
2848 VkDescriptorSetObj descriptorSet(m_device);
2849 descriptorSet.AppendDummy();
2850 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2851
2852 VkResult res = pipe.CreateVKPipeline(descriptorSet);
2853 /* pipeline creation should have succeeded */
2854 ASSERT_EQ(VK_SUCCESS, res);
2855
2856 /* should have emitted a warning: the shader is not SPIRV, so we're
2857 * not going to be able to analyze it */
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002858 msgFlags = m_errorMonitor->GetState(&msgString);
2859 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbesc2050732015-06-05 14:43:36 +12002860 if (!strstr(msgString.c_str(),"is not SPIR-V")) {
2861 FAIL() << "Incorrect warning: " << msgString;
2862 }
2863}
Chris Forbes01c9db72015-06-04 09:25:25 +12002864#endif
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002865
Tony Barbour30486ea2015-04-07 13:44:53 -06002866int main(int argc, char **argv) {
2867 int result;
2868
2869 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour01999182015-04-09 12:58:51 -06002870 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour30486ea2015-04-07 13:44:53 -06002871
2872 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
2873
2874 result = RUN_ALL_TESTS();
2875
Tony Barbour01999182015-04-09 12:58:51 -06002876 VkTestFramework::Finish();
Tony Barbour30486ea2015-04-07 13:44:53 -06002877 return result;
2878}