blob: 6a593f02db5a8184d7c1fbee240e849e347f1892 [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 };
Tony Barboure307f582015-07-10 15:29:03 -0600319 VkPipelineDepthStencilStateCreateInfo ds_ci = {
320 .sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600321 .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
Tobin Ehlis33ce8fd2015-07-10 18:25:07 -0600400 cmdBuffer.BeginCommandBuffer();
Mark Lobodzinski81078192015-05-19 10:28:29 -0500401 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tobin Ehlis33ce8fd2015-07-10 18:25:07 -0600402 cmdBuffer.EndCommandBuffer();
Mark Lobodzinski81078192015-05-19 10:28:29 -0500403
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
Tobin Ehlis33ce8fd2015-07-10 18:25:07 -0600413 cmdBuffer.BeginCommandBuffer();
Mark Lobodzinski81078192015-05-19 10:28:29 -0500414
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
Tobin Ehlis33ce8fd2015-07-10 18:25:07 -0600560// TODO : Is this test still valid. Not sure it is with updates to memory binding model
561// Verify and delete the test of fix the check
562//TEST_F(VkLayerTest, FreeBoundMemory)
563//{
564// VkFlags msgFlags;
565// std::string msgString;
566// VkResult err;
567//
568// ASSERT_NO_FATAL_FAILURE(InitState());
569// m_errorMonitor->ClearState();
570//
571// // Create an image, allocate memory, free it, and then try to bind it
572// VkImage image;
573// VkDeviceMemory mem;
574// VkMemoryRequirements mem_reqs;
575//
576// const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
577// const int32_t tex_width = 32;
578// const int32_t tex_height = 32;
579//
580// const VkImageCreateInfo image_create_info = {
581// .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
582// .pNext = NULL,
583// .imageType = VK_IMAGE_TYPE_2D,
584// .format = tex_format,
585// .extent = { tex_width, tex_height, 1 },
586// .mipLevels = 1,
587// .arraySize = 1,
588// .samples = 1,
589// .tiling = VK_IMAGE_TILING_LINEAR,
590// .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
591// .flags = 0,
592// };
593// VkMemoryAllocInfo mem_alloc = {
594// .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
595// .pNext = NULL,
596// .allocationSize = 0,
597// .memoryTypeIndex = 0,
598// };
599//
600// err = vkCreateImage(m_device->device(), &image_create_info, &image);
601// ASSERT_VK_SUCCESS(err);
602//
603// err = vkGetImageMemoryRequirements(m_device->device(),
604// image,
605// &mem_reqs);
606// ASSERT_VK_SUCCESS(err);
607//
608// mem_alloc.allocationSize = mem_reqs.size;
609//
610// err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
611// ASSERT_VK_SUCCESS(err);
612//
613// // allocate memory
614// err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
615// ASSERT_VK_SUCCESS(err);
616//
617// // Bind memory to Image object
618// err = vkBindImageMemory(m_device->device(), image, mem, 0);
619// ASSERT_VK_SUCCESS(err);
620//
621// // Introduce validation failure, free memory while still bound to object
622// vkFreeMemory(m_device->device(), mem);
623// ASSERT_VK_SUCCESS(err);
624//
625// msgFlags = m_errorMonitor->GetState(&msgString);
626// ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an warning while tring to free bound memory";
627// if (!strstr(msgString.c_str(),"Freeing memory object while it still has references")) {
628// FAIL() << "Warning received did not match expected message from freeMemObjInfo in MemTracker";
629// }
630//}
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500631
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500632TEST_F(VkLayerTest, RebindMemory)
633{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600634 VkFlags msgFlags;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500635 std::string msgString;
636 VkResult err;
637
638 ASSERT_NO_FATAL_FAILURE(InitState());
639 m_errorMonitor->ClearState();
640
641 // Create an image, allocate memory, free it, and then try to bind it
642 VkImage image;
643 VkDeviceMemory mem1;
644 VkDeviceMemory mem2;
645 VkMemoryRequirements mem_reqs;
646
647 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
648 const int32_t tex_width = 32;
649 const int32_t tex_height = 32;
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500650
651 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600652 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
653 .pNext = NULL,
654 .imageType = VK_IMAGE_TYPE_2D,
655 .format = tex_format,
656 .extent = { tex_width, tex_height, 1 },
657 .mipLevels = 1,
658 .arraySize = 1,
659 .samples = 1,
660 .tiling = VK_IMAGE_TILING_LINEAR,
661 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
662 .flags = 0,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500663 };
664 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600665 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
666 .pNext = NULL,
667 .allocationSize = 0,
668 .memoryTypeIndex = 0,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500669 };
670
671 err = vkCreateImage(m_device->device(), &image_create_info, &image);
672 ASSERT_VK_SUCCESS(err);
673
Tony Barboure84a8d62015-07-10 14:10:27 -0600674 err = vkGetImageMemoryRequirements(m_device->device(),
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500675 image,
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500676 &mem_reqs);
677 ASSERT_VK_SUCCESS(err);
678
679 mem_alloc.allocationSize = mem_reqs.size;
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800680 err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinski72346292015-07-02 16:49:40 -0600681 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500682
683 // allocate 2 memory objects
684 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem1);
685 ASSERT_VK_SUCCESS(err);
686 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem2);
687 ASSERT_VK_SUCCESS(err);
688
689 // Bind first memory object to Image object
Tony Barboure84a8d62015-07-10 14:10:27 -0600690 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500691 ASSERT_VK_SUCCESS(err);
692
693 // Introduce validation failure, try to bind a different memory object to the same image object
Tony Barboure84a8d62015-07-10 14:10:27 -0600694 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinskic66c6712015-06-05 13:59:04 -0500695 ASSERT_VK_SUCCESS(err);
696
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600697 msgFlags = m_errorMonitor->GetState(&msgString);
698 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 -0500699 if (!strstr(msgString.c_str(),"which has already been bound to mem object")) {
700 FAIL() << "Error received did not match expected message when rebinding memory to an object";
701 }
702}
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500703
704TEST_F(VkLayerTest, BindMemoryToDestroyedObject)
705{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600706 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500707 std::string msgString;
708 VkResult err;
709
710 ASSERT_NO_FATAL_FAILURE(InitState());
711 m_errorMonitor->ClearState();
712
713 // Create an image object, allocate memory, destroy the object and then try to bind it
714 VkImage image;
Mark Lobodzinski23182612015-05-29 09:32:35 -0500715 VkDeviceMemory mem;
716 VkMemoryRequirements mem_reqs;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500717
718 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
719 const int32_t tex_width = 32;
720 const int32_t tex_height = 32;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500721
722 const VkImageCreateInfo image_create_info = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600723 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
724 .pNext = NULL,
725 .imageType = VK_IMAGE_TYPE_2D,
726 .format = tex_format,
727 .extent = { tex_width, tex_height, 1 },
728 .mipLevels = 1,
729 .arraySize = 1,
730 .samples = 1,
731 .tiling = VK_IMAGE_TILING_LINEAR,
732 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
733 .flags = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500734 };
735 VkMemoryAllocInfo mem_alloc = {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600736 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
737 .pNext = NULL,
738 .allocationSize = 0,
739 .memoryTypeIndex = 0,
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500740 };
741
742 err = vkCreateImage(m_device->device(), &image_create_info, &image);
743 ASSERT_VK_SUCCESS(err);
744
Tony Barboure84a8d62015-07-10 14:10:27 -0600745 err = vkGetImageMemoryRequirements(m_device->device(),
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500746 image,
Mark Lobodzinski23182612015-05-29 09:32:35 -0500747 &mem_reqs);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500748 ASSERT_VK_SUCCESS(err);
749
Mark Lobodzinski23182612015-05-29 09:32:35 -0500750 mem_alloc.allocationSize = mem_reqs.size;
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800751 err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinski72346292015-07-02 16:49:40 -0600752 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500753
754 // Allocate memory
Mark Lobodzinski23182612015-05-29 09:32:35 -0500755 err = vkAllocMemory(m_device->device(), &mem_alloc, &mem);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500756 ASSERT_VK_SUCCESS(err);
757
758 // Introduce validation failure, destroy Image object before binding
Tony Barboure84a8d62015-07-10 14:10:27 -0600759 vkDestroyImage(m_device->device(), image);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500760 ASSERT_VK_SUCCESS(err);
761
762 // Now Try to bind memory to this destroyted object
Tony Barboure84a8d62015-07-10 14:10:27 -0600763 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500764 ASSERT_VK_SUCCESS(err);
765
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600766 msgFlags = m_errorMonitor->GetState(&msgString);
767 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 -0500768 if (!strstr(msgString.c_str(),"that's not in global list")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500769 FAIL() << "Error received did not match expected error message from updateObjectBinding in MemTracker";
770 }
771}
772
Tony Barbour8508b8e2015-04-09 10:48:04 -0600773TEST_F(VkLayerTest, SubmitSignaledFence)
Tony Barbour30486ea2015-04-07 13:44:53 -0600774{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600775 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600776 VkFlags msgFlags;
Tony Barbour30486ea2015-04-07 13:44:53 -0600777 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600778
779 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600780 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
781 fenceInfo.pNext = NULL;
782 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour30486ea2015-04-07 13:44:53 -0600783
Tony Barbour30486ea2015-04-07 13:44:53 -0600784 ASSERT_NO_FATAL_FAILURE(InitState());
785 ASSERT_NO_FATAL_FAILURE(InitViewport());
786 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
787
Tony Barbour01999182015-04-09 12:58:51 -0600788 VkCommandBufferObj cmdBuffer(m_device);
Tony Barbour30486ea2015-04-07 13:44:53 -0600789 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
790
Tony Barbour8508b8e2015-04-09 10:48:04 -0600791 BeginCommandBuffer(cmdBuffer);
Tony Barbour30486ea2015-04-07 13:44:53 -0600792 cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour8508b8e2015-04-09 10:48:04 -0600793 EndCommandBuffer(cmdBuffer);
Tony Barbour30486ea2015-04-07 13:44:53 -0600794
795 testFence.init(*m_device, fenceInfo);
796 m_errorMonitor->ClearState();
Chia-I Wua4992342015-07-03 11:45:55 +0800797 cmdBuffer.QueueCommandBuffer(testFence.handle());
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600798 msgFlags = m_errorMonitor->GetState(&msgString);
799 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 -0600800 if (!strstr(msgString.c_str(),"submitted in SIGNALED state. Fences must be reset before being submitted")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500801 FAIL() << "Error received was not 'VkQueueSubmit with fence in SIGNALED_STATE'";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600802 }
803
804}
805
806TEST_F(VkLayerTest, ResetUnsignaledFence)
807{
808 vk_testing::Fence testFence;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600809 VkFlags msgFlags;
Tony Barbour8508b8e2015-04-09 10:48:04 -0600810 std::string msgString;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600811 VkFenceCreateInfo fenceInfo = {};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600812 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
813 fenceInfo.pNext = NULL;
814
Tony Barbour8508b8e2015-04-09 10:48:04 -0600815 ASSERT_NO_FATAL_FAILURE(InitState());
816 testFence.init(*m_device, fenceInfo);
817 m_errorMonitor->ClearState();
Chia-I Wua4992342015-07-03 11:45:55 +0800818 VkFence fences[1] = {testFence.handle()};
Tony Barbour8508b8e2015-04-09 10:48:04 -0600819 vkResetFences(m_device->device(), 1, fences);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600820 msgFlags = m_errorMonitor->GetState(&msgString);
821 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 -0600822 if (!strstr(msgString.c_str(),"submitted to VkResetFences in UNSIGNALED STATE")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500823 FAIL() << "Error received was not 'VkResetFences with fence in UNSIGNALED_STATE'";
Tony Barbour8508b8e2015-04-09 10:48:04 -0600824 }
Tony Barbour30486ea2015-04-07 13:44:53 -0600825
826}
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600827
Chia-I Wuc278df82015-07-07 11:50:03 +0800828/* TODO: Update for changes due to bug-14075 tiling across render passes */
829#if 0
Tobin Ehlisd94ba722015-07-03 08:45:14 -0600830TEST_F(VkLayerTest, InvalidUsageBits)
831{
832 // Initiate Draw w/o a PSO bound
833 VkFlags msgFlags;
834 std::string msgString;
835
836 ASSERT_NO_FATAL_FAILURE(InitState());
837 m_errorMonitor->ClearState();
838 VkCommandBufferObj cmdBuffer(m_device);
839 BeginCommandBuffer(cmdBuffer);
840
841 const VkExtent3D e3d = {
842 .width = 128,
843 .height = 128,
844 .depth = 1,
845 };
846 const VkImageCreateInfo ici = {
847 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
848 .pNext = NULL,
849 .imageType = VK_IMAGE_TYPE_2D,
850 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
851 .extent = e3d,
852 .mipLevels = 1,
853 .arraySize = 1,
854 .samples = 1,
855 .tiling = VK_IMAGE_TILING_LINEAR,
856 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_BIT
857 .flags = 0,
858 };
859
860 VkImage dsi;
861 vkCreateImage(m_device->device(), &ici, &dsi);
862 VkDepthStencilView dsv;
863 const VkDepthStencilViewCreateInfo dsvci = {
864 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
865 .pNext = NULL,
866 .image = dsi,
867 .mipLevel = 0,
868 .baseArraySlice = 0,
869 .arraySize = 1,
870 .flags = 0,
871 };
872 vkCreateDepthStencilView(m_device->device(), &dsvci, &dsv);
873 msgFlags = m_errorMonitor->GetState(&msgString);
874 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after attempting to create DSView w/ image lacking USAGE_DS_BIT flag";
875 if (!strstr(msgString.c_str(),"Invalid usage flag for image ")) {
876 FAIL() << "Error received was not 'Invalid usage flag for image...'";
877 }
878}
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600879#endif
Chia-I Wuc278df82015-07-07 11:50:03 +0800880#endif
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600881#if OBJ_TRACKER_TESTS
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500882TEST_F(VkLayerTest, RasterStateNotBound)
883{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600884 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500885 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600886 ASSERT_NO_FATAL_FAILURE(InitState());
887 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500888 TEST_DESCRIPTION("Simple Draw Call that validates failure when a raster state object is not bound beforehand");
889
890 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailRaster);
891
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600892 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600893 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 -0500894 if (!strstr(msgString.c_str(),"Raster object not bound to this command buffer")) {
895 FAIL() << "Error received was not 'Raster object not bound to this command buffer'";
896 }
897}
898
899TEST_F(VkLayerTest, ViewportStateNotBound)
900{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600901 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500902 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600903 ASSERT_NO_FATAL_FAILURE(InitState());
904 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500905 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport state object is not bound beforehand");
906
907 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
908
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600909 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600910 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 -0500911 if (!strstr(msgString.c_str(),"Viewport object not bound to this command buffer")) {
912 FAIL() << "Error received was not 'Viewport object not bound to this command buffer'";
913 }
914}
915
916TEST_F(VkLayerTest, ColorBlendStateNotBound)
917{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600918 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500919 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600920 ASSERT_NO_FATAL_FAILURE(InitState());
921 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500922 TEST_DESCRIPTION("Simple Draw Call that validates failure when a color-blend state object is not bound beforehand");
923
924 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailColorBlend);
925
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600926 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600927 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 -0500928 if (!strstr(msgString.c_str(),"Color-blend object not bound to this command buffer")) {
929 FAIL() << "Error received was not 'Color-blend object not bound to this command buffer'";
930 }
931}
932
933TEST_F(VkLayerTest, DepthStencilStateNotBound)
934{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600935 VkFlags msgFlags;
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500936 std::string msgString;
Tobin Ehlis254eca02015-06-25 15:46:59 -0600937 ASSERT_NO_FATAL_FAILURE(InitState());
938 m_errorMonitor->ClearState();
Mark Lobodzinski5f25be42015-05-14 15:08:13 -0500939 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth-stencil state object is not bound beforehand");
940
941 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthStencil);
942
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600943 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600944 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 -0500945 if (!strstr(msgString.c_str(),"Depth-stencil object not bound to this command buffer")) {
946 FAIL() << "Error received was not 'Depth-stencil object not bound to this command buffer'";
947 }
Tony Barbourdb686622015-05-06 09:35:56 -0600948}
Tobin Ehlis57e6a612015-05-26 16:11:58 -0600949#endif
950#if DRAW_STATE_TESTS
Tobin Ehlise4076782015-06-24 15:53:07 -0600951TEST_F(VkLayerTest, BindPipelineNoRenderPass)
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600952{
953 // Initiate Draw w/o a PSO bound
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600954 VkFlags msgFlags;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600955 std::string msgString;
956
957 ASSERT_NO_FATAL_FAILURE(InitState());
958 m_errorMonitor->ClearState();
959 VkCommandBufferObj cmdBuffer(m_device);
960 BeginCommandBuffer(cmdBuffer);
961 VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
962 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600963 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlise4076782015-06-24 15:53:07 -0600964 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding pipeline to CmdBuffer w/o active RenderPass";
965 if (!strstr(msgString.c_str(),"Incorrectly binding graphics pipeline ")) {
966 FAIL() << "Error received was not 'Incorrectly binding graphics pipeline (0xbaadb1be) without an active RenderPass'";
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600967 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600968}
969
970TEST_F(VkLayerTest, InvalidDescriptorPool)
971{
972 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
973 // The DS check for this is after driver has been called to validate DS internal data struct
974 // Attempt to clear DS Pool with bad object
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600975/* VkFlags msgFlags;
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600976 std::string msgString;
977 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
978 vkResetDescriptorPool(device(), badPool);
979
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600980 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis40e9f522015-06-25 11:58:41 -0600981 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 -0600982 if (!strstr(msgString.c_str(),"Unable to find pool node for pool 0xbaad6001 specified in vkResetDescriptorPool() call")) {
983 FAIL() << "Error received was note 'Unable to find pool node for pool 0xbaad6001 specified in vkResetDescriptorPool() call'";
984 }*/
985}
986
987TEST_F(VkLayerTest, InvalidDescriptorSet)
988{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -0600989 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
990 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -0600991 // Create a valid cmd buffer
992 // call vkCmdBindDescriptorSets w/ false DS
993}
994
995TEST_F(VkLayerTest, InvalidDescriptorSetLayout)
996{
997 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
998 // The DS check for this is after driver has been called to validate DS internal data struct
999}
1000
1001TEST_F(VkLayerTest, InvalidPipeline)
1002{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001003 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1004 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001005 // Create a valid cmd buffer
1006 // call vkCmdBindPipeline w/ false Pipeline
Tobin Ehlise4076782015-06-24 15:53:07 -06001007// VkFlags msgFlags;
1008// std::string msgString;
1009//
1010// ASSERT_NO_FATAL_FAILURE(InitState());
1011// m_errorMonitor->ClearState();
1012// VkCommandBufferObj cmdBuffer(m_device);
1013// BeginCommandBuffer(cmdBuffer);
1014// VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
1015// vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
1016// msgFlags = m_errorMonitor->GetState(&msgString);
1017// ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding invalid pipeline to CmdBuffer";
1018// if (!strstr(msgString.c_str(),"Attempt to bind Pipeline ")) {
1019// FAIL() << "Error received was not 'Attempt to bind Pipeline 0xbaadb1be that doesn't exist!'";
1020// }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001021}
1022
Tobin Ehlis254eca02015-06-25 15:46:59 -06001023TEST_F(VkLayerTest, DescriptorSetNotUpdated)
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001024{
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001025 // Create and update CmdBuffer then call QueueSubmit w/o calling End on CmdBuffer
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001026 VkFlags msgFlags;
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001027 std::string msgString;
1028 VkResult err;
1029
1030 ASSERT_NO_FATAL_FAILURE(InitState());
1031 m_errorMonitor->ClearState();
1032 VkCommandBufferObj cmdBuffer(m_device);
1033 const VkDescriptorTypeCount ds_type_count = {
1034 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1035 .count = 1,
1036 };
1037 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1038 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1039 .pNext = NULL,
1040 .count = 1,
1041 .pTypeCount = &ds_type_count,
1042 };
1043 VkDescriptorPool ds_pool;
1044 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1045 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001046
1047 const VkDescriptorSetLayoutBinding dsl_binding = {
1048 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001049 .arraySize = 1,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001050 .stageFlags = VK_SHADER_STAGE_ALL,
1051 .pImmutableSamplers = NULL,
1052 };
1053
1054 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1055 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1056 .pNext = NULL,
1057 .count = 1,
1058 .pBinding = &dsl_binding,
1059 };
1060 VkDescriptorSetLayout ds_layout;
1061 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1062 ASSERT_VK_SUCCESS(err);
1063
1064 VkDescriptorSet descriptorSet;
1065 uint32_t ds_count = 0;
1066 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1067 ASSERT_VK_SUCCESS(err);
1068
1069 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1070 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1071 .pNext = NULL,
1072 .descriptorSetCount = 1,
1073 .pSetLayouts = &ds_layout,
1074 };
1075
1076 VkPipelineLayout pipeline_layout;
1077 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1078 ASSERT_VK_SUCCESS(err);
1079
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001080 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001081
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001082 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1083 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1084 .pNext = NULL,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001085 .stage = VK_SHADER_STAGE_VERTEX,
Chia-I Wub48eddb2015-07-03 11:49:42 +08001086 .shader = vs.handle(),
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001087 .linkConstBufferCount = 0,
1088 .pLinkConstBufferInfo = NULL,
1089 .pSpecializationInfo = NULL,
1090 };
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001091 const VkGraphicsPipelineCreateInfo gp_ci = {
Tony Barboure307f582015-07-10 15:29:03 -06001092 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1093 .pNext = NULL,
1094 .stageCount = 1,
1095 .pStages = &pipe_vs_ci,
1096 .pVertexInputState = NULL,
1097 .pInputAssemblyState = NULL,
1098 .pTessellationState = NULL,
1099 .pViewportState = NULL,
1100 .pRasterState = NULL,
1101 .pMultisampleState = NULL,
1102 .pDepthStencilState = NULL,
1103 .pColorBlendState = NULL,
1104 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1105 .layout = pipeline_layout,
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001106 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06001107 const VkPipelineCacheCreateInfo pc_ci = {
1108 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1109 .pNext = NULL,
1110 .initialSize = 0,
1111 .initialData = 0,
1112 .maxSize = 0,
1113 };
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001114
1115 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001116 VkPipelineCache pipelineCache;
1117
1118 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1119 ASSERT_VK_SUCCESS(err);
1120 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001121 ASSERT_VK_SUCCESS(err);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001122 ASSERT_NO_FATAL_FAILURE(InitState());
1123 ASSERT_NO_FATAL_FAILURE(InitViewport());
1124 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1125 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1126 BeginCommandBuffer(cmdBuffer);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001127 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinskia65c4632015-06-15 13:21:21 -06001128 vkCmdBindDescriptorSets(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001129
Tobin Ehlis254eca02015-06-25 15:46:59 -06001130 msgFlags = m_errorMonitor->GetState(&msgString);
1131 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT) << "Did not warn after binding a DescriptorSet that was never updated.";
1132 if (!strstr(msgString.c_str()," bound but it was never updated. ")) {
1133 FAIL() << "Error received was not 'DS <blah> bound but it was never updated. You may want to either update it or not bind it.'";
1134 }
1135}
1136
1137TEST_F(VkLayerTest, NoBeginCmdBuffer)
1138{
1139 VkFlags msgFlags;
1140 std::string msgString;
1141
1142 ASSERT_NO_FATAL_FAILURE(InitState());
1143 m_errorMonitor->ClearState();
1144 VkCommandBufferObj cmdBuffer(m_device);
1145 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
1146 vkEndCommandBuffer(cmdBuffer.GetBufferHandle());
1147 msgFlags = m_errorMonitor->GetState(&msgString);
1148 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after ending a CmdBuffer w/o calling BeginCommandBuffer()";
1149 if (!strstr(msgString.c_str(),"You must call vkBeginCommandBuffer() before this call to ")) {
1150 FAIL() << "Error received was not 'You must call vkBeginCommandBuffer() before this call to vkEndCommandBuffer()'";
1151 }
1152}
1153
1154TEST_F(VkLayerTest, InvalidPipelineCreateState)
1155{
1156 // Attempt to Create Gfx Pipeline w/o a VS
1157 VkFlags msgFlags;
1158 std::string msgString;
1159 VkResult err;
1160
1161 ASSERT_NO_FATAL_FAILURE(InitState());
1162 m_errorMonitor->ClearState();
1163 VkCommandBufferObj cmdBuffer(m_device);
1164 const VkDescriptorTypeCount ds_type_count = {
1165 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1166 .count = 1,
1167 };
1168 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1169 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1170 .pNext = NULL,
1171 .count = 1,
1172 .pTypeCount = &ds_type_count,
1173 };
1174 VkDescriptorPool ds_pool;
1175 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1176 ASSERT_VK_SUCCESS(err);
1177
1178 const VkDescriptorSetLayoutBinding dsl_binding = {
1179 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1180 .arraySize = 1,
1181 .stageFlags = VK_SHADER_STAGE_ALL,
1182 .pImmutableSamplers = NULL,
1183 };
1184
1185 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1186 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1187 .pNext = NULL,
1188 .count = 1,
1189 .pBinding = &dsl_binding,
1190 };
1191 VkDescriptorSetLayout ds_layout;
1192 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1193 ASSERT_VK_SUCCESS(err);
1194
1195 VkDescriptorSet descriptorSet;
1196 uint32_t ds_count = 0;
1197 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1198 ASSERT_VK_SUCCESS(err);
1199
1200 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1201 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1202 .pNext = NULL,
1203 .descriptorSetCount = 1,
1204 .pSetLayouts = &ds_layout,
1205 };
1206
1207 VkPipelineLayout pipeline_layout;
1208 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1209 ASSERT_VK_SUCCESS(err);
1210
1211 const VkGraphicsPipelineCreateInfo gp_ci = {
Tony Barboure307f582015-07-10 15:29:03 -06001212 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1213 .pNext = NULL,
1214 .stageCount = 0,
1215 .pStages = NULL, // Creating Gfx Pipeline w/o VS is a violation
1216 .pVertexInputState = NULL,
1217 .pInputAssemblyState = NULL,
1218 .pTessellationState = NULL,
1219 .pViewportState = NULL,
1220 .pRasterState = NULL,
1221 .pMultisampleState = NULL,
1222 .pDepthStencilState = NULL,
1223 .pColorBlendState = NULL,
1224 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1225 .layout = pipeline_layout,
Tobin Ehlis254eca02015-06-25 15:46:59 -06001226 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06001227 const VkPipelineCacheCreateInfo pc_ci = {
1228 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1229 .pNext = NULL,
1230 .initialSize = 0,
1231 .initialData = 0,
1232 .maxSize = 0,
1233 };
Tobin Ehlis254eca02015-06-25 15:46:59 -06001234
1235 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001236 VkPipelineCache pipelineCache;
1237
1238 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1239 ASSERT_VK_SUCCESS(err);
1240 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001241
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001242 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001243 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after creating Gfx Pipeline w/o VS.";
1244 if (!strstr(msgString.c_str(),"Invalid Pipeline CreateInfo State: Vtx Shader required")) {
1245 FAIL() << "Error received was not 'Invalid Pipeline CreateInfo State: Vtx Shader required'";
1246 }
1247}
1248
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001249TEST_F(VkLayerTest, NullRenderPass)
1250{
1251 // Bind a NULL RenderPass
1252 VkFlags msgFlags;
1253 std::string msgString;
1254
1255 ASSERT_NO_FATAL_FAILURE(InitState());
1256 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1257 m_errorMonitor->ClearState();
1258 VkCommandBufferObj cmdBuffer(m_device);
1259
1260 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1261 BeginCommandBuffer(cmdBuffer);
1262 // Don't care about RenderPass handle b/c error should be flagged before that
Chia-I Wuc278df82015-07-07 11:50:03 +08001263 vkCmdBeginRenderPass(cmdBuffer.GetBufferHandle(), NULL, VK_RENDER_PASS_CONTENTS_INLINE);
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001264
1265 msgFlags = m_errorMonitor->GetState(&msgString);
1266 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding NULL RenderPass.";
1267 if (!strstr(msgString.c_str(),"You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()")) {
1268 FAIL() << "Error received was not 'You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()'";
1269 }
1270}
1271
Tobin Ehlis254eca02015-06-25 15:46:59 -06001272TEST_F(VkLayerTest, RenderPassWithinRenderPass)
1273{
1274 // Bind a BeginRenderPass within an active RenderPass
1275 VkFlags msgFlags;
1276 std::string msgString;
1277
1278 ASSERT_NO_FATAL_FAILURE(InitState());
1279 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1280 m_errorMonitor->ClearState();
1281 VkCommandBufferObj cmdBuffer(m_device);
1282
1283 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1284 BeginCommandBuffer(cmdBuffer);
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001285 // 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 +08001286 const VkRenderPassBeginInfo rp_begin = {
1287 .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
1288 .pNext = NULL,
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001289 .renderPass = (VkRenderPass) 0xc001d00d,
Tony Barbour2a199c12015-07-09 17:31:46 -06001290 .framebuffer = 0
Tobin Ehlisb8b06b52015-06-25 16:27:19 -06001291 };
Chia-I Wuc278df82015-07-07 11:50:03 +08001292 vkCmdBeginRenderPass(cmdBuffer.GetBufferHandle(), &rp_begin, VK_RENDER_PASS_CONTENTS_INLINE);
Tobin Ehlis254eca02015-06-25 15:46:59 -06001293
1294 msgFlags = m_errorMonitor->GetState(&msgString);
1295 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding RenderPass w/i an active RenderPass.";
1296 if (!strstr(msgString.c_str(),"Cannot call vkCmdBeginRenderPass() during an active RenderPass ")) {
1297 FAIL() << "Error received was not 'Cannot call vkCmdBeginRenderPass() during an active RenderPass...'";
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001298 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001299}
1300
1301TEST_F(VkLayerTest, InvalidDynamicStateObject)
1302{
1303 // Create a valid cmd buffer
1304 // call vkCmdBindDynamicStateObject w/ false DS Obj
Tobin Ehlis6bdfa372015-05-27 14:32:28 -06001305 // TODO : Simple check for bad object should be added to ObjectTracker to catch this case
1306 // The DS check for this is after driver has been called to validate DS internal data struct
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001307}
Tobin Ehlis201b1ba2015-05-27 14:55:35 -06001308
Tobin Ehlise4076782015-06-24 15:53:07 -06001309TEST_F(VkLayerTest, VtxBufferNoRenderPass)
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001310{
1311 // Bind VBO out-of-bounds for given PSO
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001312 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001313 std::string msgString;
1314 VkResult err;
1315
1316 ASSERT_NO_FATAL_FAILURE(InitState());
1317 m_errorMonitor->ClearState();
1318 VkCommandBufferObj cmdBuffer(m_device);
1319 const VkDescriptorTypeCount ds_type_count = {
1320 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1321 .count = 1,
1322 };
1323 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1324 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1325 .pNext = NULL,
1326 .count = 1,
1327 .pTypeCount = &ds_type_count,
1328 };
1329 VkDescriptorPool ds_pool;
1330 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1331 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001332
1333 const VkDescriptorSetLayoutBinding dsl_binding = {
1334 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001335 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001336 .stageFlags = VK_SHADER_STAGE_ALL,
1337 .pImmutableSamplers = NULL,
1338 };
1339
1340 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1341 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1342 .pNext = NULL,
1343 .count = 1,
1344 .pBinding = &dsl_binding,
1345 };
1346 VkDescriptorSetLayout ds_layout;
1347 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1348 ASSERT_VK_SUCCESS(err);
1349
1350 VkDescriptorSet descriptorSet;
1351 uint32_t ds_count = 0;
1352 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1353 ASSERT_VK_SUCCESS(err);
1354
1355 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1356 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1357 .pNext = NULL,
1358 .descriptorSetCount = 1,
1359 .pSetLayouts = &ds_layout,
1360 };
1361
1362 VkPipelineLayout pipeline_layout;
1363 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1364 ASSERT_VK_SUCCESS(err);
1365
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001366 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001367
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001368 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1369 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1370 .pNext = NULL,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001371 .stage = VK_SHADER_STAGE_VERTEX,
Chia-I Wub48eddb2015-07-03 11:49:42 +08001372 .shader = vs.handle(),
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001373 .linkConstBufferCount = 0,
1374 .pLinkConstBufferInfo = NULL,
1375 .pSpecializationInfo = NULL,
1376 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001377 const VkGraphicsPipelineCreateInfo gp_ci = {
Tony Barboure307f582015-07-10 15:29:03 -06001378 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1379 .pNext = NULL,
1380 .stageCount = 0,
1381 .pStages = &pipe_vs_ci,
1382 .pVertexInputState = NULL,
1383 .pInputAssemblyState = NULL,
1384 .pTessellationState = NULL,
1385 .pViewportState = NULL,
1386 .pRasterState = NULL,
1387 .pMultisampleState = NULL,
1388 .pDepthStencilState = NULL,
1389 .pColorBlendState = NULL,
1390 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1391 .layout = pipeline_layout,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001392 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06001393 const VkPipelineCacheCreateInfo pc_ci = {
1394 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1395 .pNext = NULL,
1396 .initialSize = 0,
1397 .initialData = 0,
1398 .maxSize = 0,
1399 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001400
1401 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001402 VkPipelineCache pipelineCache;
1403
1404 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1405 ASSERT_VK_SUCCESS(err);
1406 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001407 ASSERT_VK_SUCCESS(err);
1408
1409 err= cmdBuffer.BeginCommandBuffer();
1410 ASSERT_VK_SUCCESS(err);
1411 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1412 // Should error before calling to driver so don't care about actual data
1413 vkCmdBindVertexBuffers(cmdBuffer.GetBufferHandle(), 0, 1, NULL, NULL);
1414
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001415 msgFlags = m_errorMonitor->GetState(&msgString);
Tobin Ehlise4076782015-06-24 15:53:07 -06001416 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after vkCmdBindVertexBuffers() w/o active RenderPass.";
1417 if (!strstr(msgString.c_str(),"Incorrect call to vkCmdBindVertexBuffers() without an active RenderPass.")) {
1418 FAIL() << "Error received was not 'Incorrect call to vkCmdBindVertexBuffers() without an active RenderPass.'";
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001419 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001420}
1421
1422TEST_F(VkLayerTest, DSTypeMismatch)
1423{
1424 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001425 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001426 std::string msgString;
1427 VkResult err;
1428
1429 ASSERT_NO_FATAL_FAILURE(InitState());
1430 m_errorMonitor->ClearState();
1431 //VkDescriptorSetObj descriptorSet(m_device);
1432 const VkDescriptorTypeCount ds_type_count = {
1433 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1434 .count = 1,
1435 };
1436 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1437 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1438 .pNext = NULL,
1439 .count = 1,
1440 .pTypeCount = &ds_type_count,
1441 };
1442 VkDescriptorPool ds_pool;
1443 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1444 ASSERT_VK_SUCCESS(err);
1445 const VkDescriptorSetLayoutBinding dsl_binding = {
1446 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001447 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001448 .stageFlags = VK_SHADER_STAGE_ALL,
1449 .pImmutableSamplers = NULL,
1450 };
1451
1452 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1453 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1454 .pNext = NULL,
1455 .count = 1,
1456 .pBinding = &dsl_binding,
1457 };
1458 VkDescriptorSetLayout ds_layout;
1459 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1460 ASSERT_VK_SUCCESS(err);
1461
1462 VkDescriptorSet descriptorSet;
1463 uint32_t ds_count = 0;
1464 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1465 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001466
1467 const VkSamplerCreateInfo sampler_ci = {
1468 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1469 .pNext = NULL,
1470 .magFilter = VK_TEX_FILTER_NEAREST,
1471 .minFilter = VK_TEX_FILTER_NEAREST,
1472 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1473 .addressU = VK_TEX_ADDRESS_CLAMP,
1474 .addressV = VK_TEX_ADDRESS_CLAMP,
1475 .addressW = VK_TEX_ADDRESS_CLAMP,
1476 .mipLodBias = 1.0,
1477 .maxAnisotropy = 1,
1478 .compareOp = VK_COMPARE_OP_NEVER,
1479 .minLod = 1.0,
1480 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001481 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001482 };
1483 VkSampler sampler;
1484 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1485 ASSERT_VK_SUCCESS(err);
1486
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001487 VkDescriptorInfo descriptor_info;
1488 memset(&descriptor_info, 0, sizeof(descriptor_info));
1489 descriptor_info.sampler = sampler;
1490
1491 VkWriteDescriptorSet descriptor_write;
1492 memset(&descriptor_write, 0, sizeof(descriptor_write));
1493 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1494 descriptor_write.destSet = descriptorSet;
1495 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001496 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001497 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1498 descriptor_write.pDescriptors = &descriptor_info;
1499
1500 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1501
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001502 msgFlags = m_errorMonitor->GetState(&msgString);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001503 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 +08001504 if (!strstr(msgString.c_str(),"Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET does not match ")) {
1505 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 -06001506 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001507}
1508
1509TEST_F(VkLayerTest, DSUpdateOutOfBounds)
1510{
1511 // For overlapping Update, have arrayIndex exceed that of layout
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001512 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001513 std::string msgString;
1514 VkResult err;
1515
1516 ASSERT_NO_FATAL_FAILURE(InitState());
1517 m_errorMonitor->ClearState();
1518 //VkDescriptorSetObj descriptorSet(m_device);
1519 const VkDescriptorTypeCount ds_type_count = {
1520 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1521 .count = 1,
1522 };
1523 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1524 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1525 .pNext = NULL,
1526 .count = 1,
1527 .pTypeCount = &ds_type_count,
1528 };
1529 VkDescriptorPool ds_pool;
1530 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1531 ASSERT_VK_SUCCESS(err);
1532 const VkDescriptorSetLayoutBinding dsl_binding = {
1533 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001534 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001535 .stageFlags = VK_SHADER_STAGE_ALL,
1536 .pImmutableSamplers = NULL,
1537 };
1538
1539 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1540 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1541 .pNext = NULL,
1542 .count = 1,
1543 .pBinding = &dsl_binding,
1544 };
1545 VkDescriptorSetLayout ds_layout;
1546 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1547 ASSERT_VK_SUCCESS(err);
1548
1549 VkDescriptorSet descriptorSet;
1550 uint32_t ds_count = 0;
1551 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1552 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001553
1554 const VkSamplerCreateInfo sampler_ci = {
1555 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1556 .pNext = NULL,
1557 .magFilter = VK_TEX_FILTER_NEAREST,
1558 .minFilter = VK_TEX_FILTER_NEAREST,
1559 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1560 .addressU = VK_TEX_ADDRESS_CLAMP,
1561 .addressV = VK_TEX_ADDRESS_CLAMP,
1562 .addressW = VK_TEX_ADDRESS_CLAMP,
1563 .mipLodBias = 1.0,
1564 .maxAnisotropy = 1,
1565 .compareOp = VK_COMPARE_OP_NEVER,
1566 .minLod = 1.0,
1567 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001568 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001569 };
1570 VkSampler sampler;
1571 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1572 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001573
1574 VkDescriptorInfo descriptor_info;
1575 memset(&descriptor_info, 0, sizeof(descriptor_info));
1576 descriptor_info.sampler = sampler;
1577
1578 VkWriteDescriptorSet descriptor_write;
1579 memset(&descriptor_write, 0, sizeof(descriptor_write));
1580 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1581 descriptor_write.destSet = descriptorSet;
1582 descriptor_write.destArrayElement = 1; /* This index out of bounds for the update */
1583 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001584 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001585 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1586 descriptor_write.pDescriptors = &descriptor_info;
1587
1588 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1589
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001590 msgFlags = m_errorMonitor->GetState(&msgString);
1591 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 +08001592 if (!strstr(msgString.c_str(),"Descriptor update type of VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET is out of bounds for matching binding")) {
1593 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 -06001594 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001595}
1596
1597TEST_F(VkLayerTest, InvalidDSUpdateIndex)
1598{
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001599 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001600 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001601 std::string msgString;
1602 VkResult err;
1603
1604 ASSERT_NO_FATAL_FAILURE(InitState());
1605 m_errorMonitor->ClearState();
1606 //VkDescriptorSetObj descriptorSet(m_device);
1607 const VkDescriptorTypeCount ds_type_count = {
1608 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1609 .count = 1,
1610 };
1611 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1612 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1613 .pNext = NULL,
1614 .count = 1,
1615 .pTypeCount = &ds_type_count,
1616 };
1617 VkDescriptorPool ds_pool;
1618 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1619 ASSERT_VK_SUCCESS(err);
1620 const VkDescriptorSetLayoutBinding dsl_binding = {
1621 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001622 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001623 .stageFlags = VK_SHADER_STAGE_ALL,
1624 .pImmutableSamplers = NULL,
1625 };
1626
1627 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1628 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1629 .pNext = NULL,
1630 .count = 1,
1631 .pBinding = &dsl_binding,
1632 };
1633 VkDescriptorSetLayout ds_layout;
1634 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1635 ASSERT_VK_SUCCESS(err);
1636
1637 VkDescriptorSet descriptorSet;
1638 uint32_t ds_count = 0;
1639 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1640 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001641
1642 const VkSamplerCreateInfo sampler_ci = {
1643 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1644 .pNext = NULL,
1645 .magFilter = VK_TEX_FILTER_NEAREST,
1646 .minFilter = VK_TEX_FILTER_NEAREST,
1647 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1648 .addressU = VK_TEX_ADDRESS_CLAMP,
1649 .addressV = VK_TEX_ADDRESS_CLAMP,
1650 .addressW = VK_TEX_ADDRESS_CLAMP,
1651 .mipLodBias = 1.0,
1652 .maxAnisotropy = 1,
1653 .compareOp = VK_COMPARE_OP_NEVER,
1654 .minLod = 1.0,
1655 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001656 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001657 };
1658 VkSampler sampler;
1659 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1660 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001661
1662 VkDescriptorInfo descriptor_info;
1663 memset(&descriptor_info, 0, sizeof(descriptor_info));
1664 descriptor_info.sampler = sampler;
1665
1666 VkWriteDescriptorSet descriptor_write;
1667 memset(&descriptor_write, 0, sizeof(descriptor_write));
1668 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1669 descriptor_write.destSet = descriptorSet;
1670 descriptor_write.destBinding = 2;
1671 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001672 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001673 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1674 descriptor_write.pDescriptors = &descriptor_info;
1675
1676 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1677
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001678 msgFlags = m_errorMonitor->GetState(&msgString);
1679 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 -06001680 if (!strstr(msgString.c_str()," does not have binding to match update binding ")) {
1681 FAIL() << "Error received was not 'Descriptor Set <blah> does not have binding to match update binding '";
1682 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001683}
1684
1685TEST_F(VkLayerTest, InvalidDSUpdateStruct)
1686{
1687 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_* types
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001688 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001689 std::string msgString;
1690 VkResult err;
1691
1692 ASSERT_NO_FATAL_FAILURE(InitState());
1693 m_errorMonitor->ClearState();
1694 //VkDescriptorSetObj descriptorSet(m_device);
1695 const VkDescriptorTypeCount ds_type_count = {
1696 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1697 .count = 1,
1698 };
1699 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1700 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1701 .pNext = NULL,
1702 .count = 1,
1703 .pTypeCount = &ds_type_count,
1704 };
1705 VkDescriptorPool ds_pool;
1706 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1707 ASSERT_VK_SUCCESS(err);
1708 const VkDescriptorSetLayoutBinding dsl_binding = {
1709 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001710 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001711 .stageFlags = VK_SHADER_STAGE_ALL,
1712 .pImmutableSamplers = NULL,
1713 };
1714
1715 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1716 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1717 .pNext = NULL,
1718 .count = 1,
1719 .pBinding = &dsl_binding,
1720 };
1721 VkDescriptorSetLayout ds_layout;
1722 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1723 ASSERT_VK_SUCCESS(err);
1724
1725 VkDescriptorSet descriptorSet;
1726 uint32_t ds_count = 0;
1727 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1728 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001729
1730 const VkSamplerCreateInfo sampler_ci = {
1731 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1732 .pNext = NULL,
1733 .magFilter = VK_TEX_FILTER_NEAREST,
1734 .minFilter = VK_TEX_FILTER_NEAREST,
1735 .mipMode = VK_TEX_MIPMAP_MODE_BASE,
1736 .addressU = VK_TEX_ADDRESS_CLAMP,
1737 .addressV = VK_TEX_ADDRESS_CLAMP,
1738 .addressW = VK_TEX_ADDRESS_CLAMP,
1739 .mipLodBias = 1.0,
1740 .maxAnisotropy = 1,
1741 .compareOp = VK_COMPARE_OP_NEVER,
1742 .minLod = 1.0,
1743 .maxLod = 1.0,
Tony Barbour2c4e7c72015-06-25 16:56:44 -06001744 .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001745 };
1746 VkSampler sampler;
1747 err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
1748 ASSERT_VK_SUCCESS(err);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001749
1750
1751 VkDescriptorInfo descriptor_info;
1752 memset(&descriptor_info, 0, sizeof(descriptor_info));
1753 descriptor_info.sampler = sampler;
1754
1755 VkWriteDescriptorSet descriptor_write;
1756 memset(&descriptor_write, 0, sizeof(descriptor_write));
1757 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
1758 descriptor_write.destSet = descriptorSet;
1759 descriptor_write.count = 1;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001760 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001761 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
1762 descriptor_write.pDescriptors = &descriptor_info;
1763
1764 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1765
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001766 msgFlags = m_errorMonitor->GetState(&msgString);
1767 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 -06001768 if (!strstr(msgString.c_str(),"Unexpected UPDATE struct of type ")) {
1769 FAIL() << "Error received was not 'Unexpected UPDATE struct of type '";
1770 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001771}
1772
1773TEST_F(VkLayerTest, NumSamplesMismatch)
1774{
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001775 // Create CmdBuffer where MSAA samples doesn't match RenderPass sampleCount
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001776 VkFlags msgFlags;
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001777 std::string msgString;
1778 VkResult err;
1779
1780 ASSERT_NO_FATAL_FAILURE(InitState());
1781 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1782 m_errorMonitor->ClearState();
1783 VkCommandBufferObj cmdBuffer(m_device);
1784 const VkDescriptorTypeCount ds_type_count = {
1785 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1786 .count = 1,
1787 };
1788 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1789 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1790 .pNext = NULL,
1791 .count = 1,
1792 .pTypeCount = &ds_type_count,
1793 };
1794 VkDescriptorPool ds_pool;
1795 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1796 ASSERT_VK_SUCCESS(err);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001797
1798 const VkDescriptorSetLayoutBinding dsl_binding = {
1799 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Chia-I Wud3114a22015-05-25 16:22:52 +08001800 .arraySize = 1,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001801 .stageFlags = VK_SHADER_STAGE_ALL,
1802 .pImmutableSamplers = NULL,
1803 };
1804
1805 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1806 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1807 .pNext = NULL,
1808 .count = 1,
1809 .pBinding = &dsl_binding,
1810 };
1811 VkDescriptorSetLayout ds_layout;
1812 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1813 ASSERT_VK_SUCCESS(err);
1814
1815 VkDescriptorSet descriptorSet;
1816 uint32_t ds_count = 0;
1817 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1818 ASSERT_VK_SUCCESS(err);
1819
Tony Barboure307f582015-07-10 15:29:03 -06001820 const VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {
1821 .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001822 .pNext = NULL,
Tony Barboure094edf2015-06-26 10:18:34 -06001823 .rasterSamples = 4,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001824 .multisampleEnable = 1,
1825 .sampleShadingEnable = 0,
1826 .minSampleShading = 1.0,
1827 .sampleMask = 15,
1828 };
1829
1830 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1831 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1832 .pNext = NULL,
1833 .descriptorSetCount = 1,
1834 .pSetLayouts = &ds_layout,
1835 };
1836
1837 VkPipelineLayout pipeline_layout;
1838 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1839 ASSERT_VK_SUCCESS(err);
1840
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06001841 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001842
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001843 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
1844 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1845 .pNext = NULL,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001846 .stage = VK_SHADER_STAGE_VERTEX,
Chia-I Wub48eddb2015-07-03 11:49:42 +08001847 .shader = vs.handle(),
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001848 .linkConstBufferCount = 0,
1849 .pLinkConstBufferInfo = NULL,
1850 .pSpecializationInfo = NULL,
1851 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001852 const VkGraphicsPipelineCreateInfo gp_ci = {
Tony Barboure307f582015-07-10 15:29:03 -06001853 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1854 .pNext = NULL,
1855 .stageCount = 0,
1856 .pStages = &pipe_vs_ci,
1857 .pVertexInputState = NULL,
1858 .pInputAssemblyState = NULL,
1859 .pTessellationState = NULL,
1860 .pViewportState = NULL,
1861 .pRasterState = NULL,
1862 .pMultisampleState = &pipe_ms_state_ci,
1863 .pDepthStencilState = NULL,
1864 .pColorBlendState = NULL,
1865 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
1866 .layout = pipeline_layout,
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001867 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06001868 const VkPipelineCacheCreateInfo pc_ci = {
1869 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1870 .pNext = NULL,
1871 .initialSize = 0,
1872 .initialData = 0,
1873 .maxSize = 0,
1874 };
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001875
1876 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001877 VkPipelineCache pipelineCache;
1878
1879 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
1880 ASSERT_VK_SUCCESS(err);
1881 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis2f87d2d2015-05-28 12:11:26 -06001882 ASSERT_VK_SUCCESS(err);
1883
1884 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1885 BeginCommandBuffer(cmdBuffer);
1886 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1887
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001888 msgFlags = m_errorMonitor->GetState(&msgString);
1889 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 -06001890 if (!strstr(msgString.c_str(),"Num samples mismatch! ")) {
1891 FAIL() << "Error received was not 'Num samples mismatch!...'";
1892 }
Tobin Ehlis138b7f12015-05-22 12:38:55 -06001893}
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06001894
Tobin Ehlise4076782015-06-24 15:53:07 -06001895TEST_F(VkLayerTest, PipelineNotBound)
1896{
1897 VkFlags msgFlags;
1898 std::string msgString;
1899 VkResult err;
1900
1901 ASSERT_NO_FATAL_FAILURE(InitState());
1902 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1903 m_errorMonitor->ClearState();
1904 VkCommandBufferObj cmdBuffer(m_device);
1905 const VkDescriptorTypeCount ds_type_count = {
1906 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1907 .count = 1,
1908 };
1909 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1910 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1911 .pNext = NULL,
1912 .count = 1,
1913 .pTypeCount = &ds_type_count,
1914 };
1915 VkDescriptorPool ds_pool;
1916 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1917 ASSERT_VK_SUCCESS(err);
1918
1919 const VkDescriptorSetLayoutBinding dsl_binding = {
1920 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1921 .arraySize = 1,
1922 .stageFlags = VK_SHADER_STAGE_ALL,
1923 .pImmutableSamplers = NULL,
1924 };
1925
1926 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
1927 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1928 .pNext = NULL,
1929 .count = 1,
1930 .pBinding = &dsl_binding,
1931 };
1932 VkDescriptorSetLayout ds_layout;
1933 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
1934 ASSERT_VK_SUCCESS(err);
1935
1936 VkDescriptorSet descriptorSet;
1937 uint32_t ds_count = 0;
1938 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
1939 ASSERT_VK_SUCCESS(err);
1940
1941 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
1942 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1943 .pNext = NULL,
1944 .descriptorSetCount = 1,
1945 .pSetLayouts = &ds_layout,
1946 };
1947
1948 VkPipelineLayout pipeline_layout;
1949 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
1950 ASSERT_VK_SUCCESS(err);
1951
Tobin Ehlise4076782015-06-24 15:53:07 -06001952 VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
1953 //err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
1954 ASSERT_VK_SUCCESS(err);
1955
1956 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1957 BeginCommandBuffer(cmdBuffer);
1958 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
1959
1960 msgFlags = m_errorMonitor->GetState(&msgString);
1961 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding invalid pipeline to CmdBuffer";
1962 if (!strstr(msgString.c_str(),"Attempt to bind Pipeline ")) {
1963 FAIL() << "Error received was not 'Attempt to bind Pipeline 0xbaadb1be that doesn't exist!'";
1964 }
1965}
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06001966
1967TEST_F(VkLayerTest, ClearCmdNoDraw)
1968{
1969 // Create CmdBuffer where we add ClearCmd for FB Color attachment prior to issuing a Draw
1970 VkFlags msgFlags;
1971 std::string msgString;
1972 VkResult err;
1973
1974 ASSERT_NO_FATAL_FAILURE(InitState());
1975 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1976 m_errorMonitor->ClearState();
1977 VkCommandBufferObj cmdBuffer(m_device);
1978 const VkDescriptorTypeCount ds_type_count = {
1979 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1980 .count = 1,
1981 };
1982 const VkDescriptorPoolCreateInfo ds_pool_ci = {
1983 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1984 .pNext = NULL,
1985 .count = 1,
1986 .pTypeCount = &ds_type_count,
1987 };
1988 VkDescriptorPool ds_pool;
1989 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
1990 ASSERT_VK_SUCCESS(err);
1991
1992 const VkDescriptorSetLayoutBinding dsl_binding = {
1993 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1994 .arraySize = 1,
1995 .stageFlags = VK_SHADER_STAGE_ALL,
1996 .pImmutableSamplers = NULL,
1997 };
1998
1999 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
2000 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
2001 .pNext = NULL,
2002 .count = 1,
2003 .pBinding = &dsl_binding,
2004 };
2005 VkDescriptorSetLayout ds_layout;
2006 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
2007 ASSERT_VK_SUCCESS(err);
2008
2009 VkDescriptorSet descriptorSet;
2010 uint32_t ds_count = 0;
2011 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
2012 ASSERT_VK_SUCCESS(err);
2013
Tony Barboure307f582015-07-10 15:29:03 -06002014 const VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {
2015 .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06002016 .pNext = NULL,
2017 .rasterSamples = 4,
2018 .multisampleEnable = 1,
2019 .sampleShadingEnable = 0,
2020 .minSampleShading = 1.0,
2021 .sampleMask = 15,
2022 };
2023
2024 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
2025 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
2026 .pNext = NULL,
2027 .descriptorSetCount = 1,
2028 .pSetLayouts = &ds_layout,
2029 };
2030
2031 VkPipelineLayout pipeline_layout;
2032 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
2033 ASSERT_VK_SUCCESS(err);
2034
2035 size_t shader_len = strlen(bindStateVertShaderText);
2036 size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
2037 void* pCode = malloc(codeSize);
2038
2039 /* try version 0 first: VkShaderStage followed by GLSL */
2040 ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
2041 ((uint32_t *) pCode)[1] = 0;
2042 ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
2043 memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
2044
2045 const VkShaderModuleCreateInfo smci = {
2046 .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
2047 .pNext = NULL,
2048 .codeSize = codeSize,
2049 .pCode = pCode,
2050 .flags = 0,
2051 };
2052 VkShaderModule vksm;
2053 err = vkCreateShaderModule(m_device->device(), &smci, &vksm);
2054 ASSERT_VK_SUCCESS(err);
2055 const VkShaderCreateInfo vs_ci = {
2056 .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
2057 .pNext = NULL,
2058 .module = vksm,
2059 .pName = "main",
2060 .flags = 0,
2061 };
2062 VkShader vs;
2063 err = vkCreateShader(m_device->device(), &vs_ci, &vs);
2064 ASSERT_VK_SUCCESS(err);
2065
2066 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
2067 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2068 .pNext = NULL,
2069 .stage = VK_SHADER_STAGE_VERTEX,
2070 .shader = vs,
2071 .linkConstBufferCount = 0,
2072 .pLinkConstBufferInfo = NULL,
2073 .pSpecializationInfo = NULL,
2074 };
2075 const VkGraphicsPipelineCreateInfo gp_ci = {
Tony Barboure307f582015-07-10 15:29:03 -06002076 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
2077 .pNext = NULL,
2078 .stageCount = 0,
2079 .pStages = &pipe_vs_ci,
2080 .pVertexInputState = NULL,
2081 .pInputAssemblyState = NULL,
2082 .pTessellationState = NULL,
2083 .pViewportState = NULL,
2084 .pRasterState = NULL,
2085 .pMultisampleState = &pipe_ms_state_ci,
2086 .pDepthStencilState = NULL,
2087 .pColorBlendState = NULL,
2088 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
2089 .layout = pipeline_layout,
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06002090 };
Jon Ashburn0d60d272015-07-09 15:02:25 -06002091 const VkPipelineCacheCreateInfo pc_ci = {
2092 .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
2093 .pNext = NULL,
2094 .initialSize = 0,
2095 .initialData = 0,
2096 .maxSize = 0,
2097 };
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06002098
2099 VkPipeline pipeline;
Jon Ashburn0d60d272015-07-09 15:02:25 -06002100 VkPipelineCache pipelineCache;
2101
2102 err = vkCreatePipelineCache(m_device->device(), &pc_ci, &pipelineCache);
2103 ASSERT_VK_SUCCESS(err);
2104 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
Tobin Ehlis8cd650e2015-07-01 16:46:13 -06002105 ASSERT_VK_SUCCESS(err);
2106
2107 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
2108 BeginCommandBuffer(cmdBuffer);
2109
2110 m_errorMonitor->ClearState();
2111 // Main thing we care about for this test is that the VkImage obj we're clearing matches Color Attachment of FB
2112 // Also pass down other dummy params to keep driver and paramchecker happy
2113 VkClearColorValue cCV;
2114 cCV.f32[0] = 1.0;
2115 cCV.f32[1] = 1.0;
2116 cCV.f32[2] = 1.0;
2117 cCV.f32[3] = 1.0;
2118
2119 vkCmdClearColorAttachment(cmdBuffer.GetBufferHandle(), 0, (VkImageLayout)NULL, &cCV, 0, NULL);
2120 msgFlags = m_errorMonitor->GetState(&msgString);
2121 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT) << "Did not receive error after issuing Clear Cmd on FB color attachment prior to Draw Cmd.";
2122 if (!strstr(msgString.c_str(),"vkCmdClearColorAttachment() issued on CB object ")) {
2123 FAIL() << "Error received was not 'vkCmdClearColorAttachment() issued on CB object...'";
2124 }
2125}
2126
Tobin Ehlise4076782015-06-24 15:53:07 -06002127TEST_F(VkLayerTest, VtxBufferBadIndex)
2128{
2129 // Create CmdBuffer where MSAA samples doesn't match RenderPass sampleCount
2130 VkFlags msgFlags;
2131 std::string msgString;
2132 VkResult err;
2133
2134 ASSERT_NO_FATAL_FAILURE(InitState());
2135 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2136 m_errorMonitor->ClearState();
2137 VkCommandBufferObj cmdBuffer(m_device);
2138 const VkDescriptorTypeCount ds_type_count = {
2139 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
2140 .count = 1,
2141 };
2142 const VkDescriptorPoolCreateInfo ds_pool_ci = {
2143 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
2144 .pNext = NULL,
2145 .count = 1,
2146 .pTypeCount = &ds_type_count,
2147 };
2148 VkDescriptorPool ds_pool;
2149 err = vkCreateDescriptorPool(m_device->device(), VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1, &ds_pool_ci, &ds_pool);
2150 ASSERT_VK_SUCCESS(err);
2151
2152 const VkDescriptorSetLayoutBinding dsl_binding = {
2153 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
2154 .arraySize = 1,
2155 .stageFlags = VK_SHADER_STAGE_ALL,
2156 .pImmutableSamplers = NULL,
2157 };
2158
2159 const VkDescriptorSetLayoutCreateInfo ds_layout_ci = {
2160 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
2161 .pNext = NULL,
2162 .count = 1,
2163 .pBinding = &dsl_binding,
2164 };
2165 VkDescriptorSetLayout ds_layout;
2166 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, &ds_layout);
2167 ASSERT_VK_SUCCESS(err);
2168
2169 VkDescriptorSet descriptorSet;
2170 uint32_t ds_count = 0;
2171 err = vkAllocDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_SET_USAGE_ONE_SHOT, 1, &ds_layout, &descriptorSet, &ds_count);
2172 ASSERT_VK_SUCCESS(err);
2173
Tony Barboure307f582015-07-10 15:29:03 -06002174 const VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {
2175 .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
Tobin Ehlise4076782015-06-24 15:53:07 -06002176 .pNext = NULL,
Tony Barboure094edf2015-06-26 10:18:34 -06002177 .rasterSamples = 1,
Tobin Ehlise4076782015-06-24 15:53:07 -06002178 .multisampleEnable = 1,
2179 .sampleShadingEnable = 0,
2180 .minSampleShading = 1.0,
2181 .sampleMask = 15,
2182 };
2183
2184 const VkPipelineLayoutCreateInfo pipeline_layout_ci = {
2185 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
2186 .pNext = NULL,
2187 .descriptorSetCount = 1,
2188 .pSetLayouts = &ds_layout,
2189 };
2190
2191 VkPipelineLayout pipeline_layout;
2192 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
2193 ASSERT_VK_SUCCESS(err);
2194
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -06002195 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
Tobin Ehlise4076782015-06-24 15:53:07 -06002196
2197 const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
2198 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2199 .pNext = NULL,
2200 .stage = VK_SHADER_STAGE_VERTEX,
Chia-I Wub48eddb2015-07-03 11:49:42 +08002201 .shader = vs.handle(),
Tobin Ehlise4076782015-06-24 15:53:07 -06002202 .linkConstBufferCount = 0,
2203 .pLinkConstBufferInfo = NULL,
2204 .pSpecializationInfo = NULL,
2205 };
2206 const VkGraphicsPipelineCreateInfo gp_ci = {
Tony Barboure307f582015-07-10 15:29:03 -06002207 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
2208 .pNext = NULL,
2209 .stageCount = 0,
2210 .pStages = &pipe_vs_ci,
2211 .pVertexInputState = NULL,
2212 .pInputAssemblyState = NULL,
2213 .pTessellationState = NULL,
2214 .pViewportState = NULL,
2215 .pRasterState = NULL,
2216 .pMultisampleState = &pipe_ms_state_ci,
2217 .pDepthStencilState = NULL,
2218 .pColorBlendState = NULL,
2219 .flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,
2220 .layout = pipeline_layout,
Tobin Ehlise4076782015-06-24 15:53:07 -06002221 };
2222
Courtney Goeltzenleuchtercdf5e832015-07-10 09:21:02 -06002223 VkPipelineCacheCreateInfo pipelineCache;
2224 VkPipelineCache pipeline_cache;
2225
2226 memset(&pipelineCache, 0, sizeof(pipelineCache));
2227 pipelineCache.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
2228 err = vkCreatePipelineCache(m_device->device(), &pipelineCache, &pipeline_cache);
2229
Tobin Ehlise4076782015-06-24 15:53:07 -06002230 VkPipeline pipeline;
Courtney Goeltzenleuchtercdf5e832015-07-10 09:21:02 -06002231 err = vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &gp_ci, &pipeline);
Tobin Ehlise4076782015-06-24 15:53:07 -06002232 ASSERT_VK_SUCCESS(err);
2233
2234 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
2235 BeginCommandBuffer(cmdBuffer);
2236 vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2237 // Should error before calling to driver so don't care about actual data
2238 vkCmdBindVertexBuffers(cmdBuffer.GetBufferHandle(), 0, 1, NULL, NULL);
2239
2240 msgFlags = m_errorMonitor->GetState(&msgString);
2241 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding Vtx Buffer w/o VBO attached to PSO.";
2242 if (!strstr(msgString.c_str(),"Vtx Buffer Index 0 was bound, but no vtx buffers are attached to PSO.")) {
2243 FAIL() << "Error received was not 'Vtx Buffer Index 0 was bound, but no vtx buffers are attached to PSO.'";
2244 }
2245}
Tobin Ehlis57e6a612015-05-26 16:11:58 -06002246#endif
2247#if THREADING_TESTS
Mike Stroyan09aae812015-05-12 16:00:45 -06002248#if GTEST_IS_THREADSAFE
2249struct thread_data_struct {
2250 VkCmdBuffer cmdBuffer;
2251 VkEvent event;
2252 bool bailout;
2253};
2254
2255extern "C" void *AddToCommandBuffer(void *arg)
2256{
2257 struct thread_data_struct *data = (struct thread_data_struct *) arg;
2258 std::string msgString;
2259
2260 for (int i = 0; i<10000; i++) {
Tony Barbourc2e987e2015-06-29 16:20:35 -06002261 vkCmdSetEvent(data->cmdBuffer, data->event, VK_PIPELINE_STAGE_ALL_GPU_COMMANDS);
Mike Stroyan09aae812015-05-12 16:00:45 -06002262 if (data->bailout) {
2263 break;
2264 }
2265 }
2266 return NULL;
2267}
2268
2269TEST_F(VkLayerTest, ThreadCmdBufferCollision)
2270{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002271 VkFlags msgFlags;
Mike Stroyan09aae812015-05-12 16:00:45 -06002272 std::string msgString;
2273 pthread_t thread;
2274 pthread_attr_t thread_attr;
2275
2276 ASSERT_NO_FATAL_FAILURE(InitState());
2277 ASSERT_NO_FATAL_FAILURE(InitViewport());
2278 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2279
2280 VkCommandBufferObj cmdBuffer(m_device);
2281
2282 m_errorMonitor->ClearState();
2283 pthread_attr_init(&thread_attr);
2284 BeginCommandBuffer(cmdBuffer);
2285
2286 VkEventCreateInfo event_info;
2287 VkEvent event;
Mike Stroyan09aae812015-05-12 16:00:45 -06002288 VkResult err;
2289
2290 memset(&event_info, 0, sizeof(event_info));
2291 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
2292
2293 err = vkCreateEvent(device(), &event_info, &event);
2294 ASSERT_VK_SUCCESS(err);
2295
Mike Stroyan09aae812015-05-12 16:00:45 -06002296 err = vkResetEvent(device(), event);
2297 ASSERT_VK_SUCCESS(err);
2298
2299 struct thread_data_struct data;
Chia-I Wu78c2a352015-07-03 11:49:42 +08002300 data.cmdBuffer = cmdBuffer.handle();
Mike Stroyan09aae812015-05-12 16:00:45 -06002301 data.event = event;
2302 data.bailout = false;
2303 m_errorMonitor->SetBailout(&data.bailout);
2304 // Add many entries to command buffer from another thread.
2305 pthread_create(&thread, &thread_attr, AddToCommandBuffer, (void *)&data);
2306 // Add many entries to command buffer from this thread at the same time.
2307 AddToCommandBuffer(&data);
2308 pthread_join(thread, NULL);
2309 EndCommandBuffer(cmdBuffer);
2310
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002311 msgFlags = m_errorMonitor->GetState(&msgString);
Mike Stroyaned254572015-06-17 16:32:06 -06002312 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 -06002313 if (!strstr(msgString.c_str(),"THREADING ERROR")) {
Mark Lobodzinski5f25be42015-05-14 15:08:13 -05002314 FAIL() << "Error received was not 'THREADING ERROR'";
Mike Stroyan09aae812015-05-12 16:00:45 -06002315 }
2316
2317}
2318#endif
Tobin Ehlis57e6a612015-05-26 16:11:58 -06002319#endif
Chris Forbes5af3bf22015-05-25 11:13:08 +12002320#if SHADER_CHECKER_TESTS
2321TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed)
2322{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002323 VkFlags msgFlags;
Chris Forbes5af3bf22015-05-25 11:13:08 +12002324 std::string msgString;
2325 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002326 ScopedUseGlsl useGlsl(false);
Chris Forbes5af3bf22015-05-25 11:13:08 +12002327
2328 char const *vsSource =
2329 "#version 140\n"
2330 "#extension GL_ARB_separate_shader_objects: require\n"
2331 "#extension GL_ARB_shading_language_420pack: require\n"
2332 "\n"
2333 "layout(location=0) out float x;\n"
2334 "void main(){\n"
2335 " gl_Position = vec4(1);\n"
2336 " x = 0;\n"
2337 "}\n";
2338 char const *fsSource =
2339 "#version 140\n"
2340 "#extension GL_ARB_separate_shader_objects: require\n"
2341 "#extension GL_ARB_shading_language_420pack: require\n"
2342 "\n"
2343 "layout(location=0) out vec4 color;\n"
2344 "void main(){\n"
2345 " color = vec4(1);\n"
2346 "}\n";
2347
2348 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2349 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2350
2351 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002352 pipe.AddColorAttachment();
Chris Forbes5af3bf22015-05-25 11:13:08 +12002353 pipe.AddShader(&vs);
2354 pipe.AddShader(&fs);
2355
2356 VkCommandBufferObj dummyCmd(m_device);
2357 VkDescriptorSetObj descriptorSet(m_device);
2358 descriptorSet.AppendDummy();
2359 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2360
2361 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002362 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes5af3bf22015-05-25 11:13:08 +12002363
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002364 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes5af3bf22015-05-25 11:13:08 +12002365
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002366 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes5af3bf22015-05-25 11:13:08 +12002367 if (!strstr(msgString.c_str(),"not consumed by fragment shader")) {
2368 FAIL() << "Incorrect warning: " << msgString;
2369 }
2370}
Chris Forbes5af3bf22015-05-25 11:13:08 +12002371
Chris Forbes3c10b852015-05-25 11:13:13 +12002372TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided)
2373{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002374 VkFlags msgFlags;
Chris Forbes3c10b852015-05-25 11:13:13 +12002375 std::string msgString;
2376 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002377 ScopedUseGlsl useGlsl(false);
Chris Forbes3c10b852015-05-25 11:13:13 +12002378
2379 char const *vsSource =
2380 "#version 140\n"
2381 "#extension GL_ARB_separate_shader_objects: require\n"
2382 "#extension GL_ARB_shading_language_420pack: require\n"
2383 "\n"
2384 "void main(){\n"
2385 " gl_Position = vec4(1);\n"
2386 "}\n";
2387 char const *fsSource =
2388 "#version 140\n"
2389 "#extension GL_ARB_separate_shader_objects: require\n"
2390 "#extension GL_ARB_shading_language_420pack: require\n"
2391 "\n"
2392 "layout(location=0) in float x;\n"
2393 "layout(location=0) out vec4 color;\n"
2394 "void main(){\n"
2395 " color = vec4(x);\n"
2396 "}\n";
2397
2398 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2399 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2400
2401 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002402 pipe.AddColorAttachment();
Chris Forbes3c10b852015-05-25 11:13:13 +12002403 pipe.AddShader(&vs);
2404 pipe.AddShader(&fs);
2405
2406 VkCommandBufferObj dummyCmd(m_device);
2407 VkDescriptorSetObj descriptorSet(m_device);
2408 descriptorSet.AppendDummy();
2409 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2410
2411 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002412 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes3c10b852015-05-25 11:13:13 +12002413
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002414 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes3c10b852015-05-25 11:13:13 +12002415
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002416 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes3c10b852015-05-25 11:13:13 +12002417 if (!strstr(msgString.c_str(),"not written by vertex shader")) {
2418 FAIL() << "Incorrect error: " << msgString;
2419 }
2420}
2421
Chris Forbescc281692015-05-25 11:13:17 +12002422TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch)
2423{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002424 VkFlags msgFlags;
Chris Forbescc281692015-05-25 11:13:17 +12002425 std::string msgString;
2426 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002427 ScopedUseGlsl useGlsl(false);
Chris Forbescc281692015-05-25 11:13:17 +12002428
2429 char const *vsSource =
2430 "#version 140\n"
2431 "#extension GL_ARB_separate_shader_objects: require\n"
2432 "#extension GL_ARB_shading_language_420pack: require\n"
2433 "\n"
2434 "layout(location=0) out int x;\n"
2435 "void main(){\n"
2436 " x = 0;\n"
2437 " gl_Position = vec4(1);\n"
2438 "}\n";
2439 char const *fsSource =
2440 "#version 140\n"
2441 "#extension GL_ARB_separate_shader_objects: require\n"
2442 "#extension GL_ARB_shading_language_420pack: require\n"
2443 "\n"
2444 "layout(location=0) in float x;\n" /* VS writes int */
2445 "layout(location=0) out vec4 color;\n"
2446 "void main(){\n"
2447 " color = vec4(x);\n"
2448 "}\n";
2449
2450 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2451 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2452
2453 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002454 pipe.AddColorAttachment();
Chris Forbescc281692015-05-25 11:13:17 +12002455 pipe.AddShader(&vs);
2456 pipe.AddShader(&fs);
2457
2458 VkCommandBufferObj dummyCmd(m_device);
2459 VkDescriptorSetObj descriptorSet(m_device);
2460 descriptorSet.AppendDummy();
2461 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2462
2463 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002464 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbescc281692015-05-25 11:13:17 +12002465
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002466 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbescc281692015-05-25 11:13:17 +12002467
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002468 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbescc281692015-05-25 11:13:17 +12002469 if (!strstr(msgString.c_str(),"Type mismatch on location 0")) {
2470 FAIL() << "Incorrect error: " << msgString;
2471 }
2472}
2473
Chris Forbes8291c052015-05-25 11:13:28 +12002474TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed)
2475{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002476 VkFlags msgFlags;
Chris Forbes8291c052015-05-25 11:13:28 +12002477 std::string msgString;
2478 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002479 ScopedUseGlsl useGlsl(false);
Chris Forbes8291c052015-05-25 11:13:28 +12002480
2481 VkVertexInputBindingDescription input_binding;
2482 memset(&input_binding, 0, sizeof(input_binding));
2483
2484 VkVertexInputAttributeDescription input_attrib;
2485 memset(&input_attrib, 0, sizeof(input_attrib));
2486 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2487
2488 char const *vsSource =
2489 "#version 140\n"
2490 "#extension GL_ARB_separate_shader_objects: require\n"
2491 "#extension GL_ARB_shading_language_420pack: require\n"
2492 "\n"
2493 "void main(){\n"
2494 " gl_Position = vec4(1);\n"
2495 "}\n";
2496 char const *fsSource =
2497 "#version 140\n"
2498 "#extension GL_ARB_separate_shader_objects: require\n"
2499 "#extension GL_ARB_shading_language_420pack: require\n"
2500 "\n"
2501 "layout(location=0) out vec4 color;\n"
2502 "void main(){\n"
2503 " color = vec4(1);\n"
2504 "}\n";
2505
2506 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2507 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2508
2509 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002510 pipe.AddColorAttachment();
Chris Forbes8291c052015-05-25 11:13:28 +12002511 pipe.AddShader(&vs);
2512 pipe.AddShader(&fs);
2513
2514 pipe.AddVertexInputBindings(&input_binding, 1);
2515 pipe.AddVertexInputAttribs(&input_attrib, 1);
2516
2517 VkCommandBufferObj dummyCmd(m_device);
2518 VkDescriptorSetObj descriptorSet(m_device);
2519 descriptorSet.AppendDummy();
2520 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2521
2522 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002523 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes8291c052015-05-25 11:13:28 +12002524
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002525 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes8291c052015-05-25 11:13:28 +12002526
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002527 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes8291c052015-05-25 11:13:28 +12002528 if (!strstr(msgString.c_str(),"location 0 not consumed by VS")) {
2529 FAIL() << "Incorrect warning: " << msgString;
2530 }
2531}
2532
Chris Forbes37367e62015-05-25 11:13:29 +12002533TEST_F(VkLayerTest, CreatePipelineAttribNotProvided)
2534{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002535 VkFlags msgFlags;
Chris Forbes37367e62015-05-25 11:13:29 +12002536 std::string msgString;
2537 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002538 ScopedUseGlsl useGlsl(false);
Chris Forbes37367e62015-05-25 11:13:29 +12002539
2540 char const *vsSource =
2541 "#version 140\n"
2542 "#extension GL_ARB_separate_shader_objects: require\n"
2543 "#extension GL_ARB_shading_language_420pack: require\n"
2544 "\n"
2545 "layout(location=0) in vec4 x;\n" /* not provided */
2546 "void main(){\n"
2547 " gl_Position = x;\n"
2548 "}\n";
2549 char const *fsSource =
2550 "#version 140\n"
2551 "#extension GL_ARB_separate_shader_objects: require\n"
2552 "#extension GL_ARB_shading_language_420pack: require\n"
2553 "\n"
2554 "layout(location=0) out vec4 color;\n"
2555 "void main(){\n"
2556 " color = vec4(1);\n"
2557 "}\n";
2558
2559 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2560 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2561
2562 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002563 pipe.AddColorAttachment();
Chris Forbes37367e62015-05-25 11:13:29 +12002564 pipe.AddShader(&vs);
2565 pipe.AddShader(&fs);
2566
2567 VkCommandBufferObj dummyCmd(m_device);
2568 VkDescriptorSetObj descriptorSet(m_device);
2569 descriptorSet.AppendDummy();
2570 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2571
2572 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002573 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes37367e62015-05-25 11:13:29 +12002574
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002575 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes37367e62015-05-25 11:13:29 +12002576
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002577 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes37367e62015-05-25 11:13:29 +12002578 if (!strstr(msgString.c_str(),"VS consumes input at location 0 but not provided")) {
2579 FAIL() << "Incorrect warning: " << msgString;
2580 }
2581}
2582
Chris Forbesa4b02322015-05-25 11:13:31 +12002583TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch)
2584{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002585 VkFlags msgFlags;
Chris Forbesa4b02322015-05-25 11:13:31 +12002586 std::string msgString;
2587 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002588 ScopedUseGlsl useGlsl(false);
Chris Forbesa4b02322015-05-25 11:13:31 +12002589
2590 VkVertexInputBindingDescription input_binding;
2591 memset(&input_binding, 0, sizeof(input_binding));
2592
2593 VkVertexInputAttributeDescription input_attrib;
2594 memset(&input_attrib, 0, sizeof(input_attrib));
2595 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2596
2597 char const *vsSource =
2598 "#version 140\n"
2599 "#extension GL_ARB_separate_shader_objects: require\n"
2600 "#extension GL_ARB_shading_language_420pack: require\n"
2601 "\n"
2602 "layout(location=0) in int x;\n" /* attrib provided float */
2603 "void main(){\n"
2604 " gl_Position = vec4(x);\n"
2605 "}\n";
2606 char const *fsSource =
2607 "#version 140\n"
2608 "#extension GL_ARB_separate_shader_objects: require\n"
2609 "#extension GL_ARB_shading_language_420pack: require\n"
2610 "\n"
2611 "layout(location=0) out vec4 color;\n"
2612 "void main(){\n"
2613 " color = vec4(1);\n"
2614 "}\n";
2615
2616 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2617 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2618
2619 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002620 pipe.AddColorAttachment();
Chris Forbesa4b02322015-05-25 11:13:31 +12002621 pipe.AddShader(&vs);
2622 pipe.AddShader(&fs);
2623
2624 pipe.AddVertexInputBindings(&input_binding, 1);
2625 pipe.AddVertexInputAttribs(&input_attrib, 1);
2626
2627 VkCommandBufferObj dummyCmd(m_device);
2628 VkDescriptorSetObj descriptorSet(m_device);
2629 descriptorSet.AppendDummy();
2630 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2631
2632 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002633 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbesa4b02322015-05-25 11:13:31 +12002634
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002635 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbesa4b02322015-05-25 11:13:31 +12002636
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002637 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbesa4b02322015-05-25 11:13:31 +12002638 if (!strstr(msgString.c_str(),"location 0 does not match VS input type")) {
2639 FAIL() << "Incorrect error: " << msgString;
2640 }
2641}
2642
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002643TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict)
2644{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002645 VkFlags msgFlags;
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002646 std::string msgString;
2647 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002648 ScopedUseGlsl useGlsl(false);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002649
2650 /* Two binding descriptions for binding 0 */
2651 VkVertexInputBindingDescription input_bindings[2];
2652 memset(input_bindings, 0, sizeof(input_bindings));
2653
2654 VkVertexInputAttributeDescription input_attrib;
2655 memset(&input_attrib, 0, sizeof(input_attrib));
2656 input_attrib.format = VK_FORMAT_R32_SFLOAT;
2657
2658 char const *vsSource =
2659 "#version 140\n"
2660 "#extension GL_ARB_separate_shader_objects: require\n"
2661 "#extension GL_ARB_shading_language_420pack: require\n"
2662 "\n"
2663 "layout(location=0) in float x;\n" /* attrib provided float */
2664 "void main(){\n"
2665 " gl_Position = vec4(x);\n"
2666 "}\n";
2667 char const *fsSource =
2668 "#version 140\n"
2669 "#extension GL_ARB_separate_shader_objects: require\n"
2670 "#extension GL_ARB_shading_language_420pack: require\n"
2671 "\n"
2672 "layout(location=0) out vec4 color;\n"
2673 "void main(){\n"
2674 " color = vec4(1);\n"
2675 "}\n";
2676
2677 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2678 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2679
2680 VkPipelineObj pipe(m_device);
Chia-I Wuc278df82015-07-07 11:50:03 +08002681 pipe.AddColorAttachment();
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002682 pipe.AddShader(&vs);
2683 pipe.AddShader(&fs);
2684
2685 pipe.AddVertexInputBindings(input_bindings, 2);
2686 pipe.AddVertexInputAttribs(&input_attrib, 1);
2687
2688 VkCommandBufferObj dummyCmd(m_device);
2689 VkDescriptorSetObj descriptorSet(m_device);
2690 descriptorSet.AppendDummy();
2691 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2692
2693 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002694 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002695
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002696 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002697
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002698 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes0bf8fe12015-06-12 11:16:41 +12002699 if (!strstr(msgString.c_str(),"Duplicate vertex input binding descriptions for binding 0")) {
2700 FAIL() << "Incorrect error: " << msgString;
2701 }
2702}
Chris Forbes4c948702015-05-25 11:13:32 +12002703
Chris Forbesc12ef122015-05-25 11:13:40 +12002704/* TODO: would be nice to test the mixed broadcast & custom case, but the GLSL->SPV compiler
2705 * rejects it. */
2706
2707TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten)
2708{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002709 VkFlags msgFlags;
Chris Forbesc12ef122015-05-25 11:13:40 +12002710 std::string msgString;
2711 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002712 ScopedUseGlsl useGlsl(false);
Chris Forbesc12ef122015-05-25 11:13:40 +12002713
2714 char const *vsSource =
2715 "#version 140\n"
2716 "#extension GL_ARB_separate_shader_objects: require\n"
2717 "#extension GL_ARB_shading_language_420pack: require\n"
2718 "\n"
2719 "void main(){\n"
2720 " gl_Position = vec4(1);\n"
2721 "}\n";
2722 char const *fsSource =
2723 "#version 140\n"
2724 "#extension GL_ARB_separate_shader_objects: require\n"
2725 "#extension GL_ARB_shading_language_420pack: require\n"
2726 "\n"
2727 "void main(){\n"
2728 "}\n";
2729
2730 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2731 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2732
2733 VkPipelineObj pipe(m_device);
2734 pipe.AddShader(&vs);
2735 pipe.AddShader(&fs);
2736
Chia-I Wuc278df82015-07-07 11:50:03 +08002737 /* set up CB 0, not written */
2738 pipe.AddColorAttachment();
2739 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc12ef122015-05-25 11:13:40 +12002740
2741 VkCommandBufferObj dummyCmd(m_device);
2742 VkDescriptorSetObj descriptorSet(m_device);
2743 descriptorSet.AppendDummy();
2744 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2745
2746 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002747 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbesc12ef122015-05-25 11:13:40 +12002748
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002749 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbesc12ef122015-05-25 11:13:40 +12002750
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002751 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbesc12ef122015-05-25 11:13:40 +12002752 if (!strstr(msgString.c_str(),"Attachment 0 not written by FS")) {
2753 FAIL() << "Incorrect error: " << msgString;
2754 }
2755}
2756
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002757TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed)
2758{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002759 VkFlags msgFlags;
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002760 std::string msgString;
2761 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002762 ScopedUseGlsl useGlsl(false);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002763
2764 char const *vsSource =
2765 "#version 140\n"
2766 "#extension GL_ARB_separate_shader_objects: require\n"
2767 "#extension GL_ARB_shading_language_420pack: require\n"
2768 "\n"
2769 "void main(){\n"
2770 " gl_Position = vec4(1);\n"
2771 "}\n";
2772 char const *fsSource =
2773 "#version 140\n"
2774 "#extension GL_ARB_separate_shader_objects: require\n"
2775 "#extension GL_ARB_shading_language_420pack: require\n"
2776 "\n"
2777 "layout(location=0) out vec4 x;\n"
2778 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
2779 "void main(){\n"
2780 " x = vec4(1);\n"
2781 " y = vec4(1);\n"
2782 "}\n";
2783
2784 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2785 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2786
2787 VkPipelineObj pipe(m_device);
2788 pipe.AddShader(&vs);
2789 pipe.AddShader(&fs);
2790
Chia-I Wuc278df82015-07-07 11:50:03 +08002791 /* set up CB 0, not written */
2792 pipe.AddColorAttachment();
2793 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002794 /* FS writes CB 1, but we don't configure it */
2795
2796 VkCommandBufferObj dummyCmd(m_device);
2797 VkDescriptorSetObj descriptorSet(m_device);
2798 descriptorSet.AppendDummy();
2799 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2800
2801 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002802 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002803
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002804 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002805
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002806 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbes5d15a4f2015-05-25 11:13:43 +12002807 if (!strstr(msgString.c_str(),"FS writes to output location 1 with no matching attachment")) {
2808 FAIL() << "Incorrect warning: " << msgString;
2809 }
2810}
2811
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002812TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch)
2813{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002814 VkFlags msgFlags;
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002815 std::string msgString;
2816 ASSERT_NO_FATAL_FAILURE(InitState());
Cody Northrop1cfbd172015-06-03 16:49:20 -06002817 ScopedUseGlsl useGlsl(false);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002818
2819 char const *vsSource =
2820 "#version 140\n"
2821 "#extension GL_ARB_separate_shader_objects: require\n"
2822 "#extension GL_ARB_shading_language_420pack: require\n"
2823 "\n"
2824 "void main(){\n"
2825 " gl_Position = vec4(1);\n"
2826 "}\n";
2827 char const *fsSource =
2828 "#version 140\n"
2829 "#extension GL_ARB_separate_shader_objects: require\n"
2830 "#extension GL_ARB_shading_language_420pack: require\n"
2831 "\n"
2832 "layout(location=0) out ivec4 x;\n" /* not UNORM */
2833 "void main(){\n"
2834 " x = ivec4(1);\n"
2835 "}\n";
2836
2837 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2838 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2839
2840 VkPipelineObj pipe(m_device);
2841 pipe.AddShader(&vs);
2842 pipe.AddShader(&fs);
2843
Chia-I Wuc278df82015-07-07 11:50:03 +08002844 /* set up CB 0; type is UNORM by default */
2845 pipe.AddColorAttachment();
2846 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002847
2848 VkCommandBufferObj dummyCmd(m_device);
2849 VkDescriptorSetObj descriptorSet(m_device);
2850 descriptorSet.AppendDummy();
2851 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2852
2853 m_errorMonitor->ClearState();
Chia-I Wuc278df82015-07-07 11:50:03 +08002854 pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002855
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002856 msgFlags = m_errorMonitor->GetState(&msgString);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002857
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002858 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT);
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002859 if (!strstr(msgString.c_str(),"does not match FS output type")) {
2860 FAIL() << "Incorrect error: " << msgString;
2861 }
2862}
Chris Forbesc2050732015-06-05 14:43:36 +12002863
2864TEST_F(VkLayerTest, CreatePipelineNonSpirvShader)
2865{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002866 VkFlags msgFlags;
Chris Forbesc2050732015-06-05 14:43:36 +12002867 std::string msgString;
2868 ASSERT_NO_FATAL_FAILURE(InitState());
2869 /* Intentionally provided GLSL rather than compiling to SPIRV first */
Cody Northrop1cfbd172015-06-03 16:49:20 -06002870 ScopedUseGlsl useGlsl(true);
Chris Forbesc2050732015-06-05 14:43:36 +12002871
2872 char const *vsSource =
2873 "#version 140\n"
2874 "#extension GL_ARB_separate_shader_objects: require\n"
2875 "#extension GL_ARB_shading_language_420pack: require\n"
2876 "\n"
2877 "void main(){\n"
2878 " gl_Position = vec4(1);\n"
2879 "}\n";
2880 char const *fsSource =
2881 "#version 140\n"
2882 "#extension GL_ARB_separate_shader_objects: require\n"
2883 "#extension GL_ARB_shading_language_420pack: require\n"
2884 "\n"
2885 "layout(location=0) out vec4 x;\n"
2886 "void main(){\n"
2887 " x = vec4(1);\n"
2888 "}\n";
2889
2890 m_errorMonitor->ClearState();
2891
2892 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX, this);
2893 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT, this);
2894
2895
2896 VkPipelineObj pipe(m_device);
2897 pipe.AddShader(&vs);
2898 pipe.AddShader(&fs);
2899
Chia-I Wuc278df82015-07-07 11:50:03 +08002900 /* set up CB 0; type is UNORM by default */
2901 pipe.AddColorAttachment();
2902 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc2050732015-06-05 14:43:36 +12002903
2904 VkCommandBufferObj dummyCmd(m_device);
2905 VkDescriptorSetObj descriptorSet(m_device);
2906 descriptorSet.AppendDummy();
2907 descriptorSet.CreateVKDescriptorSet(&dummyCmd);
2908
Chia-I Wuc278df82015-07-07 11:50:03 +08002909 VkResult res = pipe.CreateVKPipeline(descriptorSet, renderPass());
Chris Forbesc2050732015-06-05 14:43:36 +12002910 /* pipeline creation should have succeeded */
2911 ASSERT_EQ(VK_SUCCESS, res);
2912
2913 /* should have emitted a warning: the shader is not SPIRV, so we're
2914 * not going to be able to analyze it */
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06002915 msgFlags = m_errorMonitor->GetState(&msgString);
2916 ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT);
Chris Forbesc2050732015-06-05 14:43:36 +12002917 if (!strstr(msgString.c_str(),"is not SPIR-V")) {
2918 FAIL() << "Incorrect warning: " << msgString;
2919 }
2920}
Chris Forbes01c9db72015-06-04 09:25:25 +12002921#endif
Chris Forbes7d64a4f2015-05-25 11:13:44 +12002922
Tony Barbour30486ea2015-04-07 13:44:53 -06002923int main(int argc, char **argv) {
2924 int result;
2925
2926 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour01999182015-04-09 12:58:51 -06002927 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour30486ea2015-04-07 13:44:53 -06002928
2929 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
2930
2931 result = RUN_ALL_TESTS();
2932
Tony Barbour01999182015-04-09 12:58:51 -06002933 VkTestFramework::Finish();
Tony Barbour30486ea2015-04-07 13:44:53 -06002934 return result;
2935}