renderer_vulkan: Cleanup renderpass code
This commit is contained in:
@@ -213,9 +213,31 @@ void RendererVulkan::RenderToMailbox(const Layout::FramebufferLayout& layout,
|
|||||||
cmdbuf.setScissor(0, scissor);
|
cmdbuf.setScissor(0, scissor);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
DrawScreens(frame, layout, flipped);
|
||||||
|
|
||||||
|
scheduler.Flush(frame->render_ready);
|
||||||
|
scheduler.Record([&mailbox, frame](vk::CommandBuffer) { mailbox->Present(frame); });
|
||||||
|
scheduler.DispatchWork();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RendererVulkan::BeginRendering(Frame* frame) {
|
||||||
|
for (std::size_t i = 0; i < screen_infos.size(); i++) {
|
||||||
|
const auto& info = screen_infos[i];
|
||||||
|
present_textures[i] = vk::DescriptorImageInfo{
|
||||||
|
.imageView = info.image_view,
|
||||||
|
.imageLayout = vk::ImageLayout::eGeneral,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
present_textures[3].sampler = present_samplers[current_sampler];
|
||||||
|
|
||||||
|
vk::DescriptorSet set = desc_manager.AllocateSet(present_descriptor_layout);
|
||||||
|
instance.GetDevice().updateDescriptorSetWithTemplate(set, present_update_template,
|
||||||
|
present_textures[0]);
|
||||||
|
|
||||||
renderpass_cache.ExitRenderpass();
|
renderpass_cache.ExitRenderpass();
|
||||||
scheduler.Record([this, framebuffer = frame->framebuffer, width = frame->width,
|
scheduler.Record([this, framebuffer = frame->framebuffer, width = frame->width,
|
||||||
height = frame->height](vk::CommandBuffer cmdbuf) {
|
height = frame->height, set,
|
||||||
|
pipeline_index = current_pipeline](vk::CommandBuffer cmdbuf) {
|
||||||
const vk::ClearValue clear{.color = clear_color};
|
const vk::ClearValue clear{.color = clear_color};
|
||||||
const vk::RenderPassBeginInfo renderpass_begin_info = {
|
const vk::RenderPassBeginInfo renderpass_begin_info = {
|
||||||
.renderPass = renderpass_cache.GetPresentRenderpass(),
|
.renderPass = renderpass_cache.GetPresentRenderpass(),
|
||||||
@@ -230,32 +252,7 @@ void RendererVulkan::RenderToMailbox(const Layout::FramebufferLayout& layout,
|
|||||||
};
|
};
|
||||||
|
|
||||||
cmdbuf.beginRenderPass(renderpass_begin_info, vk::SubpassContents::eInline);
|
cmdbuf.beginRenderPass(renderpass_begin_info, vk::SubpassContents::eInline);
|
||||||
});
|
|
||||||
|
|
||||||
DrawScreens(layout, flipped);
|
|
||||||
|
|
||||||
scheduler.Flush(frame->render_ready);
|
|
||||||
scheduler.Record([&mailbox, frame](vk::CommandBuffer) { mailbox->Present(frame); });
|
|
||||||
scheduler.DispatchWork();
|
|
||||||
}
|
|
||||||
|
|
||||||
void RendererVulkan::BeginRendering() {
|
|
||||||
for (std::size_t i = 0; i < screen_infos.size(); i++) {
|
|
||||||
const auto& info = screen_infos[i];
|
|
||||||
present_textures[i] = vk::DescriptorImageInfo{
|
|
||||||
.imageView = info.image_view,
|
|
||||||
.imageLayout = vk::ImageLayout::eGeneral,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
present_textures[3].sampler = present_samplers[current_sampler];
|
|
||||||
|
|
||||||
vk::DescriptorSet set = desc_manager.AllocateSet(present_descriptor_layout);
|
|
||||||
instance.GetDevice().updateDescriptorSetWithTemplate(set, present_update_template,
|
|
||||||
present_textures[0]);
|
|
||||||
|
|
||||||
scheduler.Record([this, set, pipeline_index = current_pipeline](vk::CommandBuffer cmdbuf) {
|
|
||||||
cmdbuf.bindPipeline(vk::PipelineBindPoint::eGraphics, present_pipelines[pipeline_index]);
|
cmdbuf.bindPipeline(vk::PipelineBindPoint::eGraphics, present_pipelines[pipeline_index]);
|
||||||
|
|
||||||
cmdbuf.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, present_pipeline_layout, 0, set,
|
cmdbuf.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, present_pipeline_layout, 0, set,
|
||||||
{});
|
{});
|
||||||
});
|
});
|
||||||
@@ -808,7 +805,8 @@ void RendererVulkan::DrawSingleScreenStereo(u32 screen_id_l, u32 screen_id_r, fl
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void RendererVulkan::DrawScreens(const Layout::FramebufferLayout& layout, bool flipped) {
|
void RendererVulkan::DrawScreens(Frame* frame, const Layout::FramebufferLayout& layout,
|
||||||
|
bool flipped) {
|
||||||
if (settings.bg_color_update_requested.exchange(false)) {
|
if (settings.bg_color_update_requested.exchange(false)) {
|
||||||
clear_color.float32[0] = Settings::values.bg_red.GetValue();
|
clear_color.float32[0] = Settings::values.bg_red.GetValue();
|
||||||
clear_color.float32[1] = Settings::values.bg_green.GetValue();
|
clear_color.float32[1] = Settings::values.bg_green.GetValue();
|
||||||
@@ -837,7 +835,7 @@ void RendererVulkan::DrawScreens(const Layout::FramebufferLayout& layout, bool f
|
|||||||
render_3d == Settings::StereoRenderOption::ReverseInterlaced;
|
render_3d == Settings::StereoRenderOption::ReverseInterlaced;
|
||||||
|
|
||||||
// Bind necessary state before drawing the screens
|
// Bind necessary state before drawing the screens
|
||||||
BeginRendering();
|
BeginRendering(frame);
|
||||||
|
|
||||||
draw_info.layer = 0;
|
draw_info.layer = 0;
|
||||||
if (layout.top_screen_enabled) {
|
if (layout.top_screen_enabled) {
|
||||||
@@ -1028,26 +1026,7 @@ void RendererVulkan::RenderScreenshot() {
|
|||||||
Frame frame{};
|
Frame frame{};
|
||||||
mailbox->ReloadFrame(&frame, width, height);
|
mailbox->ReloadFrame(&frame, width, height);
|
||||||
|
|
||||||
renderpass_cache.ExitRenderpass();
|
DrawScreens(&frame, layout, false);
|
||||||
scheduler.Record([this, framebuffer = frame.framebuffer, width = frame.width,
|
|
||||||
height = frame.height](vk::CommandBuffer cmdbuf) {
|
|
||||||
const vk::ClearValue clear{.color = clear_color};
|
|
||||||
const vk::RenderPassBeginInfo renderpass_begin_info = {
|
|
||||||
.renderPass = renderpass_cache.GetPresentRenderpass(),
|
|
||||||
.framebuffer = framebuffer,
|
|
||||||
.renderArea =
|
|
||||||
vk::Rect2D{
|
|
||||||
.offset = {0, 0},
|
|
||||||
.extent = {width, height},
|
|
||||||
},
|
|
||||||
.clearValueCount = 1,
|
|
||||||
.pClearValues = &clear,
|
|
||||||
};
|
|
||||||
|
|
||||||
cmdbuf.beginRenderPass(renderpass_begin_info, vk::SubpassContents::eInline);
|
|
||||||
});
|
|
||||||
|
|
||||||
DrawScreens(layout, false);
|
|
||||||
|
|
||||||
scheduler.Record(
|
scheduler.Record(
|
||||||
[width, height, source_image = frame.image, staging_image](vk::CommandBuffer cmdbuf) {
|
[width, height, source_image = frame.image, staging_image](vk::CommandBuffer cmdbuf) {
|
||||||
|
@@ -54,6 +54,7 @@ struct ScreenInfo {
|
|||||||
vk::ImageView image_view;
|
vk::ImageView image_view;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Frame;
|
||||||
class PresentMailbox;
|
class PresentMailbox;
|
||||||
|
|
||||||
class RendererVulkan : public VideoCore::RendererBase {
|
class RendererVulkan : public VideoCore::RendererBase {
|
||||||
@@ -89,12 +90,12 @@ private:
|
|||||||
void RenderScreenshot();
|
void RenderScreenshot();
|
||||||
void RenderToMailbox(const Layout::FramebufferLayout& layout,
|
void RenderToMailbox(const Layout::FramebufferLayout& layout,
|
||||||
std::unique_ptr<PresentMailbox>& mailbox, bool flipped);
|
std::unique_ptr<PresentMailbox>& mailbox, bool flipped);
|
||||||
void BeginRendering();
|
void BeginRendering(Frame* frame);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draws the emulated screens to the emulator window.
|
* Draws the emulated screens to the render frame.
|
||||||
*/
|
*/
|
||||||
void DrawScreens(const Layout::FramebufferLayout& layout, bool flipped);
|
void DrawScreens(Frame* frame, const Layout::FramebufferLayout& layout, bool flipped);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draws a single texture to the emulator window.
|
* Draws a single texture to the emulator window.
|
||||||
|
Reference in New Issue
Block a user