Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision e09ad383a5718745fae0cdaf71a7cf4aca1a9507)
+++ vulkan-game.cpp	(revision 84216c71959c5122ff6b8948a6d96a8bf1a351a5)
@@ -113,4 +113,5 @@
 
       vector<VkImageView> swapChainImageViews;
+      VkPipelineLayout pipelineLayout;
 
       // both SDL and GLFW create window functions return NULL on failure
@@ -578,4 +579,72 @@
 
          VkPipelineShaderStageCreateInfo shaderStages[] = { vertShaderStageInfo, fragShaderStageInfo };
+
+         VkPipelineVertexInputStateCreateInfo vertexInputInfo = {};
+         vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
+         vertexInputInfo.vertexBindingDescriptionCount = 0;
+         vertexInputInfo.vertexAttributeDescriptionCount = 0;
+
+         VkPipelineInputAssemblyStateCreateInfo inputAssembly = {};
+         inputAssembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
+         inputAssembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+         inputAssembly.primitiveRestartEnable = VK_FALSE;
+
+         VkViewport viewport = {};
+         viewport.x = 0.0f;
+         viewport.y = 0.0f;
+         viewport.width = (float) swapChainExtent.width;
+         viewport.height = (float) swapChainExtent.height;
+         viewport.minDepth = 0.0f;
+         viewport.maxDepth = 1.0f;
+
+         VkRect2D scissor = {};
+         scissor.offset = { 0, 0 };
+         scissor.extent = swapChainExtent;
+
+         VkPipelineViewportStateCreateInfo viewportState = {};
+         viewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
+         viewportState.viewportCount = 1;
+         viewportState.pViewports = &viewport;
+         viewportState.scissorCount = 1;
+         viewportState.pScissors = &scissor;
+
+         VkPipelineRasterizationStateCreateInfo rasterizer = {};
+         rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
+         rasterizer.depthClampEnable = VK_FALSE;
+         rasterizer.rasterizerDiscardEnable = VK_FALSE;
+         rasterizer.polygonMode = VK_POLYGON_MODE_FILL;
+         rasterizer.lineWidth = 1.0f;
+         rasterizer.cullMode = VK_CULL_MODE_BACK_BIT;
+         rasterizer.frontFace = VK_FRONT_FACE_CLOCKWISE;
+         rasterizer.depthBiasEnable = false;
+
+         VkPipelineMultisampleStateCreateInfo multisampling = {};
+         multisampling.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
+         multisampling.sampleShadingEnable = VK_FALSE;
+         multisampling.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
+
+         VkPipelineColorBlendAttachmentState colorBlendAttachment = {};
+         colorBlendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
+         colorBlendAttachment.blendEnable = VK_FALSE;
+
+         VkPipelineColorBlendStateCreateInfo colorBlending = {};
+         colorBlending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
+         colorBlending.logicOpEnable = VK_FALSE;
+         colorBlending.logicOp = VK_LOGIC_OP_COPY;
+         colorBlending.attachmentCount = 1;
+         colorBlending.pAttachments = &colorBlendAttachment;
+         colorBlending.blendConstants[0] = 0.0f;
+         colorBlending.blendConstants[1] = 0.0f;
+         colorBlending.blendConstants[2] = 0.0f;
+         colorBlending.blendConstants[3] = 0.0f;
+
+         VkPipelineLayoutCreateInfo pipelineLayoutInfo = {};
+         pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
+         pipelineLayoutInfo.setLayoutCount = 0;
+         pipelineLayoutInfo.pushConstantRangeCount = 0;
+
+         if (vkCreatePipelineLayout(device, &pipelineLayoutInfo, nullptr, &pipelineLayout) != VK_SUCCESS) {
+            throw runtime_error("failed to create pipeline layout!");
+         }
 
          vkDestroyShaderModule(device, vertShaderModule, nullptr);
@@ -624,4 +693,6 @@
 
       void cleanup() {
+         vkDestroyPipelineLayout(device, pipelineLayout, nullptr);
+
          for (auto imageView : swapChainImageViews) {
             vkDestroyImageView(device, imageView, nullptr);
