blob: e201b8f7e4918cde849fa5d14b9b8fb4642b51cb [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"
Mark Lobodzinskia910dc82015-05-14 14:30:48 -05005#include "layers_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 Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600151 std::vector<const char *> instance_extension_names;
152 std::vector<const char *> device_extension_names;
Tony Barbour950ebc02015-04-23 12:55:36 -0600153
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600154 instance_extension_names.push_back(DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterde53c5b2015-06-16 15:59:11 -0600155 /*
156 * Since CreateDbgMsgCallback is an instance level extension call
157 * any extension / layer that utilizes that feature also needs
158 * to be enabled at create instance time.
159 */
Mike Stroyaned254572015-06-17 16:32:06 -0600160 // Use Threading layer first to protect others from ThreadCmdBufferCollision test
161 instance_extension_names.push_back("Threading");
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600162 instance_extension_names.push_back("MemTracker");
Courtney Goeltzenleuchtereb518dc2015-06-13 21:41:00 -0600163 instance_extension_names.push_back("DrawState");
164 instance_extension_names.push_back("ObjectTracker");
Courtney Goeltzenleuchterde53c5b2015-06-16 15:59:11 -0600165 instance_extension_names.push_back("ShaderChecker");
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600166
Mike Stroyaned254572015-06-17 16:32:06 -0600167 device_extension_names.push_back("Threading");
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600168 device_extension_names.push_back("MemTracker");
Jon Ashburn64716542015-06-15 12:21:02 -0600169 device_extension_names.push_back("DrawState");
Courtney Goeltzenleuchtereb518dc2015-06-13 21:41:00 -0600170 device_extension_names.push_back("ObjectTracker");
Courtney Goeltzenleuchterde53c5b2015-06-16 15:59:11 -0600171 device_extension_names.push_back("ShaderChecker");
Tony Barbour30486ea2015-04-07 13:44:53 -0600172
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600173 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour30486ea2015-04-07 13:44:53 -0600174 this->app_info.pNext = NULL;
175 this->app_info.pAppName = "layer_tests";
176 this->app_info.appVersion = 1;
177 this->app_info.pEngineName = "unittest";
178 this->app_info.engineVersion = 1;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600179 this->app_info.apiVersion = VK_API_VERSION;
Tony Barbour30486ea2015-04-07 13:44:53 -0600180
Tony Barbour0c1bdc62015-04-29 17:34:29 -0600181 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600182 InitFramework(instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour30486ea2015-04-07 13:44:53 -0600183 }
184
185 virtual void TearDown() {
186 // Clean up resources before we reset
Tony Barbour30486ea2015-04-07 13:44:53 -0600187 ShutdownFramework();
Tony Barbour8508b8e2015-04-09 10:48:04 -0600188 delete m_errorMonitor;
Tony Barbour30486ea2015-04-07 13:44:53 -0600189 }
190};
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500191
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600192VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour30486ea2015-04-07 13:44:53 -0600193{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600194 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600195
196 result = cmdBuffer.BeginCommandBuffer();
197
198 /*
199 * For render test all drawing happens in a single render pass
200 * on a single command buffer.
201 */
Chris Forbesfe133ef2015-06-16 14:05:59 +1200202 if (VK_SUCCESS == result && renderPass()) {
Tony Barbour30486ea2015-04-07 13:44:53 -0600203 cmdBuffer.BeginRenderPass(renderPass(), framebuffer());
204 }
205
206 return result;
207}
208
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600209VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour30486ea2015-04-07 13:44:53 -0600210{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600211 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600212
Chris Forbesfe133ef2015-06-16 14:05:59 +1200213 if (renderPass()) {
214 cmdBuffer.EndRenderPass(renderPass());
215 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600216
217 result = cmdBuffer.EndCommandBuffer();
218
219 return result;
220}
221
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500222void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask)
223{
224 // Create identity matrix
225 int i;
226 struct vktriangle_vs_uniform data;
227
228 glm::mat4 Projection = glm::mat4(1.0f);
229 glm::mat4 View = glm::mat4(1.0f);
230 glm::mat4 Model = glm::mat4(1.0f);
231 glm::mat4 MVP = Projection * View * Model;
232 const int matrixSize = sizeof(MVP);
233 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
234
235 memcpy(&data.mvp, &MVP[0][0], matrixSize);
236
237 static const Vertex tri_data[] =
238 {
239 { XYZ1( -1, -1, 0 ), XYZ1( 1.f, 0.f, 0.f ) },
240 { XYZ1( 1, -1, 0 ), XYZ1( 0.f, 1.f, 0.f ) },
241 { XYZ1( 0, 1, 0 ), XYZ1( 0.f, 0.f, 1.f ) },
242 };
243
244 for (i=0; i<3; i++) {
245 data.position[i][0] = tri_data[i].posX;
246 data.position[i][1] = tri_data[i].posY;
247 data.position[i][2] = tri_data[i].posZ;
248 data.position[i][3] = tri_data[i].posW;
249 data.color[i][0] = tri_data[i].r;
250 data.color[i][1] = tri_data[i].g;
251 data.color[i][2] = tri_data[i].b;
252 data.color[i][3] = tri_data[i].a;
253 }
254
255 ASSERT_NO_FATAL_FAILURE(InitState());
256 ASSERT_NO_FATAL_FAILURE(InitViewport());
257
258 VkConstantBufferObj constantBuffer(m_device, bufSize*2, sizeof(float), (const void*) &data);
259
260 VkShaderObj vs(m_device,vertShaderText,VK_SHADER_STAGE_VERTEX, this);
261 VkShaderObj ps(m_device,fragShaderText, VK_SHADER_STAGE_FRAGMENT, this);
262
263 VkPipelineObj pipelineobj(m_device);
264 pipelineobj.AddShader(&vs);
265 pipelineobj.AddShader(&ps);
266
267 VkDescriptorSetObj descriptorSet(m_device);
268 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
269
270 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
271 VkCommandBufferObj cmdBuffer(m_device);
272 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
273
274 ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
275
276 GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet, failMask);
277
278 // render triangle
279 cmdBuffer.Draw(0, 3, 0, 1);
280
281 // finalize recording of the command buffer
282 EndCommandBuffer(cmdBuffer);
283
284 cmdBuffer.QueueCommandBuffer();
285}
286
287void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *cmdBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask)
288{
289 if (m_depthStencil->Initialized()) {
290 cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
291 } else {
292 cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
293 }
294
295 cmdBuffer->PrepareAttachments();
296 if ((failMask & BsoFailRaster) != BsoFailRaster) {
297 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_RASTER, m_stateRaster);
298 }
299 if ((failMask & BsoFailViewport) != BsoFailViewport) {
300 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_VIEWPORT, m_stateViewport);
301 }
302 if ((failMask & BsoFailColorBlend) != BsoFailColorBlend) {
303 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_COLOR_BLEND, m_colorBlend);
304 }
305 if ((failMask & BsoFailDepthStencil) != BsoFailDepthStencil) {
306 cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_DEPTH_STENCIL, m_stateDepthStencil);
307 }
308 descriptorSet.CreateVKDescriptorSet(cmdBuffer);
309 pipelineobj.CreateVKPipeline(descriptorSet);
310 cmdBuffer->BindPipeline(pipelineobj);
311 cmdBuffer->BindDescriptorSet(descriptorSet);
312}
313
314// ********************************************************************************************************************
315// ********************************************************************************************************************
316// ********************************************************************************************************************
317// ********************************************************************************************************************
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600318#if MEM_TRACKER_TESTS
Mark Lobodzinski81078192015-05-19 10:28:29 -0500319TEST_F(VkLayerTest, CallResetCmdBufferBeforeCompletion)
320{
321 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600322 VkFlags msgFlags;
Mark Lobodzinski81078192015-05-19 10:28:29 -0500323 std::string msgString;
324
325 VkFenceCreateInfo fenceInfo = {};
326 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
327 fenceInfo.pNext = NULL;
328 fenceInfo.flags = 0;
329
330 ASSERT_NO_FATAL_FAILURE(InitState());
331 ASSERT_NO_FATAL_FAILURE(InitViewport());
332 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
333
334 VkCommandBufferObj cmdBuffer(m_device);
335 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
336
337 BeginCommandBuffer(cmdBuffer);
338 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
339 EndCommandBuffer(cmdBuffer);
340
341 testFence.init(*m_device, fenceInfo);
342
343 // Bypass framework since it does the waits automatically
344 VkResult err = VK_SUCCESS;
345 err = vkQueueSubmit( m_device->m_queue, 1, &cmdBuffer.obj(), testFence.obj());
346 ASSERT_VK_SUCCESS( err );
347
348 m_errorMonitor->ClearState();
349 // Introduce failure by calling begin again before checking fence
350 vkResetCommandBuffer(cmdBuffer.obj());
351
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600352 msgFlags = m_errorMonitor->GetState(&msgString);
353 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 -0500354 if (!strstr(msgString.c_str(),"Resetting CB")) {
355 FAIL() << "Error received was not 'Resetting CB (0xaddress) before it has completed. You must check CB flag before'";
356 }
357}
358
359TEST_F(VkLayerTest, CallBeginCmdBufferBeforeCompletion)
360{
361 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600362 VkFlags msgFlags;
Mark Lobodzinski81078192015-05-19 10:28:29 -0500363 std::string msgString;
364
365 VkFenceCreateInfo fenceInfo = {};
366 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
367 fenceInfo.pNext = NULL;
368 fenceInfo.flags = 0;
369
370 ASSERT_NO_FATAL_FAILURE(InitState());
371 ASSERT_NO_FATAL_FAILURE(InitViewport());
372 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
373
374 VkCommandBufferObj cmdBuffer(m_device);
375 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
376
377 BeginCommandBuffer(cmdBuffer);
378 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
379 EndCommandBuffer(cmdBuffer);
380
381 testFence.init(*m_device, fenceInfo);
382
383 // Bypass framework since it does the waits automatically
384 VkResult err = VK_SUCCESS;
385 err = vkQueueSubmit( m_device->m_queue, 1, &cmdBuffer.obj(), testFence.obj());
386 ASSERT_VK_SUCCESS( err );
387
388 m_errorMonitor->ClearState();
389 // Introduce failure by calling begin again before checking fence
390 BeginCommandBuffer(cmdBuffer);
391
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600392 msgFlags = m_errorMonitor->GetState(&msgString);
393 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 -0500394 if (!strstr(msgString.c_str(),"Calling vkBeginCommandBuffer() on active CB")) {
395 FAIL() << "Error received was not 'Calling vkBeginCommandBuffer() on an active CB (0xaddress) before it has completed'";
396 }
397}
398
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500399TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit)
400{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600401 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500402 std::string msgString;
403 VkResult err;
404
405 ASSERT_NO_FATAL_FAILURE(InitState());
406 m_errorMonitor->ClearState();
407
408 // Create an image, allocate memory, free it, and then try to bind it
409 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500410 VkDeviceMemory mem;
411 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500412
413 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
414 const int32_t tex_width = 32;
415 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500416
417 const VkImageCreateInfo image_create_info = {
418 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
419 .pNext = NULL,
420 .imageType = VK_IMAGE_TYPE_2D,
421 .format = tex_format,
422 .extent = { tex_width, tex_height, 1 },
423 .mipLevels = 1,
424 .arraySize = 1,
425 .samples = 1,
426 .tiling = VK_IMAGE_TILING_LINEAR,
427 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
428 .flags = 0,
429 };
430 VkMemoryAllocInfo mem_alloc = {
431 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
432 .pNext = NULL,
433 .allocationSize = 0,
434 // Introduce failure, do NOT set memProps to VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
435 .memProps = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500436 };
437
438 err = vkCreateImage(m_device->device(), &image_create_info, &image);
439 ASSERT_VK_SUCCESS(err);
440
Tony Barbour426b9052015-06-24 16:06:58 -0600441 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500442 VK_OBJECT_TYPE_IMAGE,
443 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500444 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500445 ASSERT_VK_SUCCESS(err);
446
Mark Lobodzinski23182612015-05-29 09:32:35 -0500447 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500448
449 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500450 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500451 ASSERT_VK_SUCCESS(err);
452
453 // Try to bind free memory that has been freed
Mark Lobodzinski23182612015-05-29 09:32:35 -0500454 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500455 ASSERT_VK_SUCCESS(err);
456
457 // Map memory as if to initialize the image
458 void *mappedAddress = NULL;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500459 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, &mappedAddress);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500460
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600461 msgFlags = m_errorMonitor->GetState(&msgString);
462 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 -0500463 if (!strstr(msgString.c_str(),"Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT")) {
464 FAIL() << "Error received did not match expected error message from vkMapMemory in MemTracker";
465 }
466}
467
468TEST_F(VkLayerTest, BindInvalidMemory)
469{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600470 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500471 std::string msgString;
472 VkResult err;
473
474 ASSERT_NO_FATAL_FAILURE(InitState());
475 m_errorMonitor->ClearState();
476
477 // Create an image, allocate memory, free it, and then try to bind it
478 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500479 VkDeviceMemory mem;
480 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500481
482 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
483 const int32_t tex_width = 32;
484 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500485
486 const VkImageCreateInfo image_create_info = {
487 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
488 .pNext = NULL,
489 .imageType = VK_IMAGE_TYPE_2D,
490 .format = tex_format,
491 .extent = { tex_width, tex_height, 1 },
492 .mipLevels = 1,
493 .arraySize = 1,
494 .samples = 1,
495 .tiling = VK_IMAGE_TILING_LINEAR,
496 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
497 .flags = 0,
498 };
499 VkMemoryAllocInfo mem_alloc = {
500 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
501 .pNext = NULL,
502 .allocationSize = 0,
503 .memProps = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500504 };
505
506 err = vkCreateImage(m_device->device(), &image_create_info, &image);
507 ASSERT_VK_SUCCESS(err);
508
Tony Barbour426b9052015-06-24 16:06:58 -0600509 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500510 VK_OBJECT_TYPE_IMAGE,
511 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500512 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500513 ASSERT_VK_SUCCESS(err);
514
Mark Lobodzinski23182612015-05-29 09:32:35 -0500515 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500516
517 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500518 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500519 ASSERT_VK_SUCCESS(err);
520
521 // Introduce validation failure, free memory before binding
Mark Lobodzinski23182612015-05-29 09:32:35 -0500522 vkFreeMemory(m_device->device(), mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500523 ASSERT_VK_SUCCESS(err);
524
525 // Try to bind free memory that has been freed
Mark Lobodzinski23182612015-05-29 09:32:35 -0500526 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500527 ASSERT_VK_SUCCESS(err);
528
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600529 msgFlags = m_errorMonitor->GetState(&msgString);
530 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 -0500531 if (!strstr(msgString.c_str(),"couldn't find info for mem obj")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500532 FAIL() << "Error received did not match expected error message from BindObjectMemory in MemTracker";
533 }
534}
535
536TEST_F(VkLayerTest, FreeBoundMemory)
537{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600538 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500539 std::string msgString;
540 VkResult err;
541
542 ASSERT_NO_FATAL_FAILURE(InitState());
543 m_errorMonitor->ClearState();
544
545 // Create an image, allocate memory, free it, and then try to bind it
546 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500547 VkDeviceMemory mem;
548 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500549
550 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
551 const int32_t tex_width = 32;
552 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500553
554 const VkImageCreateInfo image_create_info = {
555 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
556 .pNext = NULL,
557 .imageType = VK_IMAGE_TYPE_2D,
558 .format = tex_format,
559 .extent = { tex_width, tex_height, 1 },
560 .mipLevels = 1,
561 .arraySize = 1,
562 .samples = 1,
563 .tiling = VK_IMAGE_TILING_LINEAR,
564 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
565 .flags = 0,
566 };
567 VkMemoryAllocInfo mem_alloc = {
568 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
569 .pNext = NULL,
570 .allocationSize = 0,
571 .memProps = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500572 };
573
574 err = vkCreateImage(m_device->device(), &image_create_info, &image);
575 ASSERT_VK_SUCCESS(err);
576
Tony Barbour426b9052015-06-24 16:06:58 -0600577 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500578 VK_OBJECT_TYPE_IMAGE,
579 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500580 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500581 ASSERT_VK_SUCCESS(err);
582
Mark Lobodzinski23182612015-05-29 09:32:35 -0500583 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500584
585 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500586 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500587 ASSERT_VK_SUCCESS(err);
588
589 // Bind memory to Image object
Mark Lobodzinski23182612015-05-29 09:32:35 -0500590 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500591 ASSERT_VK_SUCCESS(err);
592
593 // Introduce validation failure, free memory while still bound to object
Mark Lobodzinski23182612015-05-29 09:32:35 -0500594 vkFreeMemory(m_device->device(), mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500595 ASSERT_VK_SUCCESS(err);
596
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600597 msgFlags = m_errorMonitor->GetState(&msgString);
Courtney Goeltzenleuchter7dc4c8b2015-06-13 21:48:47 -0600598 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 -0500599 if (!strstr(msgString.c_str(),"Freeing memory object while it still has references")) {
600 FAIL() << "Warning received did not match expected message from freeMemObjInfo in MemTracker";
601 }
602}
603
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500604TEST_F(VkLayerTest, RebindMemory)
605{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600606 VkFlags msgFlags;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500607 std::string msgString;
608 VkResult err;
609
610 ASSERT_NO_FATAL_FAILURE(InitState());
611 m_errorMonitor->ClearState();
612
613 // Create an image, allocate memory, free it, and then try to bind it
614 VkImage image;
615 VkDeviceMemory mem1;
616 VkDeviceMemory mem2;
617 VkMemoryRequirements mem_reqs;
618
619 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
620 const int32_t tex_width = 32;
621 const int32_t tex_height = 32;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500622
623 const VkImageCreateInfo image_create_info = {
624 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
625 .pNext = NULL,
626 .imageType = VK_IMAGE_TYPE_2D,
627 .format = tex_format,
628 .extent = { tex_width, tex_height, 1 },
629 .mipLevels = 1,
630 .arraySize = 1,
631 .samples = 1,
632 .tiling = VK_IMAGE_TILING_LINEAR,
633 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
634 .flags = 0,
635 };
636 VkMemoryAllocInfo mem_alloc = {
637 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
638 .pNext = NULL,
639 .allocationSize = 0,
640 .memProps = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500641 };
642
643 err = vkCreateImage(m_device->device(), &image_create_info, &image);
644 ASSERT_VK_SUCCESS(err);
645
Tony Barbour426b9052015-06-24 16:06:58 -0600646 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500647 VK_OBJECT_TYPE_IMAGE,
648 image,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500649 &mem_reqs);
650 ASSERT_VK_SUCCESS(err);
651
652 mem_alloc.allocationSize = mem_reqs.size;
653
654 // allocate 2 memory objects
655 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem1);
656 ASSERT_VK_SUCCESS(err);
657 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem2);
658 ASSERT_VK_SUCCESS(err);
659
660 // Bind first memory object to Image object
661 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem1, 0);
662 ASSERT_VK_SUCCESS(err);
663
664 // Introduce validation failure, try to bind a different memory object to the same image object
665 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem2, 0);
666 ASSERT_VK_SUCCESS(err);
667
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600668 msgFlags = m_errorMonitor->GetState(&msgString);
669 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 -0500670 if (!strstr(msgString.c_str(),"which has already been bound to mem object")) {
671 FAIL() << "Error received did not match expected message when rebinding memory to an object";
672 }
673}
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500674
675TEST_F(VkLayerTest, BindMemoryToDestroyedObject)
676{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600677 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500678 std::string msgString;
679 VkResult err;
680
681 ASSERT_NO_FATAL_FAILURE(InitState());
682 m_errorMonitor->ClearState();
683
684 // Create an image object, allocate memory, destroy the object and then try to bind it
685 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500686 VkDeviceMemory mem;
687 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500688
689 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
690 const int32_t tex_width = 32;
691 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500692
693 const VkImageCreateInfo image_create_info = {
694 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
695 .pNext = NULL,
696 .imageType = VK_IMAGE_TYPE_2D,
697 .format = tex_format,
698 .extent = { tex_width, tex_height, 1 },
699 .mipLevels = 1,
700 .arraySize = 1,
701 .samples = 1,
702 .tiling = VK_IMAGE_TILING_LINEAR,
703 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
704 .flags = 0,
705 };
706 VkMemoryAllocInfo mem_alloc = {
707 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
708 .pNext = NULL,
709 .allocationSize = 0,
710 .memProps = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500711 };
712
713 err = vkCreateImage(m_device->device(), &image_create_info, &image);
714 ASSERT_VK_SUCCESS(err);
715
Tony Barbour426b9052015-06-24 16:06:58 -0600716 err = vkGetObjectMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500717 VK_OBJECT_TYPE_IMAGE,
718 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500719 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500720 ASSERT_VK_SUCCESS(err);
721
Mark Lobodzinski23182612015-05-29 09:32:35 -0500722 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500723
724 // Allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500725 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500726 ASSERT_VK_SUCCESS(err);
727
728 // Introduce validation failure, destroy Image object before binding
729 vkDestroyObject(m_device->device(), VK_OBJECT_TYPE_IMAGE, image);
730 ASSERT_VK_SUCCESS(err);
731
732 // Now Try to bind memory to this destroyted object
Mark Lobodzinski23182612015-05-29 09:32:35 -0500733 err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500734 ASSERT_VK_SUCCESS(err);
735
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600736 msgFlags = m_errorMonitor->GetState(&msgString);
737 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 -0500738 if (!strstr(msgString.c_str(),"that's not in global list")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500739 FAIL() << "Error received did not match expected error message from updateObjectBinding in MemTracker";
740 }
741}
742
Tony Barbour8508b8e2015-04-09 10:48:04 -0600743TEST_F(VkLayerTest, SubmitSignaledFence)
Tony Barbour30486ea2015-04-07 13:44:53 -0600744{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600745 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600746 VkFlags msgFlags;
Tony Barbour30486ea2015-04-07 13:44:53 -0600747 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600748
749 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600750 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
751 fenceInfo.pNext = NULL;
752 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour30486ea2015-04-07 13:44:53 -0600753
Tony Barbour30486ea2015-04-07 13:44:53 -0600754 ASSERT_NO_FATAL_FAILURE(InitState());
755 ASSERT_NO_FATAL_FAILURE(InitViewport());
756 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
757
Tony Barbour01999182015-04-09 12:58:51 -0600758 VkCommandBufferObj cmdBuffer(m_device);
Tony Barbour30486ea2015-04-07 13:44:53 -0600759 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
760
Tony Barbour8508b8e2015-04-09 10:48:04 -0600761 BeginCommandBuffer(cmdBuffer);
Tony Barbour30486ea2015-04-07 13:44:53 -0600762 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour8508b8e2015-04-09 10:48:04 -0600763 EndCommandBuffer(cmdBuffer);
Tony Barbour30486ea2015-04-07 13:44:53 -0600764
765 testFence.init(*m_device, fenceInfo);
766 m_errorMonitor->ClearState();
Tony Barbour8508b8e2015-04-09 10:48:04 -0600767 cmdBuffer.QueueCommandBuffer(testFence.obj());
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600768 msgFlags = m_errorMonitor->GetState(&msgString);
769 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 -0600770 if (!strstr(msgString.c_str(),"submitted in SIGNALED state. Fences must be reset before being submitted")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500771 FAIL() << "Error received was not 'VkQueueSubmit with fence in SIGNALED_STATE'";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600772 }
773
774}
775
776TEST_F(VkLayerTest, ResetUnsignaledFence)
777{
778 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600779 VkFlags msgFlags;
Tony Barbour8508b8e2015-04-09 10:48:04 -0600780 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600781 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600782 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
783 fenceInfo.pNext = NULL;
784
Tony Barbour8508b8e2015-04-09 10:48:04 -0600785 ASSERT_NO_FATAL_FAILURE(InitState());
786 testFence.init(*m_device, fenceInfo);
787 m_errorMonitor->ClearState();
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600788 VkFence fences[1] = {testFence.obj()};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600789 vkResetFences(m_device->device(), 1, fences);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600790 msgFlags = m_errorMonitor->GetState(&msgString);
791 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 -0600792 if (!strstr(msgString.c_str(),"submitted to VkResetFences in UNSIGNALED STATE")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500793 FAIL() << "Error received was not 'VkResetFences with fence in UNSIGNALED_STATE'";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600794 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600795
796}
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600797#endif
798#if OBJECT_TRACKER_TESTS
Tony Barbour54cdd192015-04-22 15:12:07 -0600799
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500800TEST_F(VkLayerTest, RasterStateNotBound)
801{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600802 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500803 std::string msgString;
804
805 TEST_DESCRIPTION("Simple Draw Call that validates failure when a raster state object is not bound beforehand");
806
807 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailRaster);
808
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600809 msgFlags = m_errorMonitor->GetState(&msgString);
810 ASSERT_EQ(msgFlags, VK_DBG_MSG_ERROR) << "Did not receive an error from Not Binding a Raster State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500811 if (!strstr(msgString.c_str(),"Raster object not bound to this command buffer")) {
812 FAIL() << "Error received was not 'Raster object not bound to this command buffer'";
813 }
814}
815
816TEST_F(VkLayerTest, ViewportStateNotBound)
817{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600818 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500819 std::string msgString;
820 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport state object is not bound beforehand");
821
822 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
823
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600824 msgFlags = m_errorMonitor->GetState(&msgString);
825 ASSERT_EQ(msgFlags, VK_DBG_MSG_ERROR) << "Did not receive an error from Not Binding a Viewport State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500826 if (!strstr(msgString.c_str(),"Viewport object not bound to this command buffer")) {
827 FAIL() << "Error received was not 'Viewport object not bound to this command buffer'";
828 }
829}
830
831TEST_F(VkLayerTest, ColorBlendStateNotBound)
832{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600833 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500834 std::string msgString;
835
836 TEST_DESCRIPTION("Simple Draw Call that validates failure when a color-blend state object is not bound beforehand");
837
838 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailColorBlend);
839
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600840 msgFlags = m_errorMonitor->GetState(&msgString);
841 ASSERT_EQ(msgFlags, VK_DBG_MSG_ERROR) << "Did not receive an error from Not Binding a ColorBlend State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500842 if (!strstr(msgString.c_str(),"Color-blend object not bound to this command buffer")) {
843 FAIL() << "Error received was not 'Color-blend object not bound to this command buffer'";
844 }
845}
846
847TEST_F(VkLayerTest, DepthStencilStateNotBound)
848{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600849 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500850 std::string msgString;
851
852 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth-stencil state object is not bound beforehand");
853
854 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthStencil);
855
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600856 msgFlags = m_errorMonitor->GetState(&msgString);
857 ASSERT_EQ(msgFlags, VK_DBG_MSG_ERROR) << "Did not receive an error from Not Binding a DepthStencil State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500858 if (!strstr(msgString.c_str(),"Depth-stencil object not bound to this command buffer")) {
859 FAIL() << "Error received was not 'Depth-stencil object not bound to this command buffer'";
860 }
Tony Barbourdb686622015-05-06 09:35:56 -0600861}
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600862#endif
863#if DRAW_STATE_TESTS
Tobin Ehlise4076782015-06-24 15:53:07 -0600864TEST_F(VkLayerTest, BindPipelineNoRenderPass)
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600865{
866 // Initiate Draw w/o a PSO bound
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600867 VkFlags msgFlags;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600868 std::string msgString;
869
870 ASSERT_NO_FATAL_FAILURE(InitState());
871 m_errorMonitor->ClearState();
872 VkCommandBufferObj cmdBuffer(m_device);
873 BeginCommandBuffer(cmdBuffer);
874 VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
875 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600876 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlise4076782015-06-24 15:53:07 -0600877 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding pipeline to CmdBuffer w/o active RenderPass";
878 if (!strstr(msgString.c_str(),"Incorrectly binding graphics pipeline ")) {
879 FAIL() << "Error received was not 'Incorrectly binding graphics pipeline (0xbaadb1be) without an active RenderPass'";
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600880 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600881}
882
883TEST_F(VkLayerTest, InvalidDescriptorPool)
884{
885 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
886 // The DS check for this is after driver has been called to validate DS internal data struct
887 // Attempt to clear DS Pool with bad object
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600888/* VkFlags msgFlags;
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600889 std::string msgString;
890 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
891 vkResetDescriptorPool(device(), badPool);
892
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600893 msgFlags = m_errorMonitor->GetState(&msgString);
894 ASSERT_EQ(msgFlags, VK_DBG_MSG_ERROR) << "Did not receive an error from Resetting an invalid DescriptorPool Object";
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600895 if (!strstr(msgString.c_str(),"Unable to find pool node for pool 0xbaad6001 specified in vkResetDescriptorPool() call")) {
896 FAIL() << "Error received was note 'Unable to find pool node for pool 0xbaad6001 specified in vkResetDescriptorPool() call'";
897 }*/
898}
899
900TEST_F(VkLayerTest, InvalidDescriptorSet)
901{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600902 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
903 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600904 // Create a valid cmd buffer
905 // call vkCmdBindDescriptorSets w/ false DS
906}
907
908TEST_F(VkLayerTest, InvalidDescriptorSetLayout)
909{
910 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
911 // The DS check for this is after driver has been called to validate DS internal data struct
912}
913
914TEST_F(VkLayerTest, InvalidPipeline)
915{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600916 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
917 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600918 // Create a valid cmd buffer
919 // call vkCmdBindPipeline w/ false Pipeline
Tobin Ehlise4076782015-06-24 15:53:07 -0600920// VkFlags msgFlags;
921// std::string msgString;
922//
923// ASSERT_NO_FATAL_FAILURE(InitState());
924// m_errorMonitor->ClearState();
925// VkCommandBufferObj cmdBuffer(m_device);
926// BeginCommandBuffer(cmdBuffer);
927// VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
928// vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
929// msgFlags = m_errorMonitor->GetState(&msgString);
930// ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding invalid pipeline to CmdBuffer";
931// if (!strstr(msgString.c_str(),"Attempt to bind Pipeline ")) {
932// FAIL() << "Error received was not 'Attempt to bind Pipeline 0xbaadb1be that doesn't exist!'";
933// }
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600934}
935
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600936TEST_F(VkLayerTest, NoEndCmdBuffer)
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600937{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600938 // Create and update CmdBuffer then call QueueSubmit w/o calling End on CmdBuffer
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600939 VkFlags msgFlags;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600940 std::string msgString;
941 VkResult err;
942
943 ASSERT_NO_FATAL_FAILURE(InitState());
944 m_errorMonitor->ClearState();
945 VkCommandBufferObj cmdBuffer(m_device);
946 const VkDescriptorTypeCount ds_type_count = {
947 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
948 .count = 1,
949 };
950 const VkDescriptorPoolCreateInfo ds_pool_ci = {
951 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
952 .pNext = NULL,
953 .count = 1,
954 .pTypeCount = &ds_type_count,
955 };
956 VkDescriptorPool ds_pool;
957 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
958 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600959
960 const VkDescriptorSetLayoutBinding dsl_binding = {
961 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +0800962 .arraySize = 1,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600963 .stageFlags = VK_SHADER_STAGE_ALL,
964 .pImmutableSamplers = NULL,
965 };
966
967 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
968 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
969 .pNext = NULL,
970 .count = 1,
971 .pBinding = &dsl_binding,
972 };
973 VkDescriptorSetLayout ds_layout;
974 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
975 ASSERT_VK_SUCCESS(err);
976
977 VkDescriptorSet descriptorSet;
978 uint32_t ds_count = 0;
979 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
980 ASSERT_VK_SUCCESS(err);
981
982 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
983 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
984 .pNext = NULL,
985 .descriptorSetCount = 1,
986 .pSetLayouts = &ds_layout,
987 };
988
989 VkPipelineLayout pipeline_layout;
990 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
991 ASSERT_VK_SUCCESS(err);
992
993 size_t shader_len = strlen(bindStateVertShaderText);
994 size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
995 void* pCode = malloc(codeSize);
996
997 /* try version 0 first: VkShaderStage followed by GLSL */
998 ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
999 ((uint32_t *) pCode)[1] = 0;
1000 ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
1001 memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
1002
1003 const VkShaderCreateInfo vs_ci = {
1004 .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
1005 .pNext = NULL,
Courtney Goeltzenleuchter1d723102015-06-18 21:49:59 -06001006 .module = VK_NULL_HANDLE,
1007 .name = "main",
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001008 .codeSize = codeSize,
1009 .pCode = pCode,
1010 .flags = 0,
1011 };
1012 VkShader vs;
1013 err = vkCreateShader(m_device->device(), &vs_ci, &vs);
1014 ASSERT_VK_SUCCESS(err);
1015
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001016 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1017 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1018 .pNext = NULL,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001019 .stage = VK_SHADER_STAGE_VERTEX,
1020 .shader = vs,
1021 .linkConstBufferCount = 0,
1022 .pLinkConstBufferInfo = NULL,
1023 .pSpecializationInfo = NULL,
1024 };
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001025 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001026 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1027 .pNext = NULL,
1028 .stageCount = 1,
1029 .pStages = &pipe_vs_ci,
1030 .pVertexInputState = NULL,
1031 .pIaState = NULL,
1032 .pTessState = NULL,
1033 .pVpState = NULL,
1034 .pRsState = NULL,
1035 .pMsState = NULL,
1036 .pDsState = NULL,
1037 .pCbState = NULL,
1038 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1039 .layout = pipeline_layout,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001040 };
1041
1042 VkPipeline pipeline;
1043 err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
1044 ASSERT_VK_SUCCESS(err);
1045
1046 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinskia65c4632015-06-15 13:21:21 -06001047 vkCmdBindDescriptorSets(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001048
1049 VkCmdBuffer localCmdBuffer = cmdBuffer.GetBufferHandle();
1050 m_device->get_device_queue();
1051 vkQueueSubmit(m_device->m_queue, 1, &localCmdBuffer, NULL);
1052
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001053 msgFlags = m_errorMonitor->GetState(&msgString);
1054 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after vkEndDescriptorPoolUpdate() w/o first calling vkBeginDescriptorPoolUpdate().";
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001055 if (!strstr(msgString.c_str(),"You must call vkEndCommandBuffer() on CB ")) {
1056 FAIL() << "Error received was not 'You must call vkEndCommandBuffer() on CB <0xblah> before this call to vkQueueSubmit()!'";
1057 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001058}
1059
1060TEST_F(VkLayerTest, InvalidDynamicStateObject)
1061{
1062 // Create a valid cmd buffer
1063 // call vkCmdBindDynamicStateObject w/ false DS Obj
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001064 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1065 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001066}
Tobin Ehlis201b1ba2015-05-27 14:55:35 -06001067
Tobin Ehlise4076782015-06-24 15:53:07 -06001068TEST_F(VkLayerTest, VtxBufferNoRenderPass)
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001069{
1070 // Bind VBO out-of-bounds for given PSO
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001071 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001072 std::string msgString;
1073 VkResult err;
1074
1075 ASSERT_NO_FATAL_FAILURE(InitState());
1076 m_errorMonitor->ClearState();
1077 VkCommandBufferObj cmdBuffer(m_device);
1078 const VkDescriptorTypeCount ds_type_count = {
1079 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1080 .count = 1,
1081 };
1082 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1083 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1084 .pNext = NULL,
1085 .count = 1,
1086 .pTypeCount = &ds_type_count,
1087 };
1088 VkDescriptorPool ds_pool;
1089 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1090 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001091
1092 const VkDescriptorSetLayoutBinding dsl_binding = {
1093 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001094 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001095 .stageFlags = VK_SHADER_STAGE_ALL,
1096 .pImmutableSamplers = NULL,
1097 };
1098
1099 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1100 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1101 .pNext = NULL,
1102 .count = 1,
1103 .pBinding = &dsl_binding,
1104 };
1105 VkDescriptorSetLayout ds_layout;
1106 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1107 ASSERT_VK_SUCCESS(err);
1108
1109 VkDescriptorSet descriptorSet;
1110 uint32_t ds_count = 0;
1111 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1112 ASSERT_VK_SUCCESS(err);
1113
1114 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1115 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1116 .pNext = NULL,
1117 .descriptorSetCount = 1,
1118 .pSetLayouts = &ds_layout,
1119 };
1120
1121 VkPipelineLayout pipeline_layout;
1122 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1123 ASSERT_VK_SUCCESS(err);
1124
1125 size_t shader_len = strlen(bindStateVertShaderText);
1126 size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
1127 void* pCode = malloc(codeSize);
1128
1129 /* try version 0 first: VkShaderStage followed by GLSL */
1130 ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
1131 ((uint32_t *) pCode)[1] = 0;
1132 ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
1133 memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
1134
1135 const VkShaderCreateInfo vs_ci = {
1136 .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
1137 .pNext = NULL,
Courtney Goeltzenleuchter1d723102015-06-18 21:49:59 -06001138 .module = VK_NULL_HANDLE,
1139 .name = "main",
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001140 .codeSize = codeSize,
1141 .pCode = pCode,
1142 .flags = 0,
1143 };
1144 VkShader vs;
1145 err = vkCreateShader(m_device->device(), &vs_ci, &vs);
1146
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001147 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1148 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1149 .pNext = NULL,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001150 .stage = VK_SHADER_STAGE_VERTEX,
1151 .shader = vs,
1152 .linkConstBufferCount = 0,
1153 .pLinkConstBufferInfo = NULL,
1154 .pSpecializationInfo = NULL,
1155 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001156 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001157 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1158 .pNext = NULL,
1159 .stageCount = 1,
1160 .pStages = &pipe_vs_ci,
1161 .pVertexInputState = NULL,
1162 .pIaState = NULL,
1163 .pTessState = NULL,
1164 .pVpState = NULL,
1165 .pRsState = NULL,
1166 .pMsState = NULL,
1167 .pDsState = NULL,
1168 .pCbState = NULL,
1169 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1170 .layout = pipeline_layout,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001171 };
1172
1173 VkPipeline pipeline;
1174 err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
1175 ASSERT_VK_SUCCESS(err);
1176
1177 err= cmdBuffer.BeginCommandBuffer();
1178 ASSERT_VK_SUCCESS(err);
1179 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1180 // Should error before calling to driver so don't care about actual data
1181 vkCmdBindVertexBuffers(cmdBuffer.GetBufferHandle(), 0, 1, NULL, NULL);
1182
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001183 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlise4076782015-06-24 15:53:07 -06001184 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after vkCmdBindVertexBuffers() w/o active RenderPass.";
1185 if (!strstr(msgString.c_str(),"Incorrect call to vkCmdBindVertexBuffers() without an active RenderPass.")) {
1186 FAIL() << "Error received was not 'Incorrect call to vkCmdBindVertexBuffers() without an active RenderPass.'";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001187 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001188}
1189
1190TEST_F(VkLayerTest, DSTypeMismatch)
1191{
1192 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001193 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001194 std::string msgString;
1195 VkResult err;
1196
1197 ASSERT_NO_FATAL_FAILURE(InitState());
1198 m_errorMonitor->ClearState();
1199 //VkDescriptorSetObj descriptorSet(m_device);
1200 const VkDescriptorTypeCount ds_type_count = {
1201 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1202 .count = 1,
1203 };
1204 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1205 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1206 .pNext = NULL,
1207 .count = 1,
1208 .pTypeCount = &ds_type_count,
1209 };
1210 VkDescriptorPool ds_pool;
1211 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1212 ASSERT_VK_SUCCESS(err);
1213 const VkDescriptorSetLayoutBinding dsl_binding = {
1214 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001215 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001216 .stageFlags = VK_SHADER_STAGE_ALL,
1217 .pImmutableSamplers = NULL,
1218 };
1219
1220 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1221 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1222 .pNext = NULL,
1223 .count = 1,
1224 .pBinding = &dsl_binding,
1225 };
1226 VkDescriptorSetLayout ds_layout;
1227 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1228 ASSERT_VK_SUCCESS(err);
1229
1230 VkDescriptorSet descriptorSet;
1231 uint32_t ds_count = 0;
1232 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1233 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001234
1235 const VkSamplerCreateInfo sampler_ci = {
1236 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1237 .pNext = NULL,
1238 .magFilter = VK_TEX_FILTER_NEAREST,
1239 .minFilter = VK_TEX_FILTER_NEAREST,
1240 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1241 .addressU = VK_TEX_ADDRESS_CLAMP,
1242 .addressV = VK_TEX_ADDRESS_CLAMP,
1243 .addressW = VK_TEX_ADDRESS_CLAMP,
1244 .mipLodBias = 1.0,
1245 .maxAnisotropy = 1,
1246 .compareOp = VK_COMPARE_OP_NEVER,
1247 .minLod = 1.0,
1248 .maxLod = 1.0,
1249 .borderColor = VK_BORDER_COLOR_OPAQUE_WHITE,
1250 };
1251 VkSampler sampler;
1252 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1253 ASSERT_VK_SUCCESS(err);
1254
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001255 VkDescriptorInfo descriptor_info;
1256 memset(&descriptor_info, 0, sizeof(descriptor_info));
1257 descriptor_info.sampler = sampler;
1258
1259 VkWriteDescriptorSet descriptor_write;
1260 memset(&descriptor_write, 0, sizeof(descriptor_write));
1261 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1262 descriptor_write.destSet = descriptorSet;
1263 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001264 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001265 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1266 descriptor_write.pDescriptors = &descriptor_info;
1267
1268 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1269
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001270 msgFlags = m_errorMonitor->GetState(&msgString);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001271 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 +08001272 if (!strstr(msgString.c_str(),"Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET does not match ")) {
1273 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 -06001274 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001275}
1276
1277TEST_F(VkLayerTest, DSUpdateOutOfBounds)
1278{
1279 // For overlapping Update, have arrayIndex exceed that of layout
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001280 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001281 std::string msgString;
1282 VkResult err;
1283
1284 ASSERT_NO_FATAL_FAILURE(InitState());
1285 m_errorMonitor->ClearState();
1286 //VkDescriptorSetObj descriptorSet(m_device);
1287 const VkDescriptorTypeCount ds_type_count = {
1288 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1289 .count = 1,
1290 };
1291 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1292 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1293 .pNext = NULL,
1294 .count = 1,
1295 .pTypeCount = &ds_type_count,
1296 };
1297 VkDescriptorPool ds_pool;
1298 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1299 ASSERT_VK_SUCCESS(err);
1300 const VkDescriptorSetLayoutBinding dsl_binding = {
1301 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001302 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001303 .stageFlags = VK_SHADER_STAGE_ALL,
1304 .pImmutableSamplers = NULL,
1305 };
1306
1307 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1308 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1309 .pNext = NULL,
1310 .count = 1,
1311 .pBinding = &dsl_binding,
1312 };
1313 VkDescriptorSetLayout ds_layout;
1314 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1315 ASSERT_VK_SUCCESS(err);
1316
1317 VkDescriptorSet descriptorSet;
1318 uint32_t ds_count = 0;
1319 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1320 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001321
1322 const VkSamplerCreateInfo sampler_ci = {
1323 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1324 .pNext = NULL,
1325 .magFilter = VK_TEX_FILTER_NEAREST,
1326 .minFilter = VK_TEX_FILTER_NEAREST,
1327 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1328 .addressU = VK_TEX_ADDRESS_CLAMP,
1329 .addressV = VK_TEX_ADDRESS_CLAMP,
1330 .addressW = VK_TEX_ADDRESS_CLAMP,
1331 .mipLodBias = 1.0,
1332 .maxAnisotropy = 1,
1333 .compareOp = VK_COMPARE_OP_NEVER,
1334 .minLod = 1.0,
1335 .maxLod = 1.0,
1336 .borderColor = VK_BORDER_COLOR_OPAQUE_WHITE,
1337 };
1338 VkSampler sampler;
1339 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1340 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001341
1342 VkDescriptorInfo descriptor_info;
1343 memset(&descriptor_info, 0, sizeof(descriptor_info));
1344 descriptor_info.sampler = sampler;
1345
1346 VkWriteDescriptorSet descriptor_write;
1347 memset(&descriptor_write, 0, sizeof(descriptor_write));
1348 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1349 descriptor_write.destSet = descriptorSet;
1350 descriptor_write.destArrayElement = 1; /* This index out of bounds for the update */
1351 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001352 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001353 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1354 descriptor_write.pDescriptors = &descriptor_info;
1355
1356 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1357
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001358 msgFlags = m_errorMonitor->GetState(&msgString);
1359 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 +08001360 if (!strstr(msgString.c_str(),"Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET is out of bounds for matching binding")) {
1361 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 -06001362 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001363}
1364
1365TEST_F(VkLayerTest, InvalidDSUpdateIndex)
1366{
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001367 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001368 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001369 std::string msgString;
1370 VkResult err;
1371
1372 ASSERT_NO_FATAL_FAILURE(InitState());
1373 m_errorMonitor->ClearState();
1374 //VkDescriptorSetObj descriptorSet(m_device);
1375 const VkDescriptorTypeCount ds_type_count = {
1376 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1377 .count = 1,
1378 };
1379 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1380 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1381 .pNext = NULL,
1382 .count = 1,
1383 .pTypeCount = &ds_type_count,
1384 };
1385 VkDescriptorPool ds_pool;
1386 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1387 ASSERT_VK_SUCCESS(err);
1388 const VkDescriptorSetLayoutBinding dsl_binding = {
1389 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001390 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001391 .stageFlags = VK_SHADER_STAGE_ALL,
1392 .pImmutableSamplers = NULL,
1393 };
1394
1395 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1396 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1397 .pNext = NULL,
1398 .count = 1,
1399 .pBinding = &dsl_binding,
1400 };
1401 VkDescriptorSetLayout ds_layout;
1402 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1403 ASSERT_VK_SUCCESS(err);
1404
1405 VkDescriptorSet descriptorSet;
1406 uint32_t ds_count = 0;
1407 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1408 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001409
1410 const VkSamplerCreateInfo sampler_ci = {
1411 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1412 .pNext = NULL,
1413 .magFilter = VK_TEX_FILTER_NEAREST,
1414 .minFilter = VK_TEX_FILTER_NEAREST,
1415 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1416 .addressU = VK_TEX_ADDRESS_CLAMP,
1417 .addressV = VK_TEX_ADDRESS_CLAMP,
1418 .addressW = VK_TEX_ADDRESS_CLAMP,
1419 .mipLodBias = 1.0,
1420 .maxAnisotropy = 1,
1421 .compareOp = VK_COMPARE_OP_NEVER,
1422 .minLod = 1.0,
1423 .maxLod = 1.0,
1424 .borderColor = VK_BORDER_COLOR_OPAQUE_WHITE,
1425 };
1426 VkSampler sampler;
1427 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1428 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001429
1430 VkDescriptorInfo descriptor_info;
1431 memset(&descriptor_info, 0, sizeof(descriptor_info));
1432 descriptor_info.sampler = sampler;
1433
1434 VkWriteDescriptorSet descriptor_write;
1435 memset(&descriptor_write, 0, sizeof(descriptor_write));
1436 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1437 descriptor_write.destSet = descriptorSet;
1438 descriptor_write.destBinding = 2;
1439 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001440 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001441 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1442 descriptor_write.pDescriptors = &descriptor_info;
1443
1444 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1445
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001446 msgFlags = m_errorMonitor->GetState(&msgString);
1447 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 -06001448 if (!strstr(msgString.c_str()," does not have binding to match update binding ")) {
1449 FAIL() << "Error received was not 'Descriptor Set <blah> does not have binding to match update binding '";
1450 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001451}
1452
1453TEST_F(VkLayerTest, InvalidDSUpdateStruct)
1454{
1455 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_* types
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001456 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001457 std::string msgString;
1458 VkResult err;
1459
1460 ASSERT_NO_FATAL_FAILURE(InitState());
1461 m_errorMonitor->ClearState();
1462 //VkDescriptorSetObj descriptorSet(m_device);
1463 const VkDescriptorTypeCount ds_type_count = {
1464 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1465 .count = 1,
1466 };
1467 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1468 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1469 .pNext = NULL,
1470 .count = 1,
1471 .pTypeCount = &ds_type_count,
1472 };
1473 VkDescriptorPool ds_pool;
1474 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1475 ASSERT_VK_SUCCESS(err);
1476 const VkDescriptorSetLayoutBinding dsl_binding = {
1477 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001478 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001479 .stageFlags = VK_SHADER_STAGE_ALL,
1480 .pImmutableSamplers = NULL,
1481 };
1482
1483 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1484 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1485 .pNext = NULL,
1486 .count = 1,
1487 .pBinding = &dsl_binding,
1488 };
1489 VkDescriptorSetLayout ds_layout;
1490 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1491 ASSERT_VK_SUCCESS(err);
1492
1493 VkDescriptorSet descriptorSet;
1494 uint32_t ds_count = 0;
1495 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1496 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001497
1498 const VkSamplerCreateInfo sampler_ci = {
1499 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1500 .pNext = NULL,
1501 .magFilter = VK_TEX_FILTER_NEAREST,
1502 .minFilter = VK_TEX_FILTER_NEAREST,
1503 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1504 .addressU = VK_TEX_ADDRESS_CLAMP,
1505 .addressV = VK_TEX_ADDRESS_CLAMP,
1506 .addressW = VK_TEX_ADDRESS_CLAMP,
1507 .mipLodBias = 1.0,
1508 .maxAnisotropy = 1,
1509 .compareOp = VK_COMPARE_OP_NEVER,
1510 .minLod = 1.0,
1511 .maxLod = 1.0,
1512 .borderColor = VK_BORDER_COLOR_OPAQUE_WHITE,
1513 };
1514 VkSampler sampler;
1515 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1516 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001517
1518
1519 VkDescriptorInfo descriptor_info;
1520 memset(&descriptor_info, 0, sizeof(descriptor_info));
1521 descriptor_info.sampler = sampler;
1522
1523 VkWriteDescriptorSet descriptor_write;
1524 memset(&descriptor_write, 0, sizeof(descriptor_write));
1525 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
1526 descriptor_write.destSet = descriptorSet;
1527 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001528 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001529 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1530 descriptor_write.pDescriptors = &descriptor_info;
1531
1532 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1533
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001534 msgFlags = m_errorMonitor->GetState(&msgString);
1535 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 -06001536 if (!strstr(msgString.c_str(),"Unexpected UPDATE struct of type ")) {
1537 FAIL() << "Error received was not 'Unexpected UPDATE struct of type '";
1538 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001539}
1540
1541TEST_F(VkLayerTest, NumSamplesMismatch)
1542{
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001543 // Create CmdBuffer where MSAA samples doesn't match RenderPass sampleCount
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001544 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001545 std::string msgString;
1546 VkResult err;
1547
1548 ASSERT_NO_FATAL_FAILURE(InitState());
1549 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1550 m_errorMonitor->ClearState();
1551 VkCommandBufferObj cmdBuffer(m_device);
1552 const VkDescriptorTypeCount ds_type_count = {
1553 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1554 .count = 1,
1555 };
1556 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1557 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1558 .pNext = NULL,
1559 .count = 1,
1560 .pTypeCount = &ds_type_count,
1561 };
1562 VkDescriptorPool ds_pool;
1563 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1564 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001565
1566 const VkDescriptorSetLayoutBinding dsl_binding = {
1567 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001568 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001569 .stageFlags = VK_SHADER_STAGE_ALL,
1570 .pImmutableSamplers = NULL,
1571 };
1572
1573 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1574 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1575 .pNext = NULL,
1576 .count = 1,
1577 .pBinding = &dsl_binding,
1578 };
1579 VkDescriptorSetLayout ds_layout;
1580 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1581 ASSERT_VK_SUCCESS(err);
1582
1583 VkDescriptorSet descriptorSet;
1584 uint32_t ds_count = 0;
1585 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1586 ASSERT_VK_SUCCESS(err);
1587
1588 const VkPipelineMsStateCreateInfo pipe_ms_state_ci = {
1589 .sType = VK_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO,
1590 .pNext = NULL,
Tony Barboure094edf2015-06-26 10:18:34 -06001591 .rasterSamples = 4,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001592 .multisampleEnable = 1,
1593 .sampleShadingEnable = 0,
1594 .minSampleShading = 1.0,
1595 .sampleMask = 15,
1596 };
1597
1598 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1599 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1600 .pNext = NULL,
1601 .descriptorSetCount = 1,
1602 .pSetLayouts = &ds_layout,
1603 };
1604
1605 VkPipelineLayout pipeline_layout;
1606 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1607 ASSERT_VK_SUCCESS(err);
1608
1609 size_t shader_len = strlen(bindStateVertShaderText);
1610 size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
1611 void* pCode = malloc(codeSize);
1612
1613 /* try version 0 first: VkShaderStage followed by GLSL */
1614 ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
1615 ((uint32_t *) pCode)[1] = 0;
1616 ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
1617 memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
1618
1619 const VkShaderCreateInfo vs_ci = {
1620 .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
1621 .pNext = NULL,
Courtney Goeltzenleuchter1d723102015-06-18 21:49:59 -06001622 .module = VK_NULL_HANDLE,
1623 .name = "main",
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001624 .codeSize = codeSize,
1625 .pCode = pCode,
1626 .flags = 0,
1627 };
1628 VkShader vs;
1629 err = vkCreateShader(m_device->device(), &vs_ci, &vs);
1630 ASSERT_VK_SUCCESS(err);
1631
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001632 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1633 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1634 .pNext = NULL,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001635 .stage = VK_SHADER_STAGE_VERTEX,
1636 .shader = vs,
1637 .linkConstBufferCount = 0,
1638 .pLinkConstBufferInfo = NULL,
1639 .pSpecializationInfo = NULL,
1640 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001641 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001642 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1643 .pNext = NULL,
1644 .stageCount = 1,
1645 .pStages = &pipe_vs_ci,
1646 .pVertexInputState = NULL,
1647 .pIaState = NULL,
1648 .pTessState = NULL,
1649 .pVpState = NULL,
1650 .pRsState = NULL,
1651 .pMsState = &pipe_ms_state_ci,
1652 .pDsState = NULL,
1653 .pCbState = NULL,
1654 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1655 .layout = pipeline_layout,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001656 };
1657
1658 VkPipeline pipeline;
1659 err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
1660 ASSERT_VK_SUCCESS(err);
1661
1662 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1663 BeginCommandBuffer(cmdBuffer);
1664 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1665
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001666 msgFlags = m_errorMonitor->GetState(&msgString);
1667 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 -06001668 if (!strstr(msgString.c_str(),"Num samples mismatch! ")) {
1669 FAIL() << "Error received was not 'Num samples mismatch!...'";
1670 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001671}
Tobin Ehlise4076782015-06-24 15:53:07 -06001672TEST_F(VkLayerTest, PipelineNotBound)
1673{
1674 VkFlags msgFlags;
1675 std::string msgString;
1676 VkResult err;
1677
1678 ASSERT_NO_FATAL_FAILURE(InitState());
1679 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1680 m_errorMonitor->ClearState();
1681 VkCommandBufferObj cmdBuffer(m_device);
1682 const VkDescriptorTypeCount ds_type_count = {
1683 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1684 .count = 1,
1685 };
1686 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1687 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1688 .pNext = NULL,
1689 .count = 1,
1690 .pTypeCount = &ds_type_count,
1691 };
1692 VkDescriptorPool ds_pool;
1693 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1694 ASSERT_VK_SUCCESS(err);
1695
1696 const VkDescriptorSetLayoutBinding dsl_binding = {
1697 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1698 .arraySize = 1,
1699 .stageFlags = VK_SHADER_STAGE_ALL,
1700 .pImmutableSamplers = NULL,
1701 };
1702
1703 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1704 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1705 .pNext = NULL,
1706 .count = 1,
1707 .pBinding = &dsl_binding,
1708 };
1709 VkDescriptorSetLayout ds_layout;
1710 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1711 ASSERT_VK_SUCCESS(err);
1712
1713 VkDescriptorSet descriptorSet;
1714 uint32_t ds_count = 0;
1715 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1716 ASSERT_VK_SUCCESS(err);
1717
1718 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1719 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1720 .pNext = NULL,
1721 .descriptorSetCount = 1,
1722 .pSetLayouts = &ds_layout,
1723 };
1724
1725 VkPipelineLayout pipeline_layout;
1726 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1727 ASSERT_VK_SUCCESS(err);
1728
1729 size_t shader_len = strlen(bindStateVertShaderText);
1730 size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
1731 void* pCode = malloc(codeSize);
1732
1733 /* try version 0 first: VkShaderStage followed by GLSL */
1734 ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
1735 ((uint32_t *) pCode)[1] = 0;
1736 ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
1737 memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
1738
1739 const VkShaderCreateInfo vs_ci = {
1740 .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
1741 .pNext = NULL,
1742 .module = VK_NULL_HANDLE,
1743 .name = "main",
1744 .codeSize = codeSize,
1745 .pCode = pCode,
1746 .flags = 0,
1747 };
1748 VkShader vs;
1749 err = vkCreateShader(m_device->device(), &vs_ci, &vs);
1750 ASSERT_VK_SUCCESS(err);
1751
1752 VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
1753 //err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
1754 ASSERT_VK_SUCCESS(err);
1755
1756 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1757 BeginCommandBuffer(cmdBuffer);
1758 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
1759
1760 msgFlags = m_errorMonitor->GetState(&msgString);
1761 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding invalid pipeline to CmdBuffer";
1762 if (!strstr(msgString.c_str(),"Attempt to bind Pipeline ")) {
1763 FAIL() << "Error received was not 'Attempt to bind Pipeline 0xbaadb1be that doesn't exist!'";
1764 }
1765}
1766TEST_F(VkLayerTest, VtxBufferBadIndex)
1767{
1768 // Create CmdBuffer where MSAA samples doesn't match RenderPass sampleCount
1769 VkFlags msgFlags;
1770 std::string msgString;
1771 VkResult err;
1772
1773 ASSERT_NO_FATAL_FAILURE(InitState());
1774 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1775 m_errorMonitor->ClearState();
1776 VkCommandBufferObj cmdBuffer(m_device);
1777 const VkDescriptorTypeCount ds_type_count = {
1778 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1779 .count = 1,
1780 };
1781 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1782 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1783 .pNext = NULL,
1784 .count = 1,
1785 .pTypeCount = &ds_type_count,
1786 };
1787 VkDescriptorPool ds_pool;
1788 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1789 ASSERT_VK_SUCCESS(err);
1790
1791 const VkDescriptorSetLayoutBinding dsl_binding = {
1792 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1793 .arraySize = 1,
1794 .stageFlags = VK_SHADER_STAGE_ALL,
1795 .pImmutableSamplers = NULL,
1796 };
1797
1798 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1799 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1800 .pNext = NULL,
1801 .count = 1,
1802 .pBinding = &dsl_binding,
1803 };
1804 VkDescriptorSetLayout ds_layout;
1805 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1806 ASSERT_VK_SUCCESS(err);
1807
1808 VkDescriptorSet descriptorSet;
1809 uint32_t ds_count = 0;
1810 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1811 ASSERT_VK_SUCCESS(err);
1812
1813 const VkPipelineMsStateCreateInfo pipe_ms_state_ci = {
1814 .sType = VK_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO,
1815 .pNext = NULL,
Tony Barboure094edf2015-06-26 10:18:34 -06001816 .rasterSamples = 1,
Tobin Ehlise4076782015-06-24 15:53:07 -06001817 .multisampleEnable = 1,
1818 .sampleShadingEnable = 0,
1819 .minSampleShading = 1.0,
1820 .sampleMask = 15,
1821 };
1822
1823 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1824 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1825 .pNext = NULL,
1826 .descriptorSetCount = 1,
1827 .pSetLayouts = &ds_layout,
1828 };
1829
1830 VkPipelineLayout pipeline_layout;
1831 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1832 ASSERT_VK_SUCCESS(err);
1833
1834 size_t shader_len = strlen(bindStateVertShaderText);
1835 size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
1836 void* pCode = malloc(codeSize);
1837
1838 /* try version 0 first: VkShaderStage followed by GLSL */
1839 ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
1840 ((uint32_t *) pCode)[1] = 0;
1841 ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
1842 memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
1843
1844 const VkShaderCreateInfo vs_ci = {
1845 .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
1846 .pNext = NULL,
1847 .module = VK_NULL_HANDLE,
1848 .name = "main",
1849 .codeSize = codeSize,
1850 .pCode = pCode,
1851 .flags = 0,
1852 };
1853 VkShader vs;
1854 err = vkCreateShader(m_device->device(), &vs_ci, &vs);
1855 ASSERT_VK_SUCCESS(err);
1856
1857 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1858 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1859 .pNext = NULL,
1860 .stage = VK_SHADER_STAGE_VERTEX,
1861 .shader = vs,
1862 .linkConstBufferCount = 0,
1863 .pLinkConstBufferInfo = NULL,
1864 .pSpecializationInfo = NULL,
1865 };
1866 const VkGraphicsPipelineCreateInfo gp_ci = {
1867 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1868 .pNext = NULL,
1869 .stageCount = 1,
1870 .pStages = &pipe_vs_ci,
1871 .pVertexInputState = NULL,
1872 .pIaState = NULL,
1873 .pTessState = NULL,
1874 .pVpState = NULL,
1875 .pRsState = NULL,
1876 .pMsState = &pipe_ms_state_ci,
1877 .pDsState = NULL,
1878 .pCbState = NULL,
1879 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1880 .layout = pipeline_layout,
1881 };
1882
1883 VkPipeline pipeline;
1884 err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
1885 ASSERT_VK_SUCCESS(err);
1886
1887 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1888 BeginCommandBuffer(cmdBuffer);
1889 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1890 // Should error before calling to driver so don't care about actual data
1891 vkCmdBindVertexBuffers(cmdBuffer.GetBufferHandle(), 0, 1, NULL, NULL);
1892
1893 msgFlags = m_errorMonitor->GetState(&msgString);
1894 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding Vtx Buffer w/o VBO attached to PSO.";
1895 if (!strstr(msgString.c_str(),"Vtx Buffer Index 0 was bound, but no vtx buffers are attached to PSO.")) {
1896 FAIL() << "Error received was not 'Vtx Buffer Index 0 was bound, but no vtx buffers are attached to PSO.'";
1897 }
1898}
Tobin Ehlis57e6a612015-05-26 16:11:58 -06001899#endif
1900#if THREADING_TESTS
Mike Stroyan09aae812015-05-12 16:00:45 -06001901#if GTEST_IS_THREADSAFE
1902struct thread_data_struct {
1903 VkCmdBuffer cmdBuffer;
1904 VkEvent event;
1905 bool bailout;
1906};
1907
1908extern "C" void *AddToCommandBuffer(void *arg)
1909{
1910 struct thread_data_struct *data = (struct thread_data_struct *) arg;
1911 std::string msgString;
1912
1913 for (int i = 0; i<10000; i++) {
1914 vkCmdSetEvent(data->cmdBuffer, data->event, VK_PIPE_EVENT_COMMANDS_COMPLETE);
1915 if (data->bailout) {
1916 break;
1917 }
1918 }
1919 return NULL;
1920}
1921
1922TEST_F(VkLayerTest, ThreadCmdBufferCollision)
1923{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001924 VkFlags msgFlags;
Mike Stroyan09aae812015-05-12 16:00:45 -06001925 std::string msgString;
1926 pthread_t thread;
1927 pthread_attr_t thread_attr;
1928
1929 ASSERT_NO_FATAL_FAILURE(InitState());
1930 ASSERT_NO_FATAL_FAILURE(InitViewport());
1931 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1932
1933 VkCommandBufferObj cmdBuffer(m_device);
1934
1935 m_errorMonitor->ClearState();
1936 pthread_attr_init(&thread_attr);
1937 BeginCommandBuffer(cmdBuffer);
1938
1939 VkEventCreateInfo event_info;
1940 VkEvent event;
1941 VkMemoryRequirements mem_req;
Mike Stroyan09aae812015-05-12 16:00:45 -06001942 VkResult err;
1943
1944 memset(&event_info, 0, sizeof(event_info));
1945 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
1946
1947 err = vkCreateEvent(device(), &event_info, &event);
1948 ASSERT_VK_SUCCESS(err);
1949
Tony Barbour426b9052015-06-24 16:06:58 -06001950 err = vkGetObjectMemoryRequirements(device(), VK_OBJECT_TYPE_EVENT, event, &mem_req);
Mike Stroyan09aae812015-05-12 16:00:45 -06001951 ASSERT_VK_SUCCESS(err);
1952
1953 VkMemoryAllocInfo mem_info;
1954 VkDeviceMemory event_mem;
1955
Mike Stroyan09aae812015-05-12 16:00:45 -06001956 memset(&mem_info, 0, sizeof(mem_info));
1957 mem_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
1958 mem_info.allocationSize = mem_req.size;
Courtney Goeltzenleuchterb25c9b92015-06-18 17:01:41 -06001959 mem_info.memProps = 0;
Mike Stroyan09aae812015-05-12 16:00:45 -06001960 err = vkAllocMemory(device(), &mem_info, &event_mem);
1961 ASSERT_VK_SUCCESS(err);
1962
Mark Lobodzinski23182612015-05-29 09:32:35 -05001963 err = vkBindObjectMemory(device(), VK_OBJECT_TYPE_EVENT, event, event_mem, 0);
Mike Stroyan09aae812015-05-12 16:00:45 -06001964 ASSERT_VK_SUCCESS(err);
1965
1966 err = vkResetEvent(device(), event);
1967 ASSERT_VK_SUCCESS(err);
1968
1969 struct thread_data_struct data;
1970 data.cmdBuffer = cmdBuffer.obj();
1971 data.event = event;
1972 data.bailout = false;
1973 m_errorMonitor->SetBailout(&data.bailout);
1974 // Add many entries to command buffer from another thread.
1975 pthread_create(&thread, &thread_attr, AddToCommandBuffer, (void *)&data);
1976 // Add many entries to command buffer from this thread at the same time.
1977 AddToCommandBuffer(&data);
1978 pthread_join(thread, NULL);
1979 EndCommandBuffer(cmdBuffer);
1980
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001981 msgFlags = m_errorMonitor->GetState(&msgString);
Mike Stroyaned254572015-06-17 16:32:06 -06001982 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 -06001983 if (!strstr(msgString.c_str(),"THREADING ERROR")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -05001984 FAIL() << "Error received was not 'THREADING ERROR'";
Mike Stroyan09aae812015-05-12 16:00:45 -06001985 }
1986
1987}
1988#endif
Tobin Ehlis57e6a612015-05-26 16:11:58 -06001989#endif
Chris Forbes5af3bf22015-05-25 11:13:08 +12001990
1991#if SHADER_CHECKER_TESTS
1992TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed)
1993{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001994 VkFlags msgFlags;
Chris Forbes5af3bf22015-05-25 11:13:08 +12001995 std::string msgString;
1996 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06001997 ScopedUseGlsl useGlsl(false);
Chris Forbes5af3bf22015-05-25 11:13:08 +12001998
1999 char const *vsSource =
2000 "#version 140\n"
2001 "#extension GL_ARB_separate_shader_objects: require\n"
2002 "#extension GL_ARB_shading_language_420pack: require\n"
2003 "\n"
2004 "layout(location=0) out float x;\n"
2005 "void main(){\n"
2006 " gl_Position = vec4(1);\n"
2007 " x = 0;\n"
2008 "}\n";
2009 char const *fsSource =
2010 "#version 140\n"
2011 "#extension GL_ARB_separate_shader_objects: require\n"
2012 "#extension GL_ARB_shading_language_420pack: require\n"
2013 "\n"
2014 "layout(location=0) out vec4 color;\n"
2015 "void main(){\n"
2016 " color = vec4(1);\n"
2017 "}\n";
2018
2019 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2020 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2021
2022 VkPipelineObj pipe(m_device);
2023 pipe.AddShader(&vs);
2024 pipe.AddShader(&fs);
2025
2026 VkCommandBufferObj dummyCmd(m_device);
2027 VkDescriptorSetObj descriptorSet(m_device);
2028 descriptorSet.AppendDummy();
2029 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2030
2031 m_errorMonitor->ClearState();
2032 pipe.CreateVKPipeline(descriptorSet);
2033
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002034 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes5af3bf22015-05-25 11:13:08 +12002035
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002036 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes5af3bf22015-05-25 11:13:08 +12002037 if (!strstr(msgString.c_str(),"not consumed by fragment shader")) {
2038 FAIL() << "Incorrect warning: " << msgString;
2039 }
2040}
Chris Forbes5af3bf22015-05-25 11:13:08 +12002041
Chris Forbes3c10b852015-05-25 11:13:13 +12002042TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided)
2043{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002044 VkFlags msgFlags;
Chris Forbes3c10b852015-05-25 11:13:13 +12002045 std::string msgString;
2046 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002047 ScopedUseGlsl useGlsl(false);
Chris Forbes3c10b852015-05-25 11:13:13 +12002048
2049 char const *vsSource =
2050 "#version 140\n"
2051 "#extension GL_ARB_separate_shader_objects: require\n"
2052 "#extension GL_ARB_shading_language_420pack: require\n"
2053 "\n"
2054 "void main(){\n"
2055 " gl_Position = vec4(1);\n"
2056 "}\n";
2057 char const *fsSource =
2058 "#version 140\n"
2059 "#extension GL_ARB_separate_shader_objects: require\n"
2060 "#extension GL_ARB_shading_language_420pack: require\n"
2061 "\n"
2062 "layout(location=0) in float x;\n"
2063 "layout(location=0) out vec4 color;\n"
2064 "void main(){\n"
2065 " color = vec4(x);\n"
2066 "}\n";
2067
2068 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2069 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2070
2071 VkPipelineObj pipe(m_device);
2072 pipe.AddShader(&vs);
2073 pipe.AddShader(&fs);
2074
2075 VkCommandBufferObj dummyCmd(m_device);
2076 VkDescriptorSetObj descriptorSet(m_device);
2077 descriptorSet.AppendDummy();
2078 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2079
2080 m_errorMonitor->ClearState();
2081 pipe.CreateVKPipeline(descriptorSet);
2082
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002083 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes3c10b852015-05-25 11:13:13 +12002084
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002085 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes3c10b852015-05-25 11:13:13 +12002086 if (!strstr(msgString.c_str(),"not written by vertex shader")) {
2087 FAIL() << "Incorrect error: " << msgString;
2088 }
2089}
2090
Chris Forbescc281692015-05-25 11:13:17 +12002091TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch)
2092{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002093 VkFlags msgFlags;
Chris Forbescc281692015-05-25 11:13:17 +12002094 std::string msgString;
2095 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002096 ScopedUseGlsl useGlsl(false);
Chris Forbescc281692015-05-25 11:13:17 +12002097
2098 char const *vsSource =
2099 "#version 140\n"
2100 "#extension GL_ARB_separate_shader_objects: require\n"
2101 "#extension GL_ARB_shading_language_420pack: require\n"
2102 "\n"
2103 "layout(location=0) out int x;\n"
2104 "void main(){\n"
2105 " x = 0;\n"
2106 " gl_Position = vec4(1);\n"
2107 "}\n";
2108 char const *fsSource =
2109 "#version 140\n"
2110 "#extension GL_ARB_separate_shader_objects: require\n"
2111 "#extension GL_ARB_shading_language_420pack: require\n"
2112 "\n"
2113 "layout(location=0) in float x;\n" /* VS writes int */
2114 "layout(location=0) out vec4 color;\n"
2115 "void main(){\n"
2116 " color = vec4(x);\n"
2117 "}\n";
2118
2119 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2120 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2121
2122 VkPipelineObj pipe(m_device);
2123 pipe.AddShader(&vs);
2124 pipe.AddShader(&fs);
2125
2126 VkCommandBufferObj dummyCmd(m_device);
2127 VkDescriptorSetObj descriptorSet(m_device);
2128 descriptorSet.AppendDummy();
2129 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2130
2131 m_errorMonitor->ClearState();
2132 pipe.CreateVKPipeline(descriptorSet);
2133
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002134 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbescc281692015-05-25 11:13:17 +12002135
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002136 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbescc281692015-05-25 11:13:17 +12002137 if (!strstr(msgString.c_str(),"Type mismatch on location 0")) {
2138 FAIL() << "Incorrect error: " << msgString;
2139 }
2140}
2141
Chris Forbes8291c052015-05-25 11:13:28 +12002142TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed)
2143{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002144 VkFlags msgFlags;
Chris Forbes8291c052015-05-25 11:13:28 +12002145 std::string msgString;
2146 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002147 ScopedUseGlsl useGlsl(false);
Chris Forbes8291c052015-05-25 11:13:28 +12002148
2149 VkVertexInputBindingDescription input_binding;
2150 memset(&input_binding, 0, sizeof(input_binding));
2151
2152 VkVertexInputAttributeDescription input_attrib;
2153 memset(&input_attrib, 0, sizeof(input_attrib));
2154 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2155
2156 char const *vsSource =
2157 "#version 140\n"
2158 "#extension GL_ARB_separate_shader_objects: require\n"
2159 "#extension GL_ARB_shading_language_420pack: require\n"
2160 "\n"
2161 "void main(){\n"
2162 " gl_Position = vec4(1);\n"
2163 "}\n";
2164 char const *fsSource =
2165 "#version 140\n"
2166 "#extension GL_ARB_separate_shader_objects: require\n"
2167 "#extension GL_ARB_shading_language_420pack: require\n"
2168 "\n"
2169 "layout(location=0) out vec4 color;\n"
2170 "void main(){\n"
2171 " color = vec4(1);\n"
2172 "}\n";
2173
2174 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2175 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2176
2177 VkPipelineObj pipe(m_device);
2178 pipe.AddShader(&vs);
2179 pipe.AddShader(&fs);
2180
2181 pipe.AddVertexInputBindings(&input_binding, 1);
2182 pipe.AddVertexInputAttribs(&input_attrib, 1);
2183
2184 VkCommandBufferObj dummyCmd(m_device);
2185 VkDescriptorSetObj descriptorSet(m_device);
2186 descriptorSet.AppendDummy();
2187 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2188
2189 m_errorMonitor->ClearState();
2190 pipe.CreateVKPipeline(descriptorSet);
2191
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002192 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes8291c052015-05-25 11:13:28 +12002193
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002194 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes8291c052015-05-25 11:13:28 +12002195 if (!strstr(msgString.c_str(),"location 0 not consumed by VS")) {
2196 FAIL() << "Incorrect warning: " << msgString;
2197 }
2198}
2199
Chris Forbes37367e62015-05-25 11:13:29 +12002200TEST_F(VkLayerTest, CreatePipelineAttribNotProvided)
2201{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002202 VkFlags msgFlags;
Chris Forbes37367e62015-05-25 11:13:29 +12002203 std::string msgString;
2204 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002205 ScopedUseGlsl useGlsl(false);
Chris Forbes37367e62015-05-25 11:13:29 +12002206
2207 char const *vsSource =
2208 "#version 140\n"
2209 "#extension GL_ARB_separate_shader_objects: require\n"
2210 "#extension GL_ARB_shading_language_420pack: require\n"
2211 "\n"
2212 "layout(location=0) in vec4 x;\n" /* not provided */
2213 "void main(){\n"
2214 " gl_Position = x;\n"
2215 "}\n";
2216 char const *fsSource =
2217 "#version 140\n"
2218 "#extension GL_ARB_separate_shader_objects: require\n"
2219 "#extension GL_ARB_shading_language_420pack: require\n"
2220 "\n"
2221 "layout(location=0) out vec4 color;\n"
2222 "void main(){\n"
2223 " color = vec4(1);\n"
2224 "}\n";
2225
2226 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2227 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2228
2229 VkPipelineObj pipe(m_device);
2230 pipe.AddShader(&vs);
2231 pipe.AddShader(&fs);
2232
2233 VkCommandBufferObj dummyCmd(m_device);
2234 VkDescriptorSetObj descriptorSet(m_device);
2235 descriptorSet.AppendDummy();
2236 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2237
2238 m_errorMonitor->ClearState();
2239 pipe.CreateVKPipeline(descriptorSet);
2240
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002241 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes37367e62015-05-25 11:13:29 +12002242
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002243 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes37367e62015-05-25 11:13:29 +12002244 if (!strstr(msgString.c_str(),"VS consumes input at location 0 but not provided")) {
2245 FAIL() << "Incorrect warning: " << msgString;
2246 }
2247}
2248
Chris Forbesa4b02322015-05-25 11:13:31 +12002249TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch)
2250{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002251 VkFlags msgFlags;
Chris Forbesa4b02322015-05-25 11:13:31 +12002252 std::string msgString;
2253 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002254 ScopedUseGlsl useGlsl(false);
Chris Forbesa4b02322015-05-25 11:13:31 +12002255
2256 VkVertexInputBindingDescription input_binding;
2257 memset(&input_binding, 0, sizeof(input_binding));
2258
2259 VkVertexInputAttributeDescription input_attrib;
2260 memset(&input_attrib, 0, sizeof(input_attrib));
2261 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2262
2263 char const *vsSource =
2264 "#version 140\n"
2265 "#extension GL_ARB_separate_shader_objects: require\n"
2266 "#extension GL_ARB_shading_language_420pack: require\n"
2267 "\n"
2268 "layout(location=0) in int x;\n" /* attrib provided float */
2269 "void main(){\n"
2270 " gl_Position = vec4(x);\n"
2271 "}\n";
2272 char const *fsSource =
2273 "#version 140\n"
2274 "#extension GL_ARB_separate_shader_objects: require\n"
2275 "#extension GL_ARB_shading_language_420pack: require\n"
2276 "\n"
2277 "layout(location=0) out vec4 color;\n"
2278 "void main(){\n"
2279 " color = vec4(1);\n"
2280 "}\n";
2281
2282 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2283 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2284
2285 VkPipelineObj pipe(m_device);
2286 pipe.AddShader(&vs);
2287 pipe.AddShader(&fs);
2288
2289 pipe.AddVertexInputBindings(&input_binding, 1);
2290 pipe.AddVertexInputAttribs(&input_attrib, 1);
2291
2292 VkCommandBufferObj dummyCmd(m_device);
2293 VkDescriptorSetObj descriptorSet(m_device);
2294 descriptorSet.AppendDummy();
2295 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2296
2297 m_errorMonitor->ClearState();
2298 pipe.CreateVKPipeline(descriptorSet);
2299
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002300 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbesa4b02322015-05-25 11:13:31 +12002301
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002302 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbesa4b02322015-05-25 11:13:31 +12002303 if (!strstr(msgString.c_str(),"location 0 does not match VS input type")) {
2304 FAIL() << "Incorrect error: " << msgString;
2305 }
2306}
2307
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002308TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict)
2309{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002310 VkFlags msgFlags;
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002311 std::string msgString;
2312 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002313 ScopedUseGlsl useGlsl(false);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002314
2315 /* Two binding descriptions for binding 0 */
2316 VkVertexInputBindingDescription input_bindings[2];
2317 memset(input_bindings, 0, sizeof(input_bindings));
2318
2319 VkVertexInputAttributeDescription input_attrib;
2320 memset(&input_attrib, 0, sizeof(input_attrib));
2321 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2322
2323 char const *vsSource =
2324 "#version 140\n"
2325 "#extension GL_ARB_separate_shader_objects: require\n"
2326 "#extension GL_ARB_shading_language_420pack: require\n"
2327 "\n"
2328 "layout(location=0) in float x;\n" /* attrib provided float */
2329 "void main(){\n"
2330 " gl_Position = vec4(x);\n"
2331 "}\n";
2332 char const *fsSource =
2333 "#version 140\n"
2334 "#extension GL_ARB_separate_shader_objects: require\n"
2335 "#extension GL_ARB_shading_language_420pack: require\n"
2336 "\n"
2337 "layout(location=0) out vec4 color;\n"
2338 "void main(){\n"
2339 " color = vec4(1);\n"
2340 "}\n";
2341
2342 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2343 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2344
2345 VkPipelineObj pipe(m_device);
2346 pipe.AddShader(&vs);
2347 pipe.AddShader(&fs);
2348
2349 pipe.AddVertexInputBindings(input_bindings, 2);
2350 pipe.AddVertexInputAttribs(&input_attrib, 1);
2351
2352 VkCommandBufferObj dummyCmd(m_device);
2353 VkDescriptorSetObj descriptorSet(m_device);
2354 descriptorSet.AppendDummy();
2355 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2356
2357 m_errorMonitor->ClearState();
2358 pipe.CreateVKPipeline(descriptorSet);
2359
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002360 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002361
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002362 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002363 if (!strstr(msgString.c_str(),"Duplicate vertex input binding descriptions for binding 0")) {
2364 FAIL() << "Incorrect error: " << msgString;
2365 }
2366}
Chris Forbes4c948702015-05-25 11:13:32 +12002367
Chris Forbesc12ef122015-05-25 11:13:40 +12002368/* TODO: would be nice to test the mixed broadcast & custom case, but the GLSL->SPV compiler
2369 * rejects it. */
2370
2371TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten)
2372{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002373 VkFlags msgFlags;
Chris Forbesc12ef122015-05-25 11:13:40 +12002374 std::string msgString;
2375 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002376 ScopedUseGlsl useGlsl(false);
Chris Forbesc12ef122015-05-25 11:13:40 +12002377
2378 char const *vsSource =
2379 "#version 140\n"
2380 "#extension GL_ARB_separate_shader_objects: require\n"
2381 "#extension GL_ARB_shading_language_420pack: require\n"
2382 "\n"
2383 "void main(){\n"
2384 " gl_Position = vec4(1);\n"
2385 "}\n";
2386 char const *fsSource =
2387 "#version 140\n"
2388 "#extension GL_ARB_separate_shader_objects: require\n"
2389 "#extension GL_ARB_shading_language_420pack: require\n"
2390 "\n"
2391 "void main(){\n"
2392 "}\n";
2393
2394 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2395 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2396
2397 VkPipelineObj pipe(m_device);
2398 pipe.AddShader(&vs);
2399 pipe.AddShader(&fs);
2400
2401 /* implicit CB 0 set up by the test framework, not written */
2402
2403 VkCommandBufferObj dummyCmd(m_device);
2404 VkDescriptorSetObj descriptorSet(m_device);
2405 descriptorSet.AppendDummy();
2406 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2407
2408 m_errorMonitor->ClearState();
2409 pipe.CreateVKPipeline(descriptorSet);
2410
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002411 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbesc12ef122015-05-25 11:13:40 +12002412
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002413 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbesc12ef122015-05-25 11:13:40 +12002414 if (!strstr(msgString.c_str(),"Attachment 0 not written by FS")) {
2415 FAIL() << "Incorrect error: " << msgString;
2416 }
2417}
2418
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002419TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed)
2420{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002421 VkFlags msgFlags;
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002422 std::string msgString;
2423 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002424 ScopedUseGlsl useGlsl(false);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002425
2426 char const *vsSource =
2427 "#version 140\n"
2428 "#extension GL_ARB_separate_shader_objects: require\n"
2429 "#extension GL_ARB_shading_language_420pack: require\n"
2430 "\n"
2431 "void main(){\n"
2432 " gl_Position = vec4(1);\n"
2433 "}\n";
2434 char const *fsSource =
2435 "#version 140\n"
2436 "#extension GL_ARB_separate_shader_objects: require\n"
2437 "#extension GL_ARB_shading_language_420pack: require\n"
2438 "\n"
2439 "layout(location=0) out vec4 x;\n"
2440 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
2441 "void main(){\n"
2442 " x = vec4(1);\n"
2443 " y = vec4(1);\n"
2444 "}\n";
2445
2446 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2447 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2448
2449 VkPipelineObj pipe(m_device);
2450 pipe.AddShader(&vs);
2451 pipe.AddShader(&fs);
2452
2453 /* implicit CB 0 set up by the test framework */
2454 /* FS writes CB 1, but we don't configure it */
2455
2456 VkCommandBufferObj dummyCmd(m_device);
2457 VkDescriptorSetObj descriptorSet(m_device);
2458 descriptorSet.AppendDummy();
2459 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2460
2461 m_errorMonitor->ClearState();
2462 pipe.CreateVKPipeline(descriptorSet);
2463
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002464 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002465
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002466 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002467 if (!strstr(msgString.c_str(),"FS writes to output location 1 with no matching attachment")) {
2468 FAIL() << "Incorrect warning: " << msgString;
2469 }
2470}
2471
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002472TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch)
2473{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002474 VkFlags msgFlags;
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002475 std::string msgString;
2476 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002477 ScopedUseGlsl useGlsl(false);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002478
2479 char const *vsSource =
2480 "#version 140\n"
2481 "#extension GL_ARB_separate_shader_objects: require\n"
2482 "#extension GL_ARB_shading_language_420pack: require\n"
2483 "\n"
2484 "void main(){\n"
2485 " gl_Position = vec4(1);\n"
2486 "}\n";
2487 char const *fsSource =
2488 "#version 140\n"
2489 "#extension GL_ARB_separate_shader_objects: require\n"
2490 "#extension GL_ARB_shading_language_420pack: require\n"
2491 "\n"
2492 "layout(location=0) out ivec4 x;\n" /* not UNORM */
2493 "void main(){\n"
2494 " x = ivec4(1);\n"
2495 "}\n";
2496
2497 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2498 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2499
2500 VkPipelineObj pipe(m_device);
2501 pipe.AddShader(&vs);
2502 pipe.AddShader(&fs);
2503
2504 /* implicit CB 0 set up by test framework, is UNORM. */
2505
2506 VkCommandBufferObj dummyCmd(m_device);
2507 VkDescriptorSetObj descriptorSet(m_device);
2508 descriptorSet.AppendDummy();
2509 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2510
2511 m_errorMonitor->ClearState();
2512 pipe.CreateVKPipeline(descriptorSet);
2513
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002514 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002515
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002516 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002517 if (!strstr(msgString.c_str(),"does not match FS output type")) {
2518 FAIL() << "Incorrect error: " << msgString;
2519 }
2520}
Chris Forbesc2050732015-06-05 14:43:36 +12002521
2522TEST_F(VkLayerTest, CreatePipelineNonSpirvShader)
2523{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002524 VkFlags msgFlags;
Chris Forbesc2050732015-06-05 14:43:36 +12002525 std::string msgString;
2526 ASSERT_NO_FATAL_FAILURE(InitState());
2527 /* Intentionally provided GLSL rather than compiling to SPIRV first */
Cody Northrop1cfbd172015-06-03 16:49:20 -06002528 ScopedUseGlsl useGlsl(true);
Chris Forbesc2050732015-06-05 14:43:36 +12002529
2530 char const *vsSource =
2531 "#version 140\n"
2532 "#extension GL_ARB_separate_shader_objects: require\n"
2533 "#extension GL_ARB_shading_language_420pack: require\n"
2534 "\n"
2535 "void main(){\n"
2536 " gl_Position = vec4(1);\n"
2537 "}\n";
2538 char const *fsSource =
2539 "#version 140\n"
2540 "#extension GL_ARB_separate_shader_objects: require\n"
2541 "#extension GL_ARB_shading_language_420pack: require\n"
2542 "\n"
2543 "layout(location=0) out vec4 x;\n"
2544 "void main(){\n"
2545 " x = vec4(1);\n"
2546 "}\n";
2547
2548 m_errorMonitor->ClearState();
2549
2550 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2551 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2552
2553
2554 VkPipelineObj pipe(m_device);
2555 pipe.AddShader(&vs);
2556 pipe.AddShader(&fs);
2557
2558 /* implicit CB 0 set up by test framework, is UNORM. */
2559
2560 VkCommandBufferObj dummyCmd(m_device);
2561 VkDescriptorSetObj descriptorSet(m_device);
2562 descriptorSet.AppendDummy();
2563 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2564
2565 VkResult res = pipe.CreateVKPipeline(descriptorSet);
2566 /* pipeline creation should have succeeded */
2567 ASSERT_EQ(VK_SUCCESS, res);
2568
2569 /* should have emitted a warning: the shader is not SPIRV, so we're
2570 * not going to be able to analyze it */
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002571 msgFlags = m_errorMonitor->GetState(&msgString);
2572 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbesc2050732015-06-05 14:43:36 +12002573 if (!strstr(msgString.c_str(),"is not SPIR-V")) {
2574 FAIL() << "Incorrect warning: " << msgString;
2575 }
2576}
Chris Forbes01c9db72015-06-04 09:25:25 +12002577#endif
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002578
Tony Barbour30486ea2015-04-07 13:44:53 -06002579int main(int argc, char **argv) {
2580 int result;
2581
2582 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour01999182015-04-09 12:58:51 -06002583 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour30486ea2015-04-07 13:44:53 -06002584
2585 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
2586
2587 result = RUN_ALL_TESTS();
2588
Tony Barbour01999182015-04-09 12:58:51 -06002589 VkTestFramework::Finish();
Tony Barbour30486ea2015-04-07 13:44:53 -06002590 return result;
2591}