Use dynamic state for viewports to avoid pipeline recreation

This commit is contained in:
Robin Voetter
2020-07-04 17:30:22 +02:00
parent 40b74caee5
commit 8c9bb747c3
2 changed files with 25 additions and 23 deletions

View File

@@ -67,6 +67,8 @@ const DeviceDispatch = struct {
vkCmdEndRenderPass: vk.PfnCmdEndRenderPass, vkCmdEndRenderPass: vk.PfnCmdEndRenderPass,
vkCmdBindPipeline: vk.PfnCmdBindPipeline, vkCmdBindPipeline: vk.PfnCmdBindPipeline,
vkCmdDraw: vk.PfnCmdDraw, vkCmdDraw: vk.PfnCmdDraw,
vkCmdSetViewport: vk.PfnCmdSetViewport,
vkCmdSetScissor: vk.PfnCmdSetScissor,
usingnamespace vk.DeviceWrapper(@This()); usingnamespace vk.DeviceWrapper(@This());
}; };

View File

@@ -85,9 +85,6 @@ pub fn main() !void {
extent.height = @intCast(u32, h); extent.height = @intCast(u32, h);
try swapchain.recreate(extent); try swapchain.recreate(extent);
gc.vkd.destroyPipeline(gc.dev, pipeline, null);
pipeline = try createPipeline(&gc, extent, pipeline_layout, render_pass);
destroyFramebuffers(&gc, allocator, framebuffers); destroyFramebuffers(&gc, allocator, framebuffers);
framebuffers = try createFramebuffers(&gc, allocator, render_pass, swapchain); framebuffers = try createFramebuffers(&gc, allocator, render_pass, swapchain);
@@ -133,12 +130,29 @@ fn createCommandBuffers(
.color = .{.float_32 = .{0, 0, 0, 1}}, .color = .{.float_32 = .{0, 0, 0, 1}},
}; };
const viewport = vk.Viewport{
.x = 0,
.y = 0,
.width = @intToFloat(f32, extent.width),
.height = @intToFloat(f32, extent.height),
.min_depth = 0,
.max_depth = 1,
};
const scissor = vk.Rect2D{
.offset = .{.x = 0, .y = 0},
.extent = extent,
};
for (cmdbufs) |cmdbuf, i| { for (cmdbufs) |cmdbuf, i| {
try gc.vkd.beginCommandBuffer(cmdbuf, .{ try gc.vkd.beginCommandBuffer(cmdbuf, .{
.flags = .{}, .flags = .{},
.p_inheritance_info = null, .p_inheritance_info = null,
}); });
gc.vkd.cmdSetViewport(cmdbuf, 0, 1, @ptrCast([*]const vk.Viewport, &viewport));
gc.vkd.cmdSetScissor(cmdbuf, 0, 1, @ptrCast([*]const vk.Rect2D, &scissor));
gc.vkd.cmdBeginRenderPass(cmdbuf, .{ gc.vkd.cmdBeginRenderPass(cmdbuf, .{
.render_pass = render_pass, .render_pass = render_pass,
.framebuffer = framebuffers[i], .framebuffer = framebuffers[i],
@@ -291,26 +305,12 @@ fn createPipeline(
.primitive_restart_enable = vk.FALSE, .primitive_restart_enable = vk.FALSE,
}; };
const viewport = vk.Viewport{
.x = 0,
.y = 0,
.width = @intToFloat(f32, extent.width),
.height = @intToFloat(f32, extent.height),
.min_depth = 0,
.max_depth = 1,
};
const scissor = vk.Rect2D{
.offset = .{.x = 0, .y = 0},
.extent = extent,
};
const pvsci = vk.PipelineViewportStateCreateInfo{ const pvsci = vk.PipelineViewportStateCreateInfo{
.flags = .{}, .flags = .{},
.viewport_count = 1, .viewport_count = 1,
.p_viewports = @ptrCast([*]const vk.Viewport, &viewport), .p_viewports = undefined, // set in createCommandBuffers with cmdSetViewport
.scissor_count = 1, .scissor_count = 1,
.p_scissors = @ptrCast([*]const vk.Rect2D, &scissor), .p_scissors = undefined, // set in createCommandBuffers with cmdSetScissor
}; };
const prsci = vk.PipelineRasterizationStateCreateInfo{ const prsci = vk.PipelineRasterizationStateCreateInfo{
@@ -357,11 +357,11 @@ fn createPipeline(
.blend_constants = [_]f32{0, 0, 0, 0}, .blend_constants = [_]f32{0, 0, 0, 0},
}; };
const dynstate = vk.DynamicState.viewport; const dynstate = [_]vk.DynamicState{.viewport, .scissor};
const pdsci = vk.PipelineDynamicStateCreateInfo{ const pdsci = vk.PipelineDynamicStateCreateInfo{
.flags = .{}, .flags = .{},
.dynamic_state_count = 1, .dynamic_state_count = dynstate.len,
.p_dynamic_states = @ptrCast([*]const vk.DynamicState, &dynstate), .p_dynamic_states = &dynstate,
}; };
const gpci = vk.GraphicsPipelineCreateInfo{ const gpci = vk.GraphicsPipelineCreateInfo{
@@ -376,7 +376,7 @@ fn createPipeline(
.p_multisample_state = &pmsci, .p_multisample_state = &pmsci,
.p_depth_stencil_state = null, .p_depth_stencil_state = null,
.p_color_blend_state = &pcbsci, .p_color_blend_state = &pcbsci,
.p_dynamic_state = null, //&pdsci, .p_dynamic_state = &pdsci,
.layout = layout, .layout = layout,
.render_pass = render_pass, .render_pass = render_pass,
.subpass = 0, .subpass = 0,