blob: 14d4a519910e35efb662703a76f0be94321b09ae [file] [log] [blame]
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001#include <vulkan.h>
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002#include "vk_debug_report_lunarg.h"
Tony Barbour30486ea2015-04-07 13:44:53 -06003#include "gtest-1.7.0/include/gtest/gtest.h"
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06004#include "vkrenderframework.h"
Tobin Ehlis56d204a2015-07-03 10:15:26 -06005#include "vk_layer_config.h"
Tony Barbour30486ea2015-04-07 13:44:53 -06006
Mark Lobodzinski5f25be42015-05-14 15:08:13 -05007#define GLM_FORCE_RADIANS
8#include "glm/glm.hpp"
9#include <glm/gtc/matrix_transform.hpp>
10
Tobin Ehlis57e6a612015-05-26 16:11:58 -060011#define MEM_TRACKER_TESTS 1
12#define OBJ_TRACKER_TESTS 1
13#define DRAW_STATE_TESTS 1
14#define THREADING_TESTS 1
Chris Forbes5af3bf22015-05-25 11:13:08 +120015#define SHADER_CHECKER_TESTS 1
Tobin Ehlis57e6a612015-05-26 16:11:58 -060016
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050017//--------------------------------------------------------------------------------------
18// Mesh and VertexFormat Data
19//--------------------------------------------------------------------------------------
20struct Vertex
21{
22 float posX, posY, posZ, posW; // Position data
23 float r, g, b, a; // Color
24};
25
26#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
27
28typedef enum _BsoFailSelect {
29 BsoFailNone = 0x00000000,
30 BsoFailRaster = 0x00000001,
31 BsoFailViewport = 0x00000002,
32 BsoFailColorBlend = 0x00000004,
33 BsoFailDepthStencil = 0x00000008,
34} BsoFailSelect;
35
36struct vktriangle_vs_uniform {
37 // Must start with MVP
38 float mvp[4][4];
39 float position[3][4];
40 float color[3][4];
41};
42
Mark Lobodzinski6bbdff12015-06-02 09:41:30 -050043static const char bindStateVertShaderText[] =
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050044 "#version 130\n"
45 "vec2 vertices[3];\n"
46 "void main() {\n"
47 " vertices[0] = vec2(-1.0, -1.0);\n"
48 " vertices[1] = vec2( 1.0, -1.0);\n"
49 " vertices[2] = vec2( 0.0, 1.0);\n"
50 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
51 "}\n";
52
Mark Lobodzinski6bbdff12015-06-02 09:41:30 -050053static const char bindStateFragShaderText[] =
Cody Northrop74a2d2c2015-06-16 17:32:04 -060054 "#version 140\n"
55 "#extension GL_ARB_separate_shader_objects: require\n"
56 "#extension GL_ARB_shading_language_420pack: require\n"
57 "\n"
58 "layout(location = 0) out vec4 uFragColor;\n"
59 "void main(){\n"
60 " uFragColor = vec4(0,1,0,1);\n"
61 "}\n";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -050062
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060063static void myDbgFunc(
Tony Barboure84a8d62015-07-10 14:10:27 -060064 VkFlags msgFlags,
65 VkDbgObjectType objType,
66 uint64_t srcObject,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060067 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,
Tony Barboure84a8d62015-07-10 14:10:27 -0600124 VkDbgObjectType objType,
125 uint64_t srcObject,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600126 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 ErrorMonitor *m_errorMonitor;
Tony Barbour30486ea2015-04-07 13:44:53 -0600148
149 virtual void SetUp() {
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600150 std::vector<const char *> instance_layer_names;
151 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600152 std::vector<const char *> instance_extension_names;
153 std::vector<const char *> device_extension_names;
Tony Barbour950ebc02015-04-23 12:55:36 -0600154
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600155 instance_extension_names.push_back(DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterde53c5b2015-06-16 15:59:11 -0600156 /*
157 * Since CreateDbgMsgCallback is an instance level extension call
158 * any extension / layer that utilizes that feature also needs
159 * to be enabled at create instance time.
160 */
Mike Stroyaned254572015-06-17 16:32:06 -0600161 // Use Threading layer first to protect others from ThreadCmdBufferCollision test
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600162 instance_layer_names.push_back("Threading");
163 instance_layer_names.push_back("ObjectTracker");
164 instance_layer_names.push_back("MemTracker");
165 instance_layer_names.push_back("DrawState");
166 instance_layer_names.push_back("ShaderChecker");
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600167
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600168 device_layer_names.push_back("Threading");
169 device_layer_names.push_back("ObjectTracker");
170 device_layer_names.push_back("MemTracker");
171 device_layer_names.push_back("DrawState");
172 device_layer_names.push_back("ShaderChecker");
Tony Barbour30486ea2015-04-07 13:44:53 -0600173
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600174 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour30486ea2015-04-07 13:44:53 -0600175 this->app_info.pNext = NULL;
176 this->app_info.pAppName = "layer_tests";
177 this->app_info.appVersion = 1;
178 this->app_info.pEngineName = "unittest";
179 this->app_info.engineVersion = 1;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600180 this->app_info.apiVersion = VK_API_VERSION;
Tony Barbour30486ea2015-04-07 13:44:53 -0600181
Tony Barbour0c1bdc62015-04-29 17:34:29 -0600182 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600183 InitFramework(instance_layer_names, device_layer_names,
184 instance_extension_names, device_extension_names,
185 myDbgFunc, m_errorMonitor);
Tony Barbour30486ea2015-04-07 13:44:53 -0600186 }
187
188 virtual void TearDown() {
189 // Clean up resources before we reset
Tony Barbour30486ea2015-04-07 13:44:53 -0600190 ShutdownFramework();
Tony Barbour8508b8e2015-04-09 10:48:04 -0600191 delete m_errorMonitor;
Tony Barbour30486ea2015-04-07 13:44:53 -0600192 }
193};
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500194
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600195VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour30486ea2015-04-07 13:44:53 -0600196{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600197 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600198
199 result = cmdBuffer.BeginCommandBuffer();
200
201 /*
202 * For render test all drawing happens in a single render pass
203 * on a single command buffer.
204 */
Chris Forbesfe133ef2015-06-16 14:05:59 +1200205 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wuc278df82015-07-07 11:50:03 +0800206 cmdBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour30486ea2015-04-07 13:44:53 -0600207 }
208
209 return result;
210}
211
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600212VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &cmdBuffer)
Tony Barbour30486ea2015-04-07 13:44:53 -0600213{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600214 VkResult result;
Tony Barbour30486ea2015-04-07 13:44:53 -0600215
Chris Forbesfe133ef2015-06-16 14:05:59 +1200216 if (renderPass()) {
Chia-I Wu88eaa3b2015-06-26 15:34:39 +0800217 cmdBuffer.EndRenderPass();
Chris Forbesfe133ef2015-06-16 14:05:59 +1200218 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600219
220 result = cmdBuffer.EndCommandBuffer();
221
222 return result;
223}
224
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500225void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask)
226{
227 // Create identity matrix
228 int i;
229 struct vktriangle_vs_uniform data;
230
231 glm::mat4 Projection = glm::mat4(1.0f);
232 glm::mat4 View = glm::mat4(1.0f);
233 glm::mat4 Model = glm::mat4(1.0f);
234 glm::mat4 MVP = Projection * View * Model;
235 const int matrixSize = sizeof(MVP);
236 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
237
238 memcpy(&data.mvp, &MVP[0][0], matrixSize);
239
240 static const Vertex tri_data[] =
241 {
242 { XYZ1( -1, -1, 0 ), XYZ1( 1.f, 0.f, 0.f ) },
243 { XYZ1( 1, -1, 0 ), XYZ1( 0.f, 1.f, 0.f ) },
244 { XYZ1( 0, 1, 0 ), XYZ1( 0.f, 0.f, 1.f ) },
245 };
246
247 for (i=0; i<3; i++) {
248 data.position[i][0] = tri_data[i].posX;
249 data.position[i][1] = tri_data[i].posY;
250 data.position[i][2] = tri_data[i].posZ;
251 data.position[i][3] = tri_data[i].posW;
252 data.color[i][0] = tri_data[i].r;
253 data.color[i][1] = tri_data[i].g;
254 data.color[i][2] = tri_data[i].b;
255 data.color[i][3] = tri_data[i].a;
256 }
257
258 ASSERT_NO_FATAL_FAILURE(InitState());
259 ASSERT_NO_FATAL_FAILURE(InitViewport());
260
261 VkConstantBufferObj constantBuffer(m_device, bufSize*2, sizeof(float), (const void*) &data);
262
263 VkShaderObj vs(m_device,vertShaderText,VK_SHADER_STAGE_VERTEX, this);
264 VkShaderObj ps(m_device,fragShaderText, VK_SHADER_STAGE_FRAGMENT, this);
265
266 VkPipelineObj pipelineobj(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +0800267 pipelineobj.AddColorAttachment();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500268 pipelineobj.AddShader(&vs);
269 pipelineobj.AddShader(&ps);
270
271 VkDescriptorSetObj descriptorSet(m_device);
272 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
273
274 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
275 VkCommandBufferObj cmdBuffer(m_device);
276 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
277
278 ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
279
280 GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet, failMask);
281
282 // render triangle
283 cmdBuffer.Draw(0, 3, 0, 1);
284
285 // finalize recording of the command buffer
286 EndCommandBuffer(cmdBuffer);
287
288 cmdBuffer.QueueCommandBuffer();
289}
290
291void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *cmdBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask)
292{
293 if (m_depthStencil->Initialized()) {
294 cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
295 } else {
296 cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
297 }
298
299 cmdBuffer->PrepareAttachments();
300 if ((failMask & BsoFailRaster) != BsoFailRaster) {
Tony Barboure84a8d62015-07-10 14:10:27 -0600301 cmdBuffer->BindDynamicRasterState(m_stateRaster);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500302 }
303 if ((failMask & BsoFailViewport) != BsoFailViewport) {
Tony Barboure84a8d62015-07-10 14:10:27 -0600304 cmdBuffer->BindDynamicViewportState(m_stateViewport);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500305 }
306 if ((failMask & BsoFailColorBlend) != BsoFailColorBlend) {
Tony Barboure84a8d62015-07-10 14:10:27 -0600307 cmdBuffer->BindDynamicColorBlendState(m_colorBlend);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500308 }
309 if ((failMask & BsoFailDepthStencil) != BsoFailDepthStencil) {
Tony Barboure84a8d62015-07-10 14:10:27 -0600310 cmdBuffer->BindDynamicDepthStencilState(m_stateDepthStencil);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500311 }
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600312 // Make sure depthWriteEnable is set so that DepthStencil fail test will work correctly
313 VkStencilOpState stencil = {
314 .stencilFailOp = VK_STENCIL_OP_KEEP,
315 .stencilPassOp = VK_STENCIL_OP_KEEP,
316 .stencilDepthFailOp = VK_STENCIL_OP_KEEP,
317 .stencilCompareOp = VK_COMPARE_OP_NEVER
318 };
319 VkPipelineDsStateCreateInfo ds_ci = {
320 .sType = VK_STRUCTURE_TYPE_PIPELINE_DS_STATE_CREATE_INFO,
321 .pNext = NULL,
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600322 .depthTestEnable = VK_FALSE,
323 .depthWriteEnable = VK_TRUE,
324 .depthCompareOp = VK_COMPARE_OP_NEVER,
325 .depthBoundsEnable = VK_FALSE,
326 .stencilTestEnable = VK_FALSE,
327 .front = stencil,
328 .back = stencil
329 };
330 pipelineobj.SetDepthStencil(&ds_ci);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500331 descriptorSet.CreateVKDescriptorSet(cmdBuffer);
Chia-I Wuc278df82015-07-07 11:50:03 +0800332 pipelineobj.CreateVKPipeline(descriptorSet, renderPass());
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500333 cmdBuffer->BindPipeline(pipelineobj);
334 cmdBuffer->BindDescriptorSet(descriptorSet);
335}
336
337// ********************************************************************************************************************
338// ********************************************************************************************************************
339// ********************************************************************************************************************
340// ********************************************************************************************************************
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600341#if MEM_TRACKER_TESTS
Mark Lobodzinski81078192015-05-19 10:28:29 -0500342TEST_F(VkLayerTest, CallResetCmdBufferBeforeCompletion)
343{
344 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600345 VkFlags msgFlags;
Mark Lobodzinski81078192015-05-19 10:28:29 -0500346 std::string msgString;
347
348 VkFenceCreateInfo fenceInfo = {};
349 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
350 fenceInfo.pNext = NULL;
351 fenceInfo.flags = 0;
352
353 ASSERT_NO_FATAL_FAILURE(InitState());
354 ASSERT_NO_FATAL_FAILURE(InitViewport());
355 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
356
357 VkCommandBufferObj cmdBuffer(m_device);
358 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
359
360 BeginCommandBuffer(cmdBuffer);
361 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
362 EndCommandBuffer(cmdBuffer);
363
364 testFence.init(*m_device, fenceInfo);
365
366 // Bypass framework since it does the waits automatically
367 VkResult err = VK_SUCCESS;
Chia-I Wu78c2a352015-07-03 11:49:42 +0800368 err = vkQueueSubmit( m_device->m_queue, 1, &cmdBuffer.handle(), testFence.handle());
Mark Lobodzinski81078192015-05-19 10:28:29 -0500369 ASSERT_VK_SUCCESS( err );
370
371 m_errorMonitor->ClearState();
372 // Introduce failure by calling begin again before checking fence
Chia-I Wu78c2a352015-07-03 11:49:42 +0800373 vkResetCommandBuffer(cmdBuffer.handle());
Mark Lobodzinski81078192015-05-19 10:28:29 -0500374
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600375 msgFlags = m_errorMonitor->GetState(&msgString);
376 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 -0500377 if (!strstr(msgString.c_str(),"Resetting CB")) {
378 FAIL() << "Error received was not 'Resetting CB (0xaddress) before it has completed. You must check CB flag before'";
379 }
380}
381
382TEST_F(VkLayerTest, CallBeginCmdBufferBeforeCompletion)
383{
384 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600385 VkFlags msgFlags;
Mark Lobodzinski81078192015-05-19 10:28:29 -0500386 std::string msgString;
387
388 VkFenceCreateInfo fenceInfo = {};
389 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
390 fenceInfo.pNext = NULL;
391 fenceInfo.flags = 0;
392
393 ASSERT_NO_FATAL_FAILURE(InitState());
394 ASSERT_NO_FATAL_FAILURE(InitViewport());
395 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
396
397 VkCommandBufferObj cmdBuffer(m_device);
398 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
399
400 BeginCommandBuffer(cmdBuffer);
401 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
402 EndCommandBuffer(cmdBuffer);
403
404 testFence.init(*m_device, fenceInfo);
405
406 // Bypass framework since it does the waits automatically
407 VkResult err = VK_SUCCESS;
Chia-I Wu78c2a352015-07-03 11:49:42 +0800408 err = vkQueueSubmit( m_device->m_queue, 1, &cmdBuffer.handle(), testFence.handle());
Mark Lobodzinski81078192015-05-19 10:28:29 -0500409 ASSERT_VK_SUCCESS( err );
410
411 m_errorMonitor->ClearState();
412 // Introduce failure by calling begin again before checking fence
413 BeginCommandBuffer(cmdBuffer);
414
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600415 msgFlags = m_errorMonitor->GetState(&msgString);
416 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 -0500417 if (!strstr(msgString.c_str(),"Calling vkBeginCommandBuffer() on active CB")) {
418 FAIL() << "Error received was not 'Calling vkBeginCommandBuffer() on an active CB (0xaddress) before it has completed'";
419 }
420}
421
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500422TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit)
423{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600424 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500425 std::string msgString;
426 VkResult err;
427
428 ASSERT_NO_FATAL_FAILURE(InitState());
429 m_errorMonitor->ClearState();
430
431 // Create an image, allocate memory, free it, and then try to bind it
432 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500433 VkDeviceMemory mem;
434 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500435
436 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
437 const int32_t tex_width = 32;
438 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500439
440 const VkImageCreateInfo image_create_info = {
441 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
442 .pNext = NULL,
443 .imageType = VK_IMAGE_TYPE_2D,
444 .format = tex_format,
445 .extent = { tex_width, tex_height, 1 },
446 .mipLevels = 1,
447 .arraySize = 1,
448 .samples = 1,
449 .tiling = VK_IMAGE_TILING_LINEAR,
450 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
451 .flags = 0,
452 };
453 VkMemoryAllocInfo mem_alloc = {
454 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
455 .pNext = NULL,
456 .allocationSize = 0,
457 // Introduce failure, do NOT set memProps to VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Mark Lobodzinski72346292015-07-02 16:49:40 -0600458 .memoryTypeIndex = 1,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500459 };
460
461 err = vkCreateImage(m_device->device(), &image_create_info, &image);
462 ASSERT_VK_SUCCESS(err);
463
Tony Barboure84a8d62015-07-10 14:10:27 -0600464 err = vkGetImageMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500465 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500466 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500467 ASSERT_VK_SUCCESS(err);
468
Mark Lobodzinski23182612015-05-29 09:32:35 -0500469 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500470
471 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500472 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500473 ASSERT_VK_SUCCESS(err);
474
475 // Try to bind free memory that has been freed
Tony Barboure84a8d62015-07-10 14:10:27 -0600476 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500477 ASSERT_VK_SUCCESS(err);
478
479 // Map memory as if to initialize the image
480 void *mappedAddress = NULL;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500481 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, &mappedAddress);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500482
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600483 msgFlags = m_errorMonitor->GetState(&msgString);
484 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 -0500485 if (!strstr(msgString.c_str(),"Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT")) {
486 FAIL() << "Error received did not match expected error message from vkMapMemory in MemTracker";
487 }
488}
489
490TEST_F(VkLayerTest, BindInvalidMemory)
491{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600492 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500493 std::string msgString;
494 VkResult err;
495
496 ASSERT_NO_FATAL_FAILURE(InitState());
497 m_errorMonitor->ClearState();
498
499 // Create an image, allocate memory, free it, and then try to bind it
500 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500501 VkDeviceMemory mem;
502 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500503
504 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
505 const int32_t tex_width = 32;
506 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500507
508 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600509 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
510 .pNext = NULL,
511 .imageType = VK_IMAGE_TYPE_2D,
512 .format = tex_format,
513 .extent = { tex_width, tex_height, 1 },
514 .mipLevels = 1,
515 .arraySize = 1,
516 .samples = 1,
517 .tiling = VK_IMAGE_TILING_LINEAR,
518 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
519 .flags = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500520 };
521 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600522 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
523 .pNext = NULL,
524 .allocationSize = 0,
525 .memoryTypeIndex = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500526 };
527
528 err = vkCreateImage(m_device->device(), &image_create_info, &image);
529 ASSERT_VK_SUCCESS(err);
530
Tony Barboure84a8d62015-07-10 14:10:27 -0600531 err = vkGetImageMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500532 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500533 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500534 ASSERT_VK_SUCCESS(err);
535
Mark Lobodzinski23182612015-05-29 09:32:35 -0500536 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500537
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800538 err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinski72346292015-07-02 16:49:40 -0600539 ASSERT_VK_SUCCESS(err);
540
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500541 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500542 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500543 ASSERT_VK_SUCCESS(err);
544
545 // Introduce validation failure, free memory before binding
Mark Lobodzinski23182612015-05-29 09:32:35 -0500546 vkFreeMemory(m_device->device(), mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500547 ASSERT_VK_SUCCESS(err);
548
549 // Try to bind free memory that has been freed
Tony Barboure84a8d62015-07-10 14:10:27 -0600550 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500551 ASSERT_VK_SUCCESS(err);
552
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600553 msgFlags = m_errorMonitor->GetState(&msgString);
554 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 -0500555 if (!strstr(msgString.c_str(),"couldn't find info for mem obj")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500556 FAIL() << "Error received did not match expected error message from BindObjectMemory in MemTracker";
557 }
558}
559
560TEST_F(VkLayerTest, FreeBoundMemory)
561{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600562 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500563 std::string msgString;
564 VkResult err;
565
566 ASSERT_NO_FATAL_FAILURE(InitState());
567 m_errorMonitor->ClearState();
568
569 // Create an image, allocate memory, free it, and then try to bind it
570 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500571 VkDeviceMemory mem;
572 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500573
574 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
575 const int32_t tex_width = 32;
576 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500577
578 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600579 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
580 .pNext = NULL,
581 .imageType = VK_IMAGE_TYPE_2D,
582 .format = tex_format,
583 .extent = { tex_width, tex_height, 1 },
584 .mipLevels = 1,
585 .arraySize = 1,
586 .samples = 1,
587 .tiling = VK_IMAGE_TILING_LINEAR,
588 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
589 .flags = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500590 };
591 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600592 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
593 .pNext = NULL,
594 .allocationSize = 0,
595 .memoryTypeIndex = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500596 };
597
598 err = vkCreateImage(m_device->device(), &image_create_info, &image);
599 ASSERT_VK_SUCCESS(err);
600
Tony Barboure84a8d62015-07-10 14:10:27 -0600601 err = vkGetImageMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500602 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500603 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500604 ASSERT_VK_SUCCESS(err);
605
Mark Lobodzinski23182612015-05-29 09:32:35 -0500606 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500607
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800608 err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinski72346292015-07-02 16:49:40 -0600609 ASSERT_VK_SUCCESS(err);
610
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500611 // allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500612 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500613 ASSERT_VK_SUCCESS(err);
614
615 // Bind memory to Image object
Tony Barboure84a8d62015-07-10 14:10:27 -0600616 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500617 ASSERT_VK_SUCCESS(err);
618
619 // Introduce validation failure, free memory while still bound to object
Mark Lobodzinski23182612015-05-29 09:32:35 -0500620 vkFreeMemory(m_device->device(), mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500621 ASSERT_VK_SUCCESS(err);
622
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600623 msgFlags = m_errorMonitor->GetState(&msgString);
Courtney Goeltzenleuchter7dc4c8b2015-06-13 21:48:47 -0600624 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 -0500625 if (!strstr(msgString.c_str(),"Freeing memory object while it still has references")) {
626 FAIL() << "Warning received did not match expected message from freeMemObjInfo in MemTracker";
627 }
628}
629
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500630TEST_F(VkLayerTest, RebindMemory)
631{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600632 VkFlags msgFlags;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500633 std::string msgString;
634 VkResult err;
635
636 ASSERT_NO_FATAL_FAILURE(InitState());
637 m_errorMonitor->ClearState();
638
639 // Create an image, allocate memory, free it, and then try to bind it
640 VkImage image;
641 VkDeviceMemory mem1;
642 VkDeviceMemory mem2;
643 VkMemoryRequirements mem_reqs;
644
645 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
646 const int32_t tex_width = 32;
647 const int32_t tex_height = 32;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500648
649 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600650 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
651 .pNext = NULL,
652 .imageType = VK_IMAGE_TYPE_2D,
653 .format = tex_format,
654 .extent = { tex_width, tex_height, 1 },
655 .mipLevels = 1,
656 .arraySize = 1,
657 .samples = 1,
658 .tiling = VK_IMAGE_TILING_LINEAR,
659 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
660 .flags = 0,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500661 };
662 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600663 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
664 .pNext = NULL,
665 .allocationSize = 0,
666 .memoryTypeIndex = 0,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500667 };
668
669 err = vkCreateImage(m_device->device(), &image_create_info, &image);
670 ASSERT_VK_SUCCESS(err);
671
Tony Barboure84a8d62015-07-10 14:10:27 -0600672 err = vkGetImageMemoryRequirements(m_device->device(),
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500673 image,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500674 &mem_reqs);
675 ASSERT_VK_SUCCESS(err);
676
677 mem_alloc.allocationSize = mem_reqs.size;
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800678 err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinski72346292015-07-02 16:49:40 -0600679 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500680
681 // allocate 2 memory objects
682 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem1);
683 ASSERT_VK_SUCCESS(err);
684 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem2);
685 ASSERT_VK_SUCCESS(err);
686
687 // Bind first memory object to Image object
Tony Barboure84a8d62015-07-10 14:10:27 -0600688 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500689 ASSERT_VK_SUCCESS(err);
690
691 // Introduce validation failure, try to bind a different memory object to the same image object
Tony Barboure84a8d62015-07-10 14:10:27 -0600692 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500693 ASSERT_VK_SUCCESS(err);
694
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600695 msgFlags = m_errorMonitor->GetState(&msgString);
696 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 -0500697 if (!strstr(msgString.c_str(),"which has already been bound to mem object")) {
698 FAIL() << "Error received did not match expected message when rebinding memory to an object";
699 }
700}
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500701
702TEST_F(VkLayerTest, BindMemoryToDestroyedObject)
703{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600704 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500705 std::string msgString;
706 VkResult err;
707
708 ASSERT_NO_FATAL_FAILURE(InitState());
709 m_errorMonitor->ClearState();
710
711 // Create an image object, allocate memory, destroy the object and then try to bind it
712 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500713 VkDeviceMemory mem;
714 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500715
716 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
717 const int32_t tex_width = 32;
718 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500719
720 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600721 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
722 .pNext = NULL,
723 .imageType = VK_IMAGE_TYPE_2D,
724 .format = tex_format,
725 .extent = { tex_width, tex_height, 1 },
726 .mipLevels = 1,
727 .arraySize = 1,
728 .samples = 1,
729 .tiling = VK_IMAGE_TILING_LINEAR,
730 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
731 .flags = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500732 };
733 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600734 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
735 .pNext = NULL,
736 .allocationSize = 0,
737 .memoryTypeIndex = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500738 };
739
740 err = vkCreateImage(m_device->device(), &image_create_info, &image);
741 ASSERT_VK_SUCCESS(err);
742
Tony Barboure84a8d62015-07-10 14:10:27 -0600743 err = vkGetImageMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500744 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500745 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500746 ASSERT_VK_SUCCESS(err);
747
Mark Lobodzinski23182612015-05-29 09:32:35 -0500748 mem_alloc.allocationSize = mem_reqs.size;
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800749 err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinski72346292015-07-02 16:49:40 -0600750 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500751
752 // Allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500753 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500754 ASSERT_VK_SUCCESS(err);
755
756 // Introduce validation failure, destroy Image object before binding
Tony Barboure84a8d62015-07-10 14:10:27 -0600757 vkDestroyImage(m_device->device(), image);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500758 ASSERT_VK_SUCCESS(err);
759
760 // Now Try to bind memory to this destroyted object
Tony Barboure84a8d62015-07-10 14:10:27 -0600761 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500762 ASSERT_VK_SUCCESS(err);
763
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600764 msgFlags = m_errorMonitor->GetState(&msgString);
765 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 -0500766 if (!strstr(msgString.c_str(),"that's not in global list")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500767 FAIL() << "Error received did not match expected error message from updateObjectBinding in MemTracker";
768 }
769}
770
Tony Barbour8508b8e2015-04-09 10:48:04 -0600771TEST_F(VkLayerTest, SubmitSignaledFence)
Tony Barbour30486ea2015-04-07 13:44:53 -0600772{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600773 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600774 VkFlags msgFlags;
Tony Barbour30486ea2015-04-07 13:44:53 -0600775 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600776
777 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600778 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
779 fenceInfo.pNext = NULL;
780 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour30486ea2015-04-07 13:44:53 -0600781
Tony Barbour30486ea2015-04-07 13:44:53 -0600782 ASSERT_NO_FATAL_FAILURE(InitState());
783 ASSERT_NO_FATAL_FAILURE(InitViewport());
784 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
785
Tony Barbour01999182015-04-09 12:58:51 -0600786 VkCommandBufferObj cmdBuffer(m_device);
Tony Barbour30486ea2015-04-07 13:44:53 -0600787 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
788
Tony Barbour8508b8e2015-04-09 10:48:04 -0600789 BeginCommandBuffer(cmdBuffer);
Tony Barbour30486ea2015-04-07 13:44:53 -0600790 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour8508b8e2015-04-09 10:48:04 -0600791 EndCommandBuffer(cmdBuffer);
Tony Barbour30486ea2015-04-07 13:44:53 -0600792
793 testFence.init(*m_device, fenceInfo);
794 m_errorMonitor->ClearState();
Chia-I Wua4992342015-07-03 11:45:55 +0800795 cmdBuffer.QueueCommandBuffer(testFence.handle());
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600796 msgFlags = m_errorMonitor->GetState(&msgString);
797 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 -0600798 if (!strstr(msgString.c_str(),"submitted in SIGNALED state. Fences must be reset before being submitted")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500799 FAIL() << "Error received was not 'VkQueueSubmit with fence in SIGNALED_STATE'";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600800 }
801
802}
803
804TEST_F(VkLayerTest, ResetUnsignaledFence)
805{
806 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600807 VkFlags msgFlags;
Tony Barbour8508b8e2015-04-09 10:48:04 -0600808 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600809 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600810 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
811 fenceInfo.pNext = NULL;
812
Tony Barbour8508b8e2015-04-09 10:48:04 -0600813 ASSERT_NO_FATAL_FAILURE(InitState());
814 testFence.init(*m_device, fenceInfo);
815 m_errorMonitor->ClearState();
Chia-I Wua4992342015-07-03 11:45:55 +0800816 VkFence fences[1] = {testFence.handle()};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600817 vkResetFences(m_device->device(), 1, fences);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600818 msgFlags = m_errorMonitor->GetState(&msgString);
819 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 -0600820 if (!strstr(msgString.c_str(),"submitted to VkResetFences in UNSIGNALED STATE")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500821 FAIL() << "Error received was not 'VkResetFences with fence in UNSIGNALED_STATE'";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600822 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600823
824}
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600825
Chia-I Wuc278df82015-07-07 11:50:03 +0800826/* TODO: Update for changes due to bug-14075 tiling across render passes */
827#if 0
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600828TEST_F(VkLayerTest, InvalidUsageBits)
829{
830 // Initiate Draw w/o a PSO bound
831 VkFlags msgFlags;
832 std::string msgString;
833
834 ASSERT_NO_FATAL_FAILURE(InitState());
835 m_errorMonitor->ClearState();
836 VkCommandBufferObj cmdBuffer(m_device);
837 BeginCommandBuffer(cmdBuffer);
838
839 const VkExtent3D e3d = {
840 .width = 128,
841 .height = 128,
842 .depth = 1,
843 };
844 const VkImageCreateInfo ici = {
845 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
846 .pNext = NULL,
847 .imageType = VK_IMAGE_TYPE_2D,
848 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
849 .extent = e3d,
850 .mipLevels = 1,
851 .arraySize = 1,
852 .samples = 1,
853 .tiling = VK_IMAGE_TILING_LINEAR,
854 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_BIT
855 .flags = 0,
856 };
857
858 VkImage dsi;
859 vkCreateImage(m_device->device(), &ici, &dsi);
860 VkDepthStencilView dsv;
861 const VkDepthStencilViewCreateInfo dsvci = {
862 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
863 .pNext = NULL,
864 .image = dsi,
865 .mipLevel = 0,
866 .baseArraySlice = 0,
867 .arraySize = 1,
868 .flags = 0,
869 };
870 vkCreateDepthStencilView(m_device->device(), &dsvci, &dsv);
871 msgFlags = m_errorMonitor->GetState(&msgString);
872 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after attempting to create DSView w/ image lacking USAGE_DS_BIT flag";
873 if (!strstr(msgString.c_str(),"Invalid usage flag for image ")) {
874 FAIL() << "Error received was not 'Invalid usage flag for image...'";
875 }
876}
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600877#endif
Chia-I Wuc278df82015-07-07 11:50:03 +0800878#endif
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600879#if OBJ_TRACKER_TESTS
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500880TEST_F(VkLayerTest, RasterStateNotBound)
881{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600882 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500883 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600884 ASSERT_NO_FATAL_FAILURE(InitState());
885 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500886 TEST_DESCRIPTION("Simple Draw Call that validates failure when a raster state object is not bound beforehand");
887
888 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailRaster);
889
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600890 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600891 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Not Binding a Raster State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500892 if (!strstr(msgString.c_str(),"Raster object not bound to this command buffer")) {
893 FAIL() << "Error received was not 'Raster object not bound to this command buffer'";
894 }
895}
896
897TEST_F(VkLayerTest, ViewportStateNotBound)
898{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600899 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500900 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600901 ASSERT_NO_FATAL_FAILURE(InitState());
902 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500903 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport state object is not bound beforehand");
904
905 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
906
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600907 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600908 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Not Binding a Viewport State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500909 if (!strstr(msgString.c_str(),"Viewport object not bound to this command buffer")) {
910 FAIL() << "Error received was not 'Viewport object not bound to this command buffer'";
911 }
912}
913
914TEST_F(VkLayerTest, ColorBlendStateNotBound)
915{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600916 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500917 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600918 ASSERT_NO_FATAL_FAILURE(InitState());
919 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500920 TEST_DESCRIPTION("Simple Draw Call that validates failure when a color-blend state object is not bound beforehand");
921
922 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailColorBlend);
923
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600924 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600925 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Not Binding a ColorBlend State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500926 if (!strstr(msgString.c_str(),"Color-blend object not bound to this command buffer")) {
927 FAIL() << "Error received was not 'Color-blend object not bound to this command buffer'";
928 }
929}
930
931TEST_F(VkLayerTest, DepthStencilStateNotBound)
932{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600933 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500934 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600935 ASSERT_NO_FATAL_FAILURE(InitState());
936 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500937 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth-stencil state object is not bound beforehand");
938
939 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthStencil);
940
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600941 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600942 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Not Binding a DepthStencil State Object";
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500943 if (!strstr(msgString.c_str(),"Depth-stencil object not bound to this command buffer")) {
944 FAIL() << "Error received was not 'Depth-stencil object not bound to this command buffer'";
945 }
Tony Barbourdb686622015-05-06 09:35:56 -0600946}
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600947#endif
948#if DRAW_STATE_TESTS
Tobin Ehlise4076782015-06-24 15:53:07 -0600949TEST_F(VkLayerTest, BindPipelineNoRenderPass)
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600950{
951 // Initiate Draw w/o a PSO bound
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600952 VkFlags msgFlags;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600953 std::string msgString;
954
955 ASSERT_NO_FATAL_FAILURE(InitState());
956 m_errorMonitor->ClearState();
957 VkCommandBufferObj cmdBuffer(m_device);
958 BeginCommandBuffer(cmdBuffer);
959 VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
960 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600961 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlise4076782015-06-24 15:53:07 -0600962 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding pipeline to CmdBuffer w/o active RenderPass";
963 if (!strstr(msgString.c_str(),"Incorrectly binding graphics pipeline ")) {
964 FAIL() << "Error received was not 'Incorrectly binding graphics pipeline (0xbaadb1be) without an active RenderPass'";
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600965 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600966}
967
968TEST_F(VkLayerTest, InvalidDescriptorPool)
969{
970 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
971 // The DS check for this is after driver has been called to validate DS internal data struct
972 // Attempt to clear DS Pool with bad object
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600973/* VkFlags msgFlags;
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600974 std::string msgString;
975 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
976 vkResetDescriptorPool(device(), badPool);
977
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600978 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600979 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an error from Resetting an invalid DescriptorPool Object";
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600980 if (!strstr(msgString.c_str(),"Unable to find pool node for pool 0xbaad6001 specified in vkResetDescriptorPool() call")) {
981 FAIL() << "Error received was note 'Unable to find pool node for pool 0xbaad6001 specified in vkResetDescriptorPool() call'";
982 }*/
983}
984
985TEST_F(VkLayerTest, InvalidDescriptorSet)
986{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600987 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
988 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600989 // Create a valid cmd buffer
990 // call vkCmdBindDescriptorSets w/ false DS
991}
992
993TEST_F(VkLayerTest, InvalidDescriptorSetLayout)
994{
995 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
996 // The DS check for this is after driver has been called to validate DS internal data struct
997}
998
999TEST_F(VkLayerTest, InvalidPipeline)
1000{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001001 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1002 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001003 // Create a valid cmd buffer
1004 // call vkCmdBindPipeline w/ false Pipeline
Tobin Ehlise4076782015-06-24 15:53:07 -06001005// VkFlags msgFlags;
1006// std::string msgString;
1007//
1008// ASSERT_NO_FATAL_FAILURE(InitState());
1009// m_errorMonitor->ClearState();
1010// VkCommandBufferObj cmdBuffer(m_device);
1011// BeginCommandBuffer(cmdBuffer);
1012// VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
1013// vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
1014// msgFlags = m_errorMonitor->GetState(&msgString);
1015// ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding invalid pipeline to CmdBuffer";
1016// if (!strstr(msgString.c_str(),"Attempt to bind Pipeline ")) {
1017// FAIL() << "Error received was not 'Attempt to bind Pipeline 0xbaadb1be that doesn't exist!'";
1018// }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001019}
1020
Tobin Ehlis254eca02015-06-25 15:46:59 -06001021TEST_F(VkLayerTest, DescriptorSetNotUpdated)
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001022{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001023 // Create and update CmdBuffer then call QueueSubmit w/o calling End on CmdBuffer
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001024 VkFlags msgFlags;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001025 std::string msgString;
1026 VkResult err;
1027
1028 ASSERT_NO_FATAL_FAILURE(InitState());
1029 m_errorMonitor->ClearState();
1030 VkCommandBufferObj cmdBuffer(m_device);
1031 const VkDescriptorTypeCount ds_type_count = {
1032 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1033 .count = 1,
1034 };
1035 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1036 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1037 .pNext = NULL,
1038 .count = 1,
1039 .pTypeCount = &ds_type_count,
1040 };
1041 VkDescriptorPool ds_pool;
1042 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1043 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001044
1045 const VkDescriptorSetLayoutBinding dsl_binding = {
1046 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001047 .arraySize = 1,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001048 .stageFlags = VK_SHADER_STAGE_ALL,
1049 .pImmutableSamplers = NULL,
1050 };
1051
1052 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1053 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1054 .pNext = NULL,
1055 .count = 1,
1056 .pBinding = &dsl_binding,
1057 };
1058 VkDescriptorSetLayout ds_layout;
1059 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1060 ASSERT_VK_SUCCESS(err);
1061
1062 VkDescriptorSet descriptorSet;
1063 uint32_t ds_count = 0;
1064 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1065 ASSERT_VK_SUCCESS(err);
1066
1067 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1068 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1069 .pNext = NULL,
1070 .descriptorSetCount = 1,
1071 .pSetLayouts = &ds_layout,
1072 };
1073
1074 VkPipelineLayout pipeline_layout;
1075 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1076 ASSERT_VK_SUCCESS(err);
1077
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001078 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001079
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001080 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1081 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1082 .pNext = NULL,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001083 .stage = VK_SHADER_STAGE_VERTEX,
Chia-I Wub48eddb2015-07-03 11:49:42 +08001084 .shader = vs.handle(),
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001085 .linkConstBufferCount = 0,
1086 .pLinkConstBufferInfo = NULL,
1087 .pSpecializationInfo = NULL,
1088 };
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001089 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001090 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1091 .pNext = NULL,
1092 .stageCount = 1,
1093 .pStages = &pipe_vs_ci,
1094 .pVertexInputState = NULL,
1095 .pIaState = NULL,
1096 .pTessState = NULL,
1097 .pVpState = NULL,
1098 .pRsState = NULL,
1099 .pMsState = NULL,
1100 .pDsState = NULL,
1101 .pCbState = NULL,
1102 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1103 .layout = pipeline_layout,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001104 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06001105 const VkPipelineCacheCreateInfo pc_ci = {
1106 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1107 .pNext = NULL,
1108 .initialSize = 0,
1109 .initialData = 0,
1110 .maxSize = 0,
1111 };
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001112
1113 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001114 VkPipelineCache pipelineCache;
1115
1116 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1117 ASSERT_VK_SUCCESS(err);
1118 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001119 ASSERT_VK_SUCCESS(err);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001120 ASSERT_NO_FATAL_FAILURE(InitState());
1121 ASSERT_NO_FATAL_FAILURE(InitViewport());
1122 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1123 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1124 BeginCommandBuffer(cmdBuffer);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001125 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinskia65c4632015-06-15 13:21:21 -06001126 vkCmdBindDescriptorSets(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001127
Tobin Ehlis254eca02015-06-25 15:46:59 -06001128 msgFlags = m_errorMonitor->GetState(&msgString);
1129 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT) << "Did not warn after binding a DescriptorSet that was never updated.";
1130 if (!strstr(msgString.c_str()," bound but it was never updated. ")) {
1131 FAIL() << "Error received was not 'DS <blah> bound but it was never updated. You may want to either update it or not bind it.'";
1132 }
1133}
1134
1135TEST_F(VkLayerTest, NoBeginCmdBuffer)
1136{
1137 VkFlags msgFlags;
1138 std::string msgString;
1139
1140 ASSERT_NO_FATAL_FAILURE(InitState());
1141 m_errorMonitor->ClearState();
1142 VkCommandBufferObj cmdBuffer(m_device);
1143 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
1144 vkEndCommandBuffer(cmdBuffer.GetBufferHandle());
1145 msgFlags = m_errorMonitor->GetState(&msgString);
1146 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after ending a CmdBuffer w/o calling BeginCommandBuffer()";
1147 if (!strstr(msgString.c_str(),"You must call vkBeginCommandBuffer() before this call to ")) {
1148 FAIL() << "Error received was not 'You must call vkBeginCommandBuffer() before this call to vkEndCommandBuffer()'";
1149 }
1150}
1151
1152TEST_F(VkLayerTest, InvalidPipelineCreateState)
1153{
1154 // Attempt to Create Gfx Pipeline w/o a VS
1155 VkFlags msgFlags;
1156 std::string msgString;
1157 VkResult err;
1158
1159 ASSERT_NO_FATAL_FAILURE(InitState());
1160 m_errorMonitor->ClearState();
1161 VkCommandBufferObj cmdBuffer(m_device);
1162 const VkDescriptorTypeCount ds_type_count = {
1163 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1164 .count = 1,
1165 };
1166 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1167 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1168 .pNext = NULL,
1169 .count = 1,
1170 .pTypeCount = &ds_type_count,
1171 };
1172 VkDescriptorPool ds_pool;
1173 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1174 ASSERT_VK_SUCCESS(err);
1175
1176 const VkDescriptorSetLayoutBinding dsl_binding = {
1177 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1178 .arraySize = 1,
1179 .stageFlags = VK_SHADER_STAGE_ALL,
1180 .pImmutableSamplers = NULL,
1181 };
1182
1183 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1184 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1185 .pNext = NULL,
1186 .count = 1,
1187 .pBinding = &dsl_binding,
1188 };
1189 VkDescriptorSetLayout ds_layout;
1190 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1191 ASSERT_VK_SUCCESS(err);
1192
1193 VkDescriptorSet descriptorSet;
1194 uint32_t ds_count = 0;
1195 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1196 ASSERT_VK_SUCCESS(err);
1197
1198 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1199 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1200 .pNext = NULL,
1201 .descriptorSetCount = 1,
1202 .pSetLayouts = &ds_layout,
1203 };
1204
1205 VkPipelineLayout pipeline_layout;
1206 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1207 ASSERT_VK_SUCCESS(err);
1208
1209 const VkGraphicsPipelineCreateInfo gp_ci = {
1210 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1211 .pNext = NULL,
1212 .stageCount = 0,
1213 .pStages = NULL, // Creating Gfx Pipeline w/o VS is a violation
1214 .pVertexInputState = NULL,
1215 .pIaState = NULL,
1216 .pTessState = NULL,
1217 .pVpState = NULL,
1218 .pRsState = NULL,
1219 .pMsState = NULL,
1220 .pDsState = NULL,
1221 .pCbState = NULL,
1222 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1223 .layout = pipeline_layout,
1224 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06001225 const VkPipelineCacheCreateInfo pc_ci = {
1226 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1227 .pNext = NULL,
1228 .initialSize = 0,
1229 .initialData = 0,
1230 .maxSize = 0,
1231 };
Tobin Ehlis254eca02015-06-25 15:46:59 -06001232
1233 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001234 VkPipelineCache pipelineCache;
1235
1236 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1237 ASSERT_VK_SUCCESS(err);
1238 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001239
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001240 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001241 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after creating Gfx Pipeline w/o VS.";
1242 if (!strstr(msgString.c_str(),"Invalid Pipeline CreateInfo State: Vtx Shader required")) {
1243 FAIL() << "Error received was not 'Invalid Pipeline CreateInfo State: Vtx Shader required'";
1244 }
1245}
1246
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001247TEST_F(VkLayerTest, NullRenderPass)
1248{
1249 // Bind a NULL RenderPass
1250 VkFlags msgFlags;
1251 std::string msgString;
1252
1253 ASSERT_NO_FATAL_FAILURE(InitState());
1254 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1255 m_errorMonitor->ClearState();
1256 VkCommandBufferObj cmdBuffer(m_device);
1257
1258 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1259 BeginCommandBuffer(cmdBuffer);
1260 // Don't care about RenderPass handle b/c error should be flagged before that
Chia-I Wuc278df82015-07-07 11:50:03 +08001261 vkCmdBeginRenderPass(cmdBuffer.GetBufferHandle(), NULL, VK_RENDER_PASS_CONTENTS_INLINE);
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001262
1263 msgFlags = m_errorMonitor->GetState(&msgString);
1264 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding NULL RenderPass.";
1265 if (!strstr(msgString.c_str(),"You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()")) {
1266 FAIL() << "Error received was not 'You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()'";
1267 }
1268}
1269
Tobin Ehlis254eca02015-06-25 15:46:59 -06001270TEST_F(VkLayerTest, RenderPassWithinRenderPass)
1271{
1272 // Bind a BeginRenderPass within an active RenderPass
1273 VkFlags msgFlags;
1274 std::string msgString;
1275
1276 ASSERT_NO_FATAL_FAILURE(InitState());
1277 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1278 m_errorMonitor->ClearState();
1279 VkCommandBufferObj cmdBuffer(m_device);
1280
1281 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1282 BeginCommandBuffer(cmdBuffer);
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001283 // Just create a dummy Renderpass that's non-NULL so we can get to the proper error
Chia-I Wuc278df82015-07-07 11:50:03 +08001284 const VkRenderPassBeginInfo rp_begin = {
1285 .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
1286 .pNext = NULL,
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001287 .renderPass = (VkRenderPass) 0xc001d00d,
Tony Barbour2a199c12015-07-09 17:31:46 -06001288 .framebuffer = 0
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001289 };
Chia-I Wuc278df82015-07-07 11:50:03 +08001290 vkCmdBeginRenderPass(cmdBuffer.GetBufferHandle(), &rp_begin, VK_RENDER_PASS_CONTENTS_INLINE);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001291
1292 msgFlags = m_errorMonitor->GetState(&msgString);
1293 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding RenderPass w/i an active RenderPass.";
1294 if (!strstr(msgString.c_str(),"Cannot call vkCmdBeginRenderPass() during an active RenderPass ")) {
1295 FAIL() << "Error received was not 'Cannot call vkCmdBeginRenderPass() during an active RenderPass...'";
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001296 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001297}
1298
1299TEST_F(VkLayerTest, InvalidDynamicStateObject)
1300{
1301 // Create a valid cmd buffer
1302 // call vkCmdBindDynamicStateObject w/ false DS Obj
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001303 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1304 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001305}
Tobin Ehlis201b1ba2015-05-27 14:55:35 -06001306
Tobin Ehlise4076782015-06-24 15:53:07 -06001307TEST_F(VkLayerTest, VtxBufferNoRenderPass)
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001308{
1309 // Bind VBO out-of-bounds for given PSO
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001310 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001311 std::string msgString;
1312 VkResult err;
1313
1314 ASSERT_NO_FATAL_FAILURE(InitState());
1315 m_errorMonitor->ClearState();
1316 VkCommandBufferObj cmdBuffer(m_device);
1317 const VkDescriptorTypeCount ds_type_count = {
1318 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1319 .count = 1,
1320 };
1321 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1322 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1323 .pNext = NULL,
1324 .count = 1,
1325 .pTypeCount = &ds_type_count,
1326 };
1327 VkDescriptorPool ds_pool;
1328 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1329 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001330
1331 const VkDescriptorSetLayoutBinding dsl_binding = {
1332 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001333 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001334 .stageFlags = VK_SHADER_STAGE_ALL,
1335 .pImmutableSamplers = NULL,
1336 };
1337
1338 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1339 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1340 .pNext = NULL,
1341 .count = 1,
1342 .pBinding = &dsl_binding,
1343 };
1344 VkDescriptorSetLayout ds_layout;
1345 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1346 ASSERT_VK_SUCCESS(err);
1347
1348 VkDescriptorSet descriptorSet;
1349 uint32_t ds_count = 0;
1350 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1351 ASSERT_VK_SUCCESS(err);
1352
1353 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1354 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1355 .pNext = NULL,
1356 .descriptorSetCount = 1,
1357 .pSetLayouts = &ds_layout,
1358 };
1359
1360 VkPipelineLayout pipeline_layout;
1361 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1362 ASSERT_VK_SUCCESS(err);
1363
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001364 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001365
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001366 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1367 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1368 .pNext = NULL,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001369 .stage = VK_SHADER_STAGE_VERTEX,
Chia-I Wub48eddb2015-07-03 11:49:42 +08001370 .shader = vs.handle(),
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001371 .linkConstBufferCount = 0,
1372 .pLinkConstBufferInfo = NULL,
1373 .pSpecializationInfo = NULL,
1374 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001375 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001376 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1377 .pNext = NULL,
1378 .stageCount = 1,
1379 .pStages = &pipe_vs_ci,
1380 .pVertexInputState = NULL,
1381 .pIaState = NULL,
1382 .pTessState = NULL,
1383 .pVpState = NULL,
1384 .pRsState = NULL,
1385 .pMsState = NULL,
1386 .pDsState = NULL,
1387 .pCbState = NULL,
1388 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1389 .layout = pipeline_layout,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001390 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06001391 const VkPipelineCacheCreateInfo pc_ci = {
1392 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1393 .pNext = NULL,
1394 .initialSize = 0,
1395 .initialData = 0,
1396 .maxSize = 0,
1397 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001398
1399 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001400 VkPipelineCache pipelineCache;
1401
1402 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1403 ASSERT_VK_SUCCESS(err);
1404 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001405 ASSERT_VK_SUCCESS(err);
1406
1407 err= cmdBuffer.BeginCommandBuffer();
1408 ASSERT_VK_SUCCESS(err);
1409 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1410 // Should error before calling to driver so don't care about actual data
1411 vkCmdBindVertexBuffers(cmdBuffer.GetBufferHandle(), 0, 1, NULL, NULL);
1412
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001413 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlise4076782015-06-24 15:53:07 -06001414 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after vkCmdBindVertexBuffers() w/o active RenderPass.";
1415 if (!strstr(msgString.c_str(),"Incorrect call to vkCmdBindVertexBuffers() without an active RenderPass.")) {
1416 FAIL() << "Error received was not 'Incorrect call to vkCmdBindVertexBuffers() without an active RenderPass.'";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001417 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001418}
1419
1420TEST_F(VkLayerTest, DSTypeMismatch)
1421{
1422 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001423 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001424 std::string msgString;
1425 VkResult err;
1426
1427 ASSERT_NO_FATAL_FAILURE(InitState());
1428 m_errorMonitor->ClearState();
1429 //VkDescriptorSetObj descriptorSet(m_device);
1430 const VkDescriptorTypeCount ds_type_count = {
1431 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1432 .count = 1,
1433 };
1434 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1435 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1436 .pNext = NULL,
1437 .count = 1,
1438 .pTypeCount = &ds_type_count,
1439 };
1440 VkDescriptorPool ds_pool;
1441 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1442 ASSERT_VK_SUCCESS(err);
1443 const VkDescriptorSetLayoutBinding dsl_binding = {
1444 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001445 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001446 .stageFlags = VK_SHADER_STAGE_ALL,
1447 .pImmutableSamplers = NULL,
1448 };
1449
1450 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1451 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1452 .pNext = NULL,
1453 .count = 1,
1454 .pBinding = &dsl_binding,
1455 };
1456 VkDescriptorSetLayout ds_layout;
1457 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1458 ASSERT_VK_SUCCESS(err);
1459
1460 VkDescriptorSet descriptorSet;
1461 uint32_t ds_count = 0;
1462 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1463 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001464
1465 const VkSamplerCreateInfo sampler_ci = {
1466 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1467 .pNext = NULL,
1468 .magFilter = VK_TEX_FILTER_NEAREST,
1469 .minFilter = VK_TEX_FILTER_NEAREST,
1470 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1471 .addressU = VK_TEX_ADDRESS_CLAMP,
1472 .addressV = VK_TEX_ADDRESS_CLAMP,
1473 .addressW = VK_TEX_ADDRESS_CLAMP,
1474 .mipLodBias = 1.0,
1475 .maxAnisotropy = 1,
1476 .compareOp = VK_COMPARE_OP_NEVER,
1477 .minLod = 1.0,
1478 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001479 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001480 };
1481 VkSampler sampler;
1482 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1483 ASSERT_VK_SUCCESS(err);
1484
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001485 VkDescriptorInfo descriptor_info;
1486 memset(&descriptor_info, 0, sizeof(descriptor_info));
1487 descriptor_info.sampler = sampler;
1488
1489 VkWriteDescriptorSet descriptor_write;
1490 memset(&descriptor_write, 0, sizeof(descriptor_write));
1491 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1492 descriptor_write.destSet = descriptorSet;
1493 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001494 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001495 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1496 descriptor_write.pDescriptors = &descriptor_info;
1497
1498 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1499
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001500 msgFlags = m_errorMonitor->GetState(&msgString);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001501 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 +08001502 if (!strstr(msgString.c_str(),"Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET does not match ")) {
1503 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 -06001504 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001505}
1506
1507TEST_F(VkLayerTest, DSUpdateOutOfBounds)
1508{
1509 // For overlapping Update, have arrayIndex exceed that of layout
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001510 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001511 std::string msgString;
1512 VkResult err;
1513
1514 ASSERT_NO_FATAL_FAILURE(InitState());
1515 m_errorMonitor->ClearState();
1516 //VkDescriptorSetObj descriptorSet(m_device);
1517 const VkDescriptorTypeCount ds_type_count = {
1518 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1519 .count = 1,
1520 };
1521 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1522 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1523 .pNext = NULL,
1524 .count = 1,
1525 .pTypeCount = &ds_type_count,
1526 };
1527 VkDescriptorPool ds_pool;
1528 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1529 ASSERT_VK_SUCCESS(err);
1530 const VkDescriptorSetLayoutBinding dsl_binding = {
1531 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001532 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001533 .stageFlags = VK_SHADER_STAGE_ALL,
1534 .pImmutableSamplers = NULL,
1535 };
1536
1537 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1538 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1539 .pNext = NULL,
1540 .count = 1,
1541 .pBinding = &dsl_binding,
1542 };
1543 VkDescriptorSetLayout ds_layout;
1544 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1545 ASSERT_VK_SUCCESS(err);
1546
1547 VkDescriptorSet descriptorSet;
1548 uint32_t ds_count = 0;
1549 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1550 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001551
1552 const VkSamplerCreateInfo sampler_ci = {
1553 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1554 .pNext = NULL,
1555 .magFilter = VK_TEX_FILTER_NEAREST,
1556 .minFilter = VK_TEX_FILTER_NEAREST,
1557 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1558 .addressU = VK_TEX_ADDRESS_CLAMP,
1559 .addressV = VK_TEX_ADDRESS_CLAMP,
1560 .addressW = VK_TEX_ADDRESS_CLAMP,
1561 .mipLodBias = 1.0,
1562 .maxAnisotropy = 1,
1563 .compareOp = VK_COMPARE_OP_NEVER,
1564 .minLod = 1.0,
1565 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001566 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001567 };
1568 VkSampler sampler;
1569 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1570 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001571
1572 VkDescriptorInfo descriptor_info;
1573 memset(&descriptor_info, 0, sizeof(descriptor_info));
1574 descriptor_info.sampler = sampler;
1575
1576 VkWriteDescriptorSet descriptor_write;
1577 memset(&descriptor_write, 0, sizeof(descriptor_write));
1578 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1579 descriptor_write.destSet = descriptorSet;
1580 descriptor_write.destArrayElement = 1; /* This index out of bounds for the update */
1581 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001582 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001583 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1584 descriptor_write.pDescriptors = &descriptor_info;
1585
1586 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1587
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001588 msgFlags = m_errorMonitor->GetState(&msgString);
1589 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 +08001590 if (!strstr(msgString.c_str(),"Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET is out of bounds for matching binding")) {
1591 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 -06001592 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001593}
1594
1595TEST_F(VkLayerTest, InvalidDSUpdateIndex)
1596{
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001597 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001598 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001599 std::string msgString;
1600 VkResult err;
1601
1602 ASSERT_NO_FATAL_FAILURE(InitState());
1603 m_errorMonitor->ClearState();
1604 //VkDescriptorSetObj descriptorSet(m_device);
1605 const VkDescriptorTypeCount ds_type_count = {
1606 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1607 .count = 1,
1608 };
1609 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1610 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1611 .pNext = NULL,
1612 .count = 1,
1613 .pTypeCount = &ds_type_count,
1614 };
1615 VkDescriptorPool ds_pool;
1616 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1617 ASSERT_VK_SUCCESS(err);
1618 const VkDescriptorSetLayoutBinding dsl_binding = {
1619 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001620 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001621 .stageFlags = VK_SHADER_STAGE_ALL,
1622 .pImmutableSamplers = NULL,
1623 };
1624
1625 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1626 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1627 .pNext = NULL,
1628 .count = 1,
1629 .pBinding = &dsl_binding,
1630 };
1631 VkDescriptorSetLayout ds_layout;
1632 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1633 ASSERT_VK_SUCCESS(err);
1634
1635 VkDescriptorSet descriptorSet;
1636 uint32_t ds_count = 0;
1637 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1638 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001639
1640 const VkSamplerCreateInfo sampler_ci = {
1641 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1642 .pNext = NULL,
1643 .magFilter = VK_TEX_FILTER_NEAREST,
1644 .minFilter = VK_TEX_FILTER_NEAREST,
1645 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1646 .addressU = VK_TEX_ADDRESS_CLAMP,
1647 .addressV = VK_TEX_ADDRESS_CLAMP,
1648 .addressW = VK_TEX_ADDRESS_CLAMP,
1649 .mipLodBias = 1.0,
1650 .maxAnisotropy = 1,
1651 .compareOp = VK_COMPARE_OP_NEVER,
1652 .minLod = 1.0,
1653 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001654 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001655 };
1656 VkSampler sampler;
1657 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1658 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001659
1660 VkDescriptorInfo descriptor_info;
1661 memset(&descriptor_info, 0, sizeof(descriptor_info));
1662 descriptor_info.sampler = sampler;
1663
1664 VkWriteDescriptorSet descriptor_write;
1665 memset(&descriptor_write, 0, sizeof(descriptor_write));
1666 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1667 descriptor_write.destSet = descriptorSet;
1668 descriptor_write.destBinding = 2;
1669 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001670 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001671 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1672 descriptor_write.pDescriptors = &descriptor_info;
1673
1674 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1675
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001676 msgFlags = m_errorMonitor->GetState(&msgString);
1677 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 -06001678 if (!strstr(msgString.c_str()," does not have binding to match update binding ")) {
1679 FAIL() << "Error received was not 'Descriptor Set <blah> does not have binding to match update binding '";
1680 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001681}
1682
1683TEST_F(VkLayerTest, InvalidDSUpdateStruct)
1684{
1685 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_* types
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001686 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001687 std::string msgString;
1688 VkResult err;
1689
1690 ASSERT_NO_FATAL_FAILURE(InitState());
1691 m_errorMonitor->ClearState();
1692 //VkDescriptorSetObj descriptorSet(m_device);
1693 const VkDescriptorTypeCount ds_type_count = {
1694 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1695 .count = 1,
1696 };
1697 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1698 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1699 .pNext = NULL,
1700 .count = 1,
1701 .pTypeCount = &ds_type_count,
1702 };
1703 VkDescriptorPool ds_pool;
1704 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1705 ASSERT_VK_SUCCESS(err);
1706 const VkDescriptorSetLayoutBinding dsl_binding = {
1707 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001708 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001709 .stageFlags = VK_SHADER_STAGE_ALL,
1710 .pImmutableSamplers = NULL,
1711 };
1712
1713 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1714 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1715 .pNext = NULL,
1716 .count = 1,
1717 .pBinding = &dsl_binding,
1718 };
1719 VkDescriptorSetLayout ds_layout;
1720 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1721 ASSERT_VK_SUCCESS(err);
1722
1723 VkDescriptorSet descriptorSet;
1724 uint32_t ds_count = 0;
1725 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1726 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001727
1728 const VkSamplerCreateInfo sampler_ci = {
1729 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1730 .pNext = NULL,
1731 .magFilter = VK_TEX_FILTER_NEAREST,
1732 .minFilter = VK_TEX_FILTER_NEAREST,
1733 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1734 .addressU = VK_TEX_ADDRESS_CLAMP,
1735 .addressV = VK_TEX_ADDRESS_CLAMP,
1736 .addressW = VK_TEX_ADDRESS_CLAMP,
1737 .mipLodBias = 1.0,
1738 .maxAnisotropy = 1,
1739 .compareOp = VK_COMPARE_OP_NEVER,
1740 .minLod = 1.0,
1741 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001742 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001743 };
1744 VkSampler sampler;
1745 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1746 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001747
1748
1749 VkDescriptorInfo descriptor_info;
1750 memset(&descriptor_info, 0, sizeof(descriptor_info));
1751 descriptor_info.sampler = sampler;
1752
1753 VkWriteDescriptorSet descriptor_write;
1754 memset(&descriptor_write, 0, sizeof(descriptor_write));
1755 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
1756 descriptor_write.destSet = descriptorSet;
1757 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001758 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001759 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1760 descriptor_write.pDescriptors = &descriptor_info;
1761
1762 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1763
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001764 msgFlags = m_errorMonitor->GetState(&msgString);
1765 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 -06001766 if (!strstr(msgString.c_str(),"Unexpected UPDATE struct of type ")) {
1767 FAIL() << "Error received was not 'Unexpected UPDATE struct of type '";
1768 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001769}
1770
1771TEST_F(VkLayerTest, NumSamplesMismatch)
1772{
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001773 // Create CmdBuffer where MSAA samples doesn't match RenderPass sampleCount
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001774 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001775 std::string msgString;
1776 VkResult err;
1777
1778 ASSERT_NO_FATAL_FAILURE(InitState());
1779 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1780 m_errorMonitor->ClearState();
1781 VkCommandBufferObj cmdBuffer(m_device);
1782 const VkDescriptorTypeCount ds_type_count = {
1783 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1784 .count = 1,
1785 };
1786 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1787 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1788 .pNext = NULL,
1789 .count = 1,
1790 .pTypeCount = &ds_type_count,
1791 };
1792 VkDescriptorPool ds_pool;
1793 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1794 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001795
1796 const VkDescriptorSetLayoutBinding dsl_binding = {
1797 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001798 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001799 .stageFlags = VK_SHADER_STAGE_ALL,
1800 .pImmutableSamplers = NULL,
1801 };
1802
1803 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1804 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1805 .pNext = NULL,
1806 .count = 1,
1807 .pBinding = &dsl_binding,
1808 };
1809 VkDescriptorSetLayout ds_layout;
1810 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1811 ASSERT_VK_SUCCESS(err);
1812
1813 VkDescriptorSet descriptorSet;
1814 uint32_t ds_count = 0;
1815 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1816 ASSERT_VK_SUCCESS(err);
1817
1818 const VkPipelineMsStateCreateInfo pipe_ms_state_ci = {
1819 .sType = VK_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO,
1820 .pNext = NULL,
Tony Barboure094edf2015-06-26 10:18:34 -06001821 .rasterSamples = 4,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001822 .multisampleEnable = 1,
1823 .sampleShadingEnable = 0,
1824 .minSampleShading = 1.0,
1825 .sampleMask = 15,
1826 };
1827
1828 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1829 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1830 .pNext = NULL,
1831 .descriptorSetCount = 1,
1832 .pSetLayouts = &ds_layout,
1833 };
1834
1835 VkPipelineLayout pipeline_layout;
1836 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1837 ASSERT_VK_SUCCESS(err);
1838
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001839 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001840
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001841 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1842 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1843 .pNext = NULL,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001844 .stage = VK_SHADER_STAGE_VERTEX,
Chia-I Wub48eddb2015-07-03 11:49:42 +08001845 .shader = vs.handle(),
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001846 .linkConstBufferCount = 0,
1847 .pLinkConstBufferInfo = NULL,
1848 .pSpecializationInfo = NULL,
1849 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001850 const VkGraphicsPipelineCreateInfo gp_ci = {
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001851 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1852 .pNext = NULL,
1853 .stageCount = 1,
1854 .pStages = &pipe_vs_ci,
1855 .pVertexInputState = NULL,
1856 .pIaState = NULL,
1857 .pTessState = NULL,
1858 .pVpState = NULL,
1859 .pRsState = NULL,
1860 .pMsState = &pipe_ms_state_ci,
1861 .pDsState = NULL,
1862 .pCbState = NULL,
1863 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1864 .layout = pipeline_layout,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001865 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06001866 const VkPipelineCacheCreateInfo pc_ci = {
1867 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1868 .pNext = NULL,
1869 .initialSize = 0,
1870 .initialData = 0,
1871 .maxSize = 0,
1872 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001873
1874 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001875 VkPipelineCache pipelineCache;
1876
1877 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1878 ASSERT_VK_SUCCESS(err);
1879 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001880 ASSERT_VK_SUCCESS(err);
1881
1882 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1883 BeginCommandBuffer(cmdBuffer);
1884 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1885
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001886 msgFlags = m_errorMonitor->GetState(&msgString);
1887 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 -06001888 if (!strstr(msgString.c_str(),"Num samples mismatch! ")) {
1889 FAIL() << "Error received was not 'Num samples mismatch!...'";
1890 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001891}
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06001892
Tobin Ehlise4076782015-06-24 15:53:07 -06001893TEST_F(VkLayerTest, PipelineNotBound)
1894{
1895 VkFlags msgFlags;
1896 std::string msgString;
1897 VkResult err;
1898
1899 ASSERT_NO_FATAL_FAILURE(InitState());
1900 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1901 m_errorMonitor->ClearState();
1902 VkCommandBufferObj cmdBuffer(m_device);
1903 const VkDescriptorTypeCount ds_type_count = {
1904 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1905 .count = 1,
1906 };
1907 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1908 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1909 .pNext = NULL,
1910 .count = 1,
1911 .pTypeCount = &ds_type_count,
1912 };
1913 VkDescriptorPool ds_pool;
1914 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1915 ASSERT_VK_SUCCESS(err);
1916
1917 const VkDescriptorSetLayoutBinding dsl_binding = {
1918 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1919 .arraySize = 1,
1920 .stageFlags = VK_SHADER_STAGE_ALL,
1921 .pImmutableSamplers = NULL,
1922 };
1923
1924 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1925 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1926 .pNext = NULL,
1927 .count = 1,
1928 .pBinding = &dsl_binding,
1929 };
1930 VkDescriptorSetLayout ds_layout;
1931 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1932 ASSERT_VK_SUCCESS(err);
1933
1934 VkDescriptorSet descriptorSet;
1935 uint32_t ds_count = 0;
1936 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1937 ASSERT_VK_SUCCESS(err);
1938
1939 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1940 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1941 .pNext = NULL,
1942 .descriptorSetCount = 1,
1943 .pSetLayouts = &ds_layout,
1944 };
1945
1946 VkPipelineLayout pipeline_layout;
1947 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1948 ASSERT_VK_SUCCESS(err);
1949
Tobin Ehlise4076782015-06-24 15:53:07 -06001950 VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
1951 //err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
1952 ASSERT_VK_SUCCESS(err);
1953
1954 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1955 BeginCommandBuffer(cmdBuffer);
1956 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
1957
1958 msgFlags = m_errorMonitor->GetState(&msgString);
1959 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding invalid pipeline to CmdBuffer";
1960 if (!strstr(msgString.c_str(),"Attempt to bind Pipeline ")) {
1961 FAIL() << "Error received was not 'Attempt to bind Pipeline 0xbaadb1be that doesn't exist!'";
1962 }
1963}
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06001964
1965TEST_F(VkLayerTest, ClearCmdNoDraw)
1966{
1967 // Create CmdBuffer where we add ClearCmd for FB Color attachment prior to issuing a Draw
1968 VkFlags msgFlags;
1969 std::string msgString;
1970 VkResult err;
1971
1972 ASSERT_NO_FATAL_FAILURE(InitState());
1973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1974 m_errorMonitor->ClearState();
1975 VkCommandBufferObj cmdBuffer(m_device);
1976 const VkDescriptorTypeCount ds_type_count = {
1977 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1978 .count = 1,
1979 };
1980 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1981 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1982 .pNext = NULL,
1983 .count = 1,
1984 .pTypeCount = &ds_type_count,
1985 };
1986 VkDescriptorPool ds_pool;
1987 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1988 ASSERT_VK_SUCCESS(err);
1989
1990 const VkDescriptorSetLayoutBinding dsl_binding = {
1991 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1992 .arraySize = 1,
1993 .stageFlags = VK_SHADER_STAGE_ALL,
1994 .pImmutableSamplers = NULL,
1995 };
1996
1997 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1998 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1999 .pNext = NULL,
2000 .count = 1,
2001 .pBinding = &dsl_binding,
2002 };
2003 VkDescriptorSetLayout ds_layout;
2004 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
2005 ASSERT_VK_SUCCESS(err);
2006
2007 VkDescriptorSet descriptorSet;
2008 uint32_t ds_count = 0;
2009 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
2010 ASSERT_VK_SUCCESS(err);
2011
2012 const VkPipelineMsStateCreateInfo pipe_ms_state_ci = {
2013 .sType = VK_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO,
2014 .pNext = NULL,
2015 .rasterSamples = 4,
2016 .multisampleEnable = 1,
2017 .sampleShadingEnable = 0,
2018 .minSampleShading = 1.0,
2019 .sampleMask = 15,
2020 };
2021
2022 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
2023 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
2024 .pNext = NULL,
2025 .descriptorSetCount = 1,
2026 .pSetLayouts = &ds_layout,
2027 };
2028
2029 VkPipelineLayout pipeline_layout;
2030 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
2031 ASSERT_VK_SUCCESS(err);
2032
2033 size_t shader_len = strlen(bindStateVertShaderText);
2034 size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
2035 void* pCode = malloc(codeSize);
2036
2037 /* try version 0 first: VkShaderStage followed by GLSL */
2038 ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
2039 ((uint32_t *) pCode)[1] = 0;
2040 ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
2041 memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
2042
2043 const VkShaderModuleCreateInfo smci = {
2044 .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
2045 .pNext = NULL,
2046 .codeSize = codeSize,
2047 .pCode = pCode,
2048 .flags = 0,
2049 };
2050 VkShaderModule vksm;
2051 err = vkCreateShaderModule(m_device->device(), &smci, &vksm);
2052 ASSERT_VK_SUCCESS(err);
2053 const VkShaderCreateInfo vs_ci = {
2054 .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
2055 .pNext = NULL,
2056 .module = vksm,
2057 .pName = "main",
2058 .flags = 0,
2059 };
2060 VkShader vs;
2061 err = vkCreateShader(m_device->device(), &vs_ci, &vs);
2062 ASSERT_VK_SUCCESS(err);
2063
2064 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
2065 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2066 .pNext = NULL,
2067 .stage = VK_SHADER_STAGE_VERTEX,
2068 .shader = vs,
2069 .linkConstBufferCount = 0,
2070 .pLinkConstBufferInfo = NULL,
2071 .pSpecializationInfo = NULL,
2072 };
2073 const VkGraphicsPipelineCreateInfo gp_ci = {
2074 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
2075 .pNext = NULL,
2076 .stageCount = 1,
2077 .pStages = &pipe_vs_ci,
2078 .pVertexInputState = NULL,
2079 .pIaState = NULL,
2080 .pTessState = NULL,
2081 .pVpState = NULL,
2082 .pRsState = NULL,
2083 .pMsState = &pipe_ms_state_ci,
2084 .pDsState = NULL,
2085 .pCbState = NULL,
2086 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
2087 .layout = pipeline_layout,
2088 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06002089 const VkPipelineCacheCreateInfo pc_ci = {
2090 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
2091 .pNext = NULL,
2092 .initialSize = 0,
2093 .initialData = 0,
2094 .maxSize = 0,
2095 };
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06002096
2097 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06002098 VkPipelineCache pipelineCache;
2099
2100 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
2101 ASSERT_VK_SUCCESS(err);
2102 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06002103 ASSERT_VK_SUCCESS(err);
2104
2105 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
2106 BeginCommandBuffer(cmdBuffer);
2107
2108 m_errorMonitor->ClearState();
2109 // Main thing we care about for this test is that the VkImage obj we're clearing matches Color Attachment of FB
2110 // Also pass down other dummy params to keep driver and paramchecker happy
2111 VkClearColorValue cCV;
2112 cCV.f32[0] = 1.0;
2113 cCV.f32[1] = 1.0;
2114 cCV.f32[2] = 1.0;
2115 cCV.f32[3] = 1.0;
2116
2117 vkCmdClearColorAttachment(cmdBuffer.GetBufferHandle(), 0, (VkImageLayout)NULL, &cCV, 0, NULL);
2118 msgFlags = m_errorMonitor->GetState(&msgString);
2119 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT) << "Did not receive error after issuing Clear Cmd on FB color attachment prior to Draw Cmd.";
2120 if (!strstr(msgString.c_str(),"vkCmdClearColorAttachment() issued on CB object ")) {
2121 FAIL() << "Error received was not 'vkCmdClearColorAttachment() issued on CB object...'";
2122 }
2123}
2124
Tobin Ehlise4076782015-06-24 15:53:07 -06002125TEST_F(VkLayerTest, VtxBufferBadIndex)
2126{
2127 // Create CmdBuffer where MSAA samples doesn't match RenderPass sampleCount
2128 VkFlags msgFlags;
2129 std::string msgString;
2130 VkResult err;
2131
2132 ASSERT_NO_FATAL_FAILURE(InitState());
2133 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2134 m_errorMonitor->ClearState();
2135 VkCommandBufferObj cmdBuffer(m_device);
2136 const VkDescriptorTypeCount ds_type_count = {
2137 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
2138 .count = 1,
2139 };
2140 const VkDescriptorPoolCreateInfo ds_pool_ci = {
2141 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
2142 .pNext = NULL,
2143 .count = 1,
2144 .pTypeCount = &ds_type_count,
2145 };
2146 VkDescriptorPool ds_pool;
2147 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
2148 ASSERT_VK_SUCCESS(err);
2149
2150 const VkDescriptorSetLayoutBinding dsl_binding = {
2151 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
2152 .arraySize = 1,
2153 .stageFlags = VK_SHADER_STAGE_ALL,
2154 .pImmutableSamplers = NULL,
2155 };
2156
2157 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
2158 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
2159 .pNext = NULL,
2160 .count = 1,
2161 .pBinding = &dsl_binding,
2162 };
2163 VkDescriptorSetLayout ds_layout;
2164 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
2165 ASSERT_VK_SUCCESS(err);
2166
2167 VkDescriptorSet descriptorSet;
2168 uint32_t ds_count = 0;
2169 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
2170 ASSERT_VK_SUCCESS(err);
2171
2172 const VkPipelineMsStateCreateInfo pipe_ms_state_ci = {
2173 .sType = VK_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO,
2174 .pNext = NULL,
Tony Barboure094edf2015-06-26 10:18:34 -06002175 .rasterSamples = 1,
Tobin Ehlise4076782015-06-24 15:53:07 -06002176 .multisampleEnable = 1,
2177 .sampleShadingEnable = 0,
2178 .minSampleShading = 1.0,
2179 .sampleMask = 15,
2180 };
2181
2182 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
2183 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
2184 .pNext = NULL,
2185 .descriptorSetCount = 1,
2186 .pSetLayouts = &ds_layout,
2187 };
2188
2189 VkPipelineLayout pipeline_layout;
2190 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
2191 ASSERT_VK_SUCCESS(err);
2192
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06002193 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlise4076782015-06-24 15:53:07 -06002194
2195 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
2196 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2197 .pNext = NULL,
2198 .stage = VK_SHADER_STAGE_VERTEX,
Chia-I Wub48eddb2015-07-03 11:49:42 +08002199 .shader = vs.handle(),
Tobin Ehlise4076782015-06-24 15:53:07 -06002200 .linkConstBufferCount = 0,
2201 .pLinkConstBufferInfo = NULL,
2202 .pSpecializationInfo = NULL,
2203 };
2204 const VkGraphicsPipelineCreateInfo gp_ci = {
2205 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
2206 .pNext = NULL,
2207 .stageCount = 1,
2208 .pStages = &pipe_vs_ci,
2209 .pVertexInputState = NULL,
2210 .pIaState = NULL,
2211 .pTessState = NULL,
2212 .pVpState = NULL,
2213 .pRsState = NULL,
2214 .pMsState = &pipe_ms_state_ci,
2215 .pDsState = NULL,
2216 .pCbState = NULL,
2217 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
2218 .layout = pipeline_layout,
2219 };
2220
Courtney Goeltzenleuchtercdf5e832015-07-10 09:21:02 -06002221 VkPipelineCacheCreateInfo pipelineCache;
2222 VkPipelineCache pipeline_cache;
2223
2224 memset(&pipelineCache, 0, sizeof(pipelineCache));
2225 pipelineCache.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2226 err = vkCreatePipelineCache(m_device->device(), &pipelineCache, &pipeline_cache);
2227
Tobin Ehlise4076782015-06-24 15:53:07 -06002228 VkPipeline pipeline;
Courtney Goeltzenleuchtercdf5e832015-07-10 09:21:02 -06002229 err = vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &gp_ci, &pipeline);
Tobin Ehlise4076782015-06-24 15:53:07 -06002230 ASSERT_VK_SUCCESS(err);
2231
2232 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
2233 BeginCommandBuffer(cmdBuffer);
2234 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2235 // Should error before calling to driver so don't care about actual data
2236 vkCmdBindVertexBuffers(cmdBuffer.GetBufferHandle(), 0, 1, NULL, NULL);
2237
2238 msgFlags = m_errorMonitor->GetState(&msgString);
2239 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding Vtx Buffer w/o VBO attached to PSO.";
2240 if (!strstr(msgString.c_str(),"Vtx Buffer Index 0 was bound, but no vtx buffers are attached to PSO.")) {
2241 FAIL() << "Error received was not 'Vtx Buffer Index 0 was bound, but no vtx buffers are attached to PSO.'";
2242 }
2243}
Tobin Ehlis57e6a612015-05-26 16:11:58 -06002244#endif
2245#if THREADING_TESTS
Mike Stroyan09aae812015-05-12 16:00:45 -06002246#if GTEST_IS_THREADSAFE
2247struct thread_data_struct {
2248 VkCmdBuffer cmdBuffer;
2249 VkEvent event;
2250 bool bailout;
2251};
2252
2253extern "C" void *AddToCommandBuffer(void *arg)
2254{
2255 struct thread_data_struct *data = (struct thread_data_struct *) arg;
2256 std::string msgString;
2257
2258 for (int i = 0; i<10000; i++) {
Tony Barbourc2e987e2015-06-29 16:20:35 -06002259 vkCmdSetEvent(data->cmdBuffer, data->event, VK_PIPELINE_STAGE_ALL_GPU_COMMANDS);
Mike Stroyan09aae812015-05-12 16:00:45 -06002260 if (data->bailout) {
2261 break;
2262 }
2263 }
2264 return NULL;
2265}
2266
2267TEST_F(VkLayerTest, ThreadCmdBufferCollision)
2268{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002269 VkFlags msgFlags;
Mike Stroyan09aae812015-05-12 16:00:45 -06002270 std::string msgString;
2271 pthread_t thread;
2272 pthread_attr_t thread_attr;
2273
2274 ASSERT_NO_FATAL_FAILURE(InitState());
2275 ASSERT_NO_FATAL_FAILURE(InitViewport());
2276 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2277
2278 VkCommandBufferObj cmdBuffer(m_device);
2279
2280 m_errorMonitor->ClearState();
2281 pthread_attr_init(&thread_attr);
2282 BeginCommandBuffer(cmdBuffer);
2283
2284 VkEventCreateInfo event_info;
2285 VkEvent event;
Mike Stroyan09aae812015-05-12 16:00:45 -06002286 VkResult err;
2287
2288 memset(&event_info, 0, sizeof(event_info));
2289 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
2290
2291 err = vkCreateEvent(device(), &event_info, &event);
2292 ASSERT_VK_SUCCESS(err);
2293
Mike Stroyan09aae812015-05-12 16:00:45 -06002294 err = vkResetEvent(device(), event);
2295 ASSERT_VK_SUCCESS(err);
2296
2297 struct thread_data_struct data;
Chia-I Wu78c2a352015-07-03 11:49:42 +08002298 data.cmdBuffer = cmdBuffer.handle();
Mike Stroyan09aae812015-05-12 16:00:45 -06002299 data.event = event;
2300 data.bailout = false;
2301 m_errorMonitor->SetBailout(&data.bailout);
2302 // Add many entries to command buffer from another thread.
2303 pthread_create(&thread, &thread_attr, AddToCommandBuffer, (void *)&data);
2304 // Add many entries to command buffer from this thread at the same time.
2305 AddToCommandBuffer(&data);
2306 pthread_join(thread, NULL);
2307 EndCommandBuffer(cmdBuffer);
2308
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002309 msgFlags = m_errorMonitor->GetState(&msgString);
Mike Stroyaned254572015-06-17 16:32:06 -06002310 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 -06002311 if (!strstr(msgString.c_str(),"THREADING ERROR")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -05002312 FAIL() << "Error received was not 'THREADING ERROR'";
Mike Stroyan09aae812015-05-12 16:00:45 -06002313 }
2314
2315}
2316#endif
Tobin Ehlis57e6a612015-05-26 16:11:58 -06002317#endif
Chris Forbes5af3bf22015-05-25 11:13:08 +12002318#if SHADER_CHECKER_TESTS
2319TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed)
2320{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002321 VkFlags msgFlags;
Chris Forbes5af3bf22015-05-25 11:13:08 +12002322 std::string msgString;
2323 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002324 ScopedUseGlsl useGlsl(false);
Chris Forbes5af3bf22015-05-25 11:13:08 +12002325
2326 char const *vsSource =
2327 "#version 140\n"
2328 "#extension GL_ARB_separate_shader_objects: require\n"
2329 "#extension GL_ARB_shading_language_420pack: require\n"
2330 "\n"
2331 "layout(location=0) out float x;\n"
2332 "void main(){\n"
2333 " gl_Position = vec4(1);\n"
2334 " x = 0;\n"
2335 "}\n";
2336 char const *fsSource =
2337 "#version 140\n"
2338 "#extension GL_ARB_separate_shader_objects: require\n"
2339 "#extension GL_ARB_shading_language_420pack: require\n"
2340 "\n"
2341 "layout(location=0) out vec4 color;\n"
2342 "void main(){\n"
2343 " color = vec4(1);\n"
2344 "}\n";
2345
2346 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2347 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2348
2349 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002350 pipe.AddColorAttachment();
Chris Forbes5af3bf22015-05-25 11:13:08 +12002351 pipe.AddShader(&vs);
2352 pipe.AddShader(&fs);
2353
2354 VkCommandBufferObj dummyCmd(m_device);
2355 VkDescriptorSetObj descriptorSet(m_device);
2356 descriptorSet.AppendDummy();
2357 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2358
2359 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002360 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes5af3bf22015-05-25 11:13:08 +12002361
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002362 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes5af3bf22015-05-25 11:13:08 +12002363
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002364 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes5af3bf22015-05-25 11:13:08 +12002365 if (!strstr(msgString.c_str(),"not consumed by fragment shader")) {
2366 FAIL() << "Incorrect warning: " << msgString;
2367 }
2368}
Chris Forbes5af3bf22015-05-25 11:13:08 +12002369
Chris Forbes3c10b852015-05-25 11:13:13 +12002370TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided)
2371{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002372 VkFlags msgFlags;
Chris Forbes3c10b852015-05-25 11:13:13 +12002373 std::string msgString;
2374 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002375 ScopedUseGlsl useGlsl(false);
Chris Forbes3c10b852015-05-25 11:13:13 +12002376
2377 char const *vsSource =
2378 "#version 140\n"
2379 "#extension GL_ARB_separate_shader_objects: require\n"
2380 "#extension GL_ARB_shading_language_420pack: require\n"
2381 "\n"
2382 "void main(){\n"
2383 " gl_Position = vec4(1);\n"
2384 "}\n";
2385 char const *fsSource =
2386 "#version 140\n"
2387 "#extension GL_ARB_separate_shader_objects: require\n"
2388 "#extension GL_ARB_shading_language_420pack: require\n"
2389 "\n"
2390 "layout(location=0) in float x;\n"
2391 "layout(location=0) out vec4 color;\n"
2392 "void main(){\n"
2393 " color = vec4(x);\n"
2394 "}\n";
2395
2396 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2397 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2398
2399 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002400 pipe.AddColorAttachment();
Chris Forbes3c10b852015-05-25 11:13:13 +12002401 pipe.AddShader(&vs);
2402 pipe.AddShader(&fs);
2403
2404 VkCommandBufferObj dummyCmd(m_device);
2405 VkDescriptorSetObj descriptorSet(m_device);
2406 descriptorSet.AppendDummy();
2407 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2408
2409 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002410 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes3c10b852015-05-25 11:13:13 +12002411
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002412 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes3c10b852015-05-25 11:13:13 +12002413
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002414 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes3c10b852015-05-25 11:13:13 +12002415 if (!strstr(msgString.c_str(),"not written by vertex shader")) {
2416 FAIL() << "Incorrect error: " << msgString;
2417 }
2418}
2419
Chris Forbescc281692015-05-25 11:13:17 +12002420TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch)
2421{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002422 VkFlags msgFlags;
Chris Forbescc281692015-05-25 11:13:17 +12002423 std::string msgString;
2424 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002425 ScopedUseGlsl useGlsl(false);
Chris Forbescc281692015-05-25 11:13:17 +12002426
2427 char const *vsSource =
2428 "#version 140\n"
2429 "#extension GL_ARB_separate_shader_objects: require\n"
2430 "#extension GL_ARB_shading_language_420pack: require\n"
2431 "\n"
2432 "layout(location=0) out int x;\n"
2433 "void main(){\n"
2434 " x = 0;\n"
2435 " gl_Position = vec4(1);\n"
2436 "}\n";
2437 char const *fsSource =
2438 "#version 140\n"
2439 "#extension GL_ARB_separate_shader_objects: require\n"
2440 "#extension GL_ARB_shading_language_420pack: require\n"
2441 "\n"
2442 "layout(location=0) in float x;\n" /* VS writes int */
2443 "layout(location=0) out vec4 color;\n"
2444 "void main(){\n"
2445 " color = vec4(x);\n"
2446 "}\n";
2447
2448 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2449 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2450
2451 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002452 pipe.AddColorAttachment();
Chris Forbescc281692015-05-25 11:13:17 +12002453 pipe.AddShader(&vs);
2454 pipe.AddShader(&fs);
2455
2456 VkCommandBufferObj dummyCmd(m_device);
2457 VkDescriptorSetObj descriptorSet(m_device);
2458 descriptorSet.AppendDummy();
2459 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2460
2461 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002462 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbescc281692015-05-25 11:13:17 +12002463
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002464 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbescc281692015-05-25 11:13:17 +12002465
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002466 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbescc281692015-05-25 11:13:17 +12002467 if (!strstr(msgString.c_str(),"Type mismatch on location 0")) {
2468 FAIL() << "Incorrect error: " << msgString;
2469 }
2470}
2471
Chris Forbes8291c052015-05-25 11:13:28 +12002472TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed)
2473{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002474 VkFlags msgFlags;
Chris Forbes8291c052015-05-25 11:13:28 +12002475 std::string msgString;
2476 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002477 ScopedUseGlsl useGlsl(false);
Chris Forbes8291c052015-05-25 11:13:28 +12002478
2479 VkVertexInputBindingDescription input_binding;
2480 memset(&input_binding, 0, sizeof(input_binding));
2481
2482 VkVertexInputAttributeDescription input_attrib;
2483 memset(&input_attrib, 0, sizeof(input_attrib));
2484 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2485
2486 char const *vsSource =
2487 "#version 140\n"
2488 "#extension GL_ARB_separate_shader_objects: require\n"
2489 "#extension GL_ARB_shading_language_420pack: require\n"
2490 "\n"
2491 "void main(){\n"
2492 " gl_Position = vec4(1);\n"
2493 "}\n";
2494 char const *fsSource =
2495 "#version 140\n"
2496 "#extension GL_ARB_separate_shader_objects: require\n"
2497 "#extension GL_ARB_shading_language_420pack: require\n"
2498 "\n"
2499 "layout(location=0) out vec4 color;\n"
2500 "void main(){\n"
2501 " color = vec4(1);\n"
2502 "}\n";
2503
2504 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2505 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2506
2507 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002508 pipe.AddColorAttachment();
Chris Forbes8291c052015-05-25 11:13:28 +12002509 pipe.AddShader(&vs);
2510 pipe.AddShader(&fs);
2511
2512 pipe.AddVertexInputBindings(&input_binding, 1);
2513 pipe.AddVertexInputAttribs(&input_attrib, 1);
2514
2515 VkCommandBufferObj dummyCmd(m_device);
2516 VkDescriptorSetObj descriptorSet(m_device);
2517 descriptorSet.AppendDummy();
2518 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2519
2520 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002521 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes8291c052015-05-25 11:13:28 +12002522
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002523 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes8291c052015-05-25 11:13:28 +12002524
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002525 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes8291c052015-05-25 11:13:28 +12002526 if (!strstr(msgString.c_str(),"location 0 not consumed by VS")) {
2527 FAIL() << "Incorrect warning: " << msgString;
2528 }
2529}
2530
Chris Forbes37367e62015-05-25 11:13:29 +12002531TEST_F(VkLayerTest, CreatePipelineAttribNotProvided)
2532{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002533 VkFlags msgFlags;
Chris Forbes37367e62015-05-25 11:13:29 +12002534 std::string msgString;
2535 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002536 ScopedUseGlsl useGlsl(false);
Chris Forbes37367e62015-05-25 11:13:29 +12002537
2538 char const *vsSource =
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) in vec4 x;\n" /* not provided */
2544 "void main(){\n"
2545 " gl_Position = x;\n"
2546 "}\n";
2547 char const *fsSource =
2548 "#version 140\n"
2549 "#extension GL_ARB_separate_shader_objects: require\n"
2550 "#extension GL_ARB_shading_language_420pack: require\n"
2551 "\n"
2552 "layout(location=0) out vec4 color;\n"
2553 "void main(){\n"
2554 " color = vec4(1);\n"
2555 "}\n";
2556
2557 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2558 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2559
2560 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002561 pipe.AddColorAttachment();
Chris Forbes37367e62015-05-25 11:13:29 +12002562 pipe.AddShader(&vs);
2563 pipe.AddShader(&fs);
2564
2565 VkCommandBufferObj dummyCmd(m_device);
2566 VkDescriptorSetObj descriptorSet(m_device);
2567 descriptorSet.AppendDummy();
2568 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2569
2570 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002571 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes37367e62015-05-25 11:13:29 +12002572
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002573 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes37367e62015-05-25 11:13:29 +12002574
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002575 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes37367e62015-05-25 11:13:29 +12002576 if (!strstr(msgString.c_str(),"VS consumes input at location 0 but not provided")) {
2577 FAIL() << "Incorrect warning: " << msgString;
2578 }
2579}
2580
Chris Forbesa4b02322015-05-25 11:13:31 +12002581TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch)
2582{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002583 VkFlags msgFlags;
Chris Forbesa4b02322015-05-25 11:13:31 +12002584 std::string msgString;
2585 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002586 ScopedUseGlsl useGlsl(false);
Chris Forbesa4b02322015-05-25 11:13:31 +12002587
2588 VkVertexInputBindingDescription input_binding;
2589 memset(&input_binding, 0, sizeof(input_binding));
2590
2591 VkVertexInputAttributeDescription input_attrib;
2592 memset(&input_attrib, 0, sizeof(input_attrib));
2593 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2594
2595 char const *vsSource =
2596 "#version 140\n"
2597 "#extension GL_ARB_separate_shader_objects: require\n"
2598 "#extension GL_ARB_shading_language_420pack: require\n"
2599 "\n"
2600 "layout(location=0) in int x;\n" /* attrib provided float */
2601 "void main(){\n"
2602 " gl_Position = vec4(x);\n"
2603 "}\n";
2604 char const *fsSource =
2605 "#version 140\n"
2606 "#extension GL_ARB_separate_shader_objects: require\n"
2607 "#extension GL_ARB_shading_language_420pack: require\n"
2608 "\n"
2609 "layout(location=0) out vec4 color;\n"
2610 "void main(){\n"
2611 " color = vec4(1);\n"
2612 "}\n";
2613
2614 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2615 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2616
2617 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002618 pipe.AddColorAttachment();
Chris Forbesa4b02322015-05-25 11:13:31 +12002619 pipe.AddShader(&vs);
2620 pipe.AddShader(&fs);
2621
2622 pipe.AddVertexInputBindings(&input_binding, 1);
2623 pipe.AddVertexInputAttribs(&input_attrib, 1);
2624
2625 VkCommandBufferObj dummyCmd(m_device);
2626 VkDescriptorSetObj descriptorSet(m_device);
2627 descriptorSet.AppendDummy();
2628 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2629
2630 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002631 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbesa4b02322015-05-25 11:13:31 +12002632
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002633 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbesa4b02322015-05-25 11:13:31 +12002634
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002635 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbesa4b02322015-05-25 11:13:31 +12002636 if (!strstr(msgString.c_str(),"location 0 does not match VS input type")) {
2637 FAIL() << "Incorrect error: " << msgString;
2638 }
2639}
2640
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002641TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict)
2642{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002643 VkFlags msgFlags;
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002644 std::string msgString;
2645 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002646 ScopedUseGlsl useGlsl(false);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002647
2648 /* Two binding descriptions for binding 0 */
2649 VkVertexInputBindingDescription input_bindings[2];
2650 memset(input_bindings, 0, sizeof(input_bindings));
2651
2652 VkVertexInputAttributeDescription input_attrib;
2653 memset(&input_attrib, 0, sizeof(input_attrib));
2654 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2655
2656 char const *vsSource =
2657 "#version 140\n"
2658 "#extension GL_ARB_separate_shader_objects: require\n"
2659 "#extension GL_ARB_shading_language_420pack: require\n"
2660 "\n"
2661 "layout(location=0) in float x;\n" /* attrib provided float */
2662 "void main(){\n"
2663 " gl_Position = vec4(x);\n"
2664 "}\n";
2665 char const *fsSource =
2666 "#version 140\n"
2667 "#extension GL_ARB_separate_shader_objects: require\n"
2668 "#extension GL_ARB_shading_language_420pack: require\n"
2669 "\n"
2670 "layout(location=0) out vec4 color;\n"
2671 "void main(){\n"
2672 " color = vec4(1);\n"
2673 "}\n";
2674
2675 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2676 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2677
2678 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002679 pipe.AddColorAttachment();
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002680 pipe.AddShader(&vs);
2681 pipe.AddShader(&fs);
2682
2683 pipe.AddVertexInputBindings(input_bindings, 2);
2684 pipe.AddVertexInputAttribs(&input_attrib, 1);
2685
2686 VkCommandBufferObj dummyCmd(m_device);
2687 VkDescriptorSetObj descriptorSet(m_device);
2688 descriptorSet.AppendDummy();
2689 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2690
2691 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002692 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002693
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002694 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002695
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002696 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002697 if (!strstr(msgString.c_str(),"Duplicate vertex input binding descriptions for binding 0")) {
2698 FAIL() << "Incorrect error: " << msgString;
2699 }
2700}
Chris Forbes4c948702015-05-25 11:13:32 +12002701
Chris Forbesc12ef122015-05-25 11:13:40 +12002702/* TODO: would be nice to test the mixed broadcast & custom case, but the GLSL->SPV compiler
2703 * rejects it. */
2704
2705TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten)
2706{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002707 VkFlags msgFlags;
Chris Forbesc12ef122015-05-25 11:13:40 +12002708 std::string msgString;
2709 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002710 ScopedUseGlsl useGlsl(false);
Chris Forbesc12ef122015-05-25 11:13:40 +12002711
2712 char const *vsSource =
2713 "#version 140\n"
2714 "#extension GL_ARB_separate_shader_objects: require\n"
2715 "#extension GL_ARB_shading_language_420pack: require\n"
2716 "\n"
2717 "void main(){\n"
2718 " gl_Position = vec4(1);\n"
2719 "}\n";
2720 char const *fsSource =
2721 "#version 140\n"
2722 "#extension GL_ARB_separate_shader_objects: require\n"
2723 "#extension GL_ARB_shading_language_420pack: require\n"
2724 "\n"
2725 "void main(){\n"
2726 "}\n";
2727
2728 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2729 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2730
2731 VkPipelineObj pipe(m_device);
2732 pipe.AddShader(&vs);
2733 pipe.AddShader(&fs);
2734
Chia-I Wuc278df82015-07-07 11:50:03 +08002735 /* set up CB 0, not written */
2736 pipe.AddColorAttachment();
2737 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc12ef122015-05-25 11:13:40 +12002738
2739 VkCommandBufferObj dummyCmd(m_device);
2740 VkDescriptorSetObj descriptorSet(m_device);
2741 descriptorSet.AppendDummy();
2742 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2743
2744 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002745 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbesc12ef122015-05-25 11:13:40 +12002746
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002747 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbesc12ef122015-05-25 11:13:40 +12002748
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002749 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbesc12ef122015-05-25 11:13:40 +12002750 if (!strstr(msgString.c_str(),"Attachment 0 not written by FS")) {
2751 FAIL() << "Incorrect error: " << msgString;
2752 }
2753}
2754
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002755TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed)
2756{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002757 VkFlags msgFlags;
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002758 std::string msgString;
2759 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002760 ScopedUseGlsl useGlsl(false);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002761
2762 char const *vsSource =
2763 "#version 140\n"
2764 "#extension GL_ARB_separate_shader_objects: require\n"
2765 "#extension GL_ARB_shading_language_420pack: require\n"
2766 "\n"
2767 "void main(){\n"
2768 " gl_Position = vec4(1);\n"
2769 "}\n";
2770 char const *fsSource =
2771 "#version 140\n"
2772 "#extension GL_ARB_separate_shader_objects: require\n"
2773 "#extension GL_ARB_shading_language_420pack: require\n"
2774 "\n"
2775 "layout(location=0) out vec4 x;\n"
2776 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
2777 "void main(){\n"
2778 " x = vec4(1);\n"
2779 " y = vec4(1);\n"
2780 "}\n";
2781
2782 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2783 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2784
2785 VkPipelineObj pipe(m_device);
2786 pipe.AddShader(&vs);
2787 pipe.AddShader(&fs);
2788
Chia-I Wuc278df82015-07-07 11:50:03 +08002789 /* set up CB 0, not written */
2790 pipe.AddColorAttachment();
2791 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002792 /* FS writes CB 1, but we don't configure it */
2793
2794 VkCommandBufferObj dummyCmd(m_device);
2795 VkDescriptorSetObj descriptorSet(m_device);
2796 descriptorSet.AppendDummy();
2797 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2798
2799 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002800 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002801
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002802 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002803
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002804 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002805 if (!strstr(msgString.c_str(),"FS writes to output location 1 with no matching attachment")) {
2806 FAIL() << "Incorrect warning: " << msgString;
2807 }
2808}
2809
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002810TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch)
2811{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002812 VkFlags msgFlags;
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002813 std::string msgString;
2814 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002815 ScopedUseGlsl useGlsl(false);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002816
2817 char const *vsSource =
2818 "#version 140\n"
2819 "#extension GL_ARB_separate_shader_objects: require\n"
2820 "#extension GL_ARB_shading_language_420pack: require\n"
2821 "\n"
2822 "void main(){\n"
2823 " gl_Position = vec4(1);\n"
2824 "}\n";
2825 char const *fsSource =
2826 "#version 140\n"
2827 "#extension GL_ARB_separate_shader_objects: require\n"
2828 "#extension GL_ARB_shading_language_420pack: require\n"
2829 "\n"
2830 "layout(location=0) out ivec4 x;\n" /* not UNORM */
2831 "void main(){\n"
2832 " x = ivec4(1);\n"
2833 "}\n";
2834
2835 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2836 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2837
2838 VkPipelineObj pipe(m_device);
2839 pipe.AddShader(&vs);
2840 pipe.AddShader(&fs);
2841
Chia-I Wuc278df82015-07-07 11:50:03 +08002842 /* set up CB 0; type is UNORM by default */
2843 pipe.AddColorAttachment();
2844 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002845
2846 VkCommandBufferObj dummyCmd(m_device);
2847 VkDescriptorSetObj descriptorSet(m_device);
2848 descriptorSet.AppendDummy();
2849 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2850
2851 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002852 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002853
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002854 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002855
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002856 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002857 if (!strstr(msgString.c_str(),"does not match FS output type")) {
2858 FAIL() << "Incorrect error: " << msgString;
2859 }
2860}
Chris Forbesc2050732015-06-05 14:43:36 +12002861
2862TEST_F(VkLayerTest, CreatePipelineNonSpirvShader)
2863{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002864 VkFlags msgFlags;
Chris Forbesc2050732015-06-05 14:43:36 +12002865 std::string msgString;
2866 ASSERT_NO_FATAL_FAILURE(InitState());
2867 /* Intentionally provided GLSL rather than compiling to SPIRV first */
Cody Northrop1cfbd172015-06-03 16:49:20 -06002868 ScopedUseGlsl useGlsl(true);
Chris Forbesc2050732015-06-05 14:43:36 +12002869
2870 char const *vsSource =
2871 "#version 140\n"
2872 "#extension GL_ARB_separate_shader_objects: require\n"
2873 "#extension GL_ARB_shading_language_420pack: require\n"
2874 "\n"
2875 "void main(){\n"
2876 " gl_Position = vec4(1);\n"
2877 "}\n";
2878 char const *fsSource =
2879 "#version 140\n"
2880 "#extension GL_ARB_separate_shader_objects: require\n"
2881 "#extension GL_ARB_shading_language_420pack: require\n"
2882 "\n"
2883 "layout(location=0) out vec4 x;\n"
2884 "void main(){\n"
2885 " x = vec4(1);\n"
2886 "}\n";
2887
2888 m_errorMonitor->ClearState();
2889
2890 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2891 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2892
2893
2894 VkPipelineObj pipe(m_device);
2895 pipe.AddShader(&vs);
2896 pipe.AddShader(&fs);
2897
Chia-I Wuc278df82015-07-07 11:50:03 +08002898 /* set up CB 0; type is UNORM by default */
2899 pipe.AddColorAttachment();
2900 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc2050732015-06-05 14:43:36 +12002901
2902 VkCommandBufferObj dummyCmd(m_device);
2903 VkDescriptorSetObj descriptorSet(m_device);
2904 descriptorSet.AppendDummy();
2905 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2906
Chia-I Wuc278df82015-07-07 11:50:03 +08002907 VkResult res = pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbesc2050732015-06-05 14:43:36 +12002908 /* pipeline creation should have succeeded */
2909 ASSERT_EQ(VK_SUCCESS, res);
2910
2911 /* should have emitted a warning: the shader is not SPIRV, so we're
2912 * not going to be able to analyze it */
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002913 msgFlags = m_errorMonitor->GetState(&msgString);
2914 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbesc2050732015-06-05 14:43:36 +12002915 if (!strstr(msgString.c_str(),"is not SPIR-V")) {
2916 FAIL() << "Incorrect warning: " << msgString;
2917 }
2918}
Chris Forbes01c9db72015-06-04 09:25:25 +12002919#endif
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002920
Tony Barbour30486ea2015-04-07 13:44:53 -06002921int main(int argc, char **argv) {
2922 int result;
2923
2924 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour01999182015-04-09 12:58:51 -06002925 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour30486ea2015-04-07 13:44:53 -06002926
2927 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
2928
2929 result = RUN_ALL_TESTS();
2930
Tony Barbour01999182015-04-09 12:58:51 -06002931 VkTestFramework::Finish();
Tony Barbour30486ea2015-04-07 13:44:53 -06002932 return result;
2933}