@@ -67,7 +67,7 @@ int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmd
6767 auto instance = VulkanInstanceBuilder ()
6868 .RequireExtension (VK_KHR_SURFACE_EXTENSION_NAME)
6969 .RequireExtension (VK_KHR_WIN32_SURFACE_EXTENSION_NAME)
70- .DebugLayer (false )
70+ .DebugLayer (true )
7171 .Create ();
7272
7373 // Create a surface for our window
@@ -239,7 +239,7 @@ int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmd
239239 .DebugName (" textureSetLayout" )
240240 .Create (device.get ());
241241
242- // Create a pipeline layouts
242+ // Create pipeline layouts
243243
244244 auto pipelineLayoutNoTex = PipelineLayoutBuilder ()
245245 .AddSetLayout (uniformSetLayout.get ())
@@ -260,23 +260,75 @@ int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmd
260260 .AddSubpassColorAttachmentRef (0 , VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
261261 .Create (device.get ());
262262
263- // Create pipelines (which shaders to use, blending rules, etc.)
263+ // Create pipelines
264264
265- auto pipelineNoTex = GraphicsPipelineBuilder ()
266- .RenderPass (renderPass.get ())
267- .Layout (pipelineLayoutNoTex.get ())
268- .AddVertexBufferBinding (0 , sizeof (Vertex))
269- .AddVertexAttribute (0 , 0 , VK_FORMAT_R32G32B32_SFLOAT, offsetof (Vertex, x))
270- .AddVertexAttribute (1 , 0 , VK_FORMAT_R32G32_SFLOAT, offsetof (Vertex, u))
271- .AddVertexAttribute (2 , 0 , VK_FORMAT_R32G32B32A32_SFLOAT, offsetof (Vertex, r))
272- .AddVertexShader (vertexShader.get ())
273- .AddFragmentShader (fragmentShaderNoTex.get ())
274- .AddDynamicState (VK_DYNAMIC_STATE_VIEWPORT)
275- .AddDynamicState (VK_DYNAMIC_STATE_SCISSOR)
276- .DebugName (" pipelineNoTex" )
277- .Create (device.get ());
265+ std::unique_ptr<VulkanPipeline> libraryNoTex, libraryBlend;
266+ std::unique_ptr<VulkanPipeline> pipelineNoTex, pipelineTextured;
267+
268+ // Can we use pipeline libraries?
269+
270+ if (device->EnabledFeatures .GraphicsPipelineLibrary .graphicsPipelineLibrary )
271+ {
272+ libraryNoTex = GraphicsPipelineBuilder ()
273+ .RenderPass (renderPass.get ())
274+ .Layout (pipelineLayoutNoTex.get ())
275+ .Flags (
276+ VK_PIPELINE_CREATE_LIBRARY_BIT_KHR |
277+ VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT)
278+ .LibraryFlags (
279+ VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT |
280+ VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT |
281+ VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT)
282+ .AddVertexBufferBinding (0 , sizeof (Vertex))
283+ .AddVertexAttribute (0 , 0 , VK_FORMAT_R32G32B32_SFLOAT, offsetof (Vertex, x))
284+ .AddVertexAttribute (1 , 0 , VK_FORMAT_R32G32_SFLOAT, offsetof (Vertex, u))
285+ .AddVertexAttribute (2 , 0 , VK_FORMAT_R32G32B32A32_SFLOAT, offsetof (Vertex, r))
286+ .AddVertexShader (vertexShader.get ())
287+ .AddFragmentShader (fragmentShaderNoTex.get ())
288+ .AddDynamicState (VK_DYNAMIC_STATE_VIEWPORT)
289+ .AddDynamicState (VK_DYNAMIC_STATE_SCISSOR)
290+ .DebugName (" libraryNoTex" )
291+ .Create (device.get ());
292+
293+ libraryBlend = GraphicsPipelineBuilder ()
294+ .RenderPass (renderPass.get ())
295+ .Layout (pipelineLayoutNoTex.get ())
296+ .Flags (
297+ VK_PIPELINE_CREATE_LIBRARY_BIT_KHR |
298+ VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT)
299+ .LibraryFlags (
300+ VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT)
301+ .AddColorBlendAttachment (ColorBlendAttachmentBuilder ()
302+ .AlphaBlendMode ()
303+ .Create ())
304+ .DebugName (" libraryNoTex" )
305+ .Create (device.get ());
306+
307+ pipelineNoTex = GraphicsPipelineBuilder ()
308+ .Flags (VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT)
309+ .AddLibrary (libraryNoTex.get ())
310+ .AddLibrary (libraryBlend.get ())
311+ .DebugName (" pipelineNoTex" )
312+ .Create (device.get ());
313+ }
314+ else
315+ {
316+ pipelineNoTex = GraphicsPipelineBuilder ()
317+ .RenderPass (renderPass.get ())
318+ .Layout (pipelineLayoutNoTex.get ())
319+ .AddVertexBufferBinding (0 , sizeof (Vertex))
320+ .AddVertexAttribute (0 , 0 , VK_FORMAT_R32G32B32_SFLOAT, offsetof (Vertex, x))
321+ .AddVertexAttribute (1 , 0 , VK_FORMAT_R32G32_SFLOAT, offsetof (Vertex, u))
322+ .AddVertexAttribute (2 , 0 , VK_FORMAT_R32G32B32A32_SFLOAT, offsetof (Vertex, r))
323+ .AddVertexShader (vertexShader.get ())
324+ .AddFragmentShader (fragmentShaderNoTex.get ())
325+ .AddDynamicState (VK_DYNAMIC_STATE_VIEWPORT)
326+ .AddDynamicState (VK_DYNAMIC_STATE_SCISSOR)
327+ .DebugName (" pipelineNoTex" )
328+ .Create (device.get ());
329+ }
278330
279- auto pipelineTextured = GraphicsPipelineBuilder ()
331+ pipelineTextured = GraphicsPipelineBuilder ()
280332 .RenderPass (renderPass.get ())
281333 .Layout (pipelineLayoutTextured.get ())
282334 .AddVertexBufferBinding (0 , sizeof (Vertex))
0 commit comments