mirror of
https://github.com/Lime3DS/Lime3DS
synced 2024-12-25 16:42:39 -06:00
renderer_vulkan: Rename renderpass cache to render manager
* It is no longer just a cache
This commit is contained in:
parent
b08f382c7c
commit
b3c73d8e8e
18 changed files with 114 additions and 96 deletions
|
@ -183,8 +183,8 @@ if (ENABLE_VULKAN)
|
||||||
renderer_vulkan/vk_platform.h
|
renderer_vulkan/vk_platform.h
|
||||||
renderer_vulkan/vk_present_window.cpp
|
renderer_vulkan/vk_present_window.cpp
|
||||||
renderer_vulkan/vk_present_window.h
|
renderer_vulkan/vk_present_window.h
|
||||||
renderer_vulkan/vk_renderpass_cache.cpp
|
renderer_vulkan/vk_render_manager.cpp
|
||||||
renderer_vulkan/vk_renderpass_cache.h
|
renderer_vulkan/vk_render_manager.h
|
||||||
renderer_vulkan/vk_shader_util.cpp
|
renderer_vulkan/vk_shader_util.cpp
|
||||||
renderer_vulkan/vk_shader_util.h
|
renderer_vulkan/vk_shader_util.h
|
||||||
renderer_vulkan/vk_stream_buffer.cpp
|
renderer_vulkan/vk_stream_buffer.cpp
|
||||||
|
|
|
@ -54,8 +54,7 @@ RendererVulkan::RendererVulkan(Core::System& system, Pica::PicaCore& pica_,
|
||||||
Frontend::EmuWindow& window, Frontend::EmuWindow* secondary_window)
|
Frontend::EmuWindow& window, Frontend::EmuWindow* secondary_window)
|
||||||
: RendererBase{system, window, secondary_window}, memory{system.Memory()}, pica{pica_},
|
: RendererBase{system, window, secondary_window}, memory{system.Memory()}, pica{pica_},
|
||||||
instance{window, Settings::values.physical_device.GetValue()}, scheduler{instance},
|
instance{window, Settings::values.physical_device.GetValue()}, scheduler{instance},
|
||||||
renderpass_cache{instance, scheduler}, pool{instance}, main_window{window, instance,
|
render_manager{instance, scheduler}, pool{instance}, main_window{window, instance, scheduler},
|
||||||
scheduler},
|
|
||||||
vertex_buffer{instance, scheduler, vk::BufferUsageFlagBits::eVertexBuffer,
|
vertex_buffer{instance, scheduler, vk::BufferUsageFlagBits::eVertexBuffer,
|
||||||
VERTEX_BUFFER_SIZE},
|
VERTEX_BUFFER_SIZE},
|
||||||
rasterizer{memory,
|
rasterizer{memory,
|
||||||
|
@ -66,7 +65,7 @@ RendererVulkan::RendererVulkan(Core::System& system, Pica::PicaCore& pica_,
|
||||||
instance,
|
instance,
|
||||||
scheduler,
|
scheduler,
|
||||||
pool,
|
pool,
|
||||||
renderpass_cache,
|
render_manager,
|
||||||
main_window.ImageCount()},
|
main_window.ImageCount()},
|
||||||
present_set_provider{instance, pool, PRESENT_BINDINGS} {
|
present_set_provider{instance, pool, PRESENT_BINDINGS} {
|
||||||
CompileShaders();
|
CompileShaders();
|
||||||
|
@ -135,7 +134,7 @@ void RendererVulkan::PrepareDraw(Frame* frame, const Layout::FramebufferLayout&
|
||||||
|
|
||||||
const auto descriptor_set = present_set_provider.Acquire(present_textures);
|
const auto descriptor_set = present_set_provider.Acquire(present_textures);
|
||||||
|
|
||||||
renderpass_cache.EndRendering();
|
render_manager.EndRendering();
|
||||||
scheduler.Record([this, layout, frame, descriptor_set, renderpass = main_window.Renderpass(),
|
scheduler.Record([this, layout, frame, descriptor_set, renderpass = main_window.Renderpass(),
|
||||||
index = current_pipeline](vk::CommandBuffer cmdbuf) {
|
index = current_pipeline](vk::CommandBuffer cmdbuf) {
|
||||||
const vk::Viewport viewport = {
|
const vk::Viewport viewport = {
|
||||||
|
@ -470,7 +469,7 @@ void RendererVulkan::FillScreen(Common::Vec3<u8> color, const TextureInfo& textu
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
renderpass_cache.EndRendering();
|
render_manager.EndRendering();
|
||||||
scheduler.Record([image = texture.image, clear_color](vk::CommandBuffer cmdbuf) {
|
scheduler.Record([image = texture.image, clear_color](vk::CommandBuffer cmdbuf) {
|
||||||
const vk::ImageSubresourceRange range = {
|
const vk::ImageSubresourceRange range = {
|
||||||
.aspectMask = vk::ImageAspectFlagBits::eColor,
|
.aspectMask = vk::ImageAspectFlagBits::eColor,
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
#include "video_core/renderer_vulkan/vk_instance.h"
|
#include "video_core/renderer_vulkan/vk_instance.h"
|
||||||
#include "video_core/renderer_vulkan/vk_present_window.h"
|
#include "video_core/renderer_vulkan/vk_present_window.h"
|
||||||
#include "video_core/renderer_vulkan/vk_rasterizer.h"
|
#include "video_core/renderer_vulkan/vk_rasterizer.h"
|
||||||
#include "video_core/renderer_vulkan/vk_renderpass_cache.h"
|
#include "video_core/renderer_vulkan/vk_render_manager.h"
|
||||||
#include "video_core/renderer_vulkan/vk_scheduler.h"
|
#include "video_core/renderer_vulkan/vk_scheduler.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
@ -118,7 +118,7 @@ private:
|
||||||
|
|
||||||
Instance instance;
|
Instance instance;
|
||||||
Scheduler scheduler;
|
Scheduler scheduler;
|
||||||
RenderpassCache renderpass_cache;
|
RenderManager render_manager;
|
||||||
DescriptorPool pool;
|
DescriptorPool pool;
|
||||||
PresentWindow main_window;
|
PresentWindow main_window;
|
||||||
StreamBuffer vertex_buffer;
|
StreamBuffer vertex_buffer;
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
#include "common/vector_math.h"
|
#include "common/vector_math.h"
|
||||||
#include "video_core/renderer_vulkan/vk_blit_helper.h"
|
#include "video_core/renderer_vulkan/vk_blit_helper.h"
|
||||||
#include "video_core/renderer_vulkan/vk_instance.h"
|
#include "video_core/renderer_vulkan/vk_instance.h"
|
||||||
#include "video_core/renderer_vulkan/vk_renderpass_cache.h"
|
#include "video_core/renderer_vulkan/vk_render_manager.h"
|
||||||
#include "video_core/renderer_vulkan/vk_scheduler.h"
|
#include "video_core/renderer_vulkan/vk_scheduler.h"
|
||||||
#include "video_core/renderer_vulkan/vk_shader_util.h"
|
#include "video_core/renderer_vulkan/vk_shader_util.h"
|
||||||
#include "video_core/renderer_vulkan/vk_texture_runtime.h"
|
#include "video_core/renderer_vulkan/vk_texture_runtime.h"
|
||||||
|
@ -178,8 +178,8 @@ constexpr vk::PipelineShaderStageCreateInfo MakeStages(vk::ShaderModule compute_
|
||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
|
||||||
BlitHelper::BlitHelper(const Instance& instance_, Scheduler& scheduler_, DescriptorPool& pool,
|
BlitHelper::BlitHelper(const Instance& instance_, Scheduler& scheduler_, DescriptorPool& pool,
|
||||||
RenderpassCache& renderpass_cache_)
|
RenderManager& render_manager_)
|
||||||
: instance{instance_}, scheduler{scheduler_}, renderpass_cache{renderpass_cache_},
|
: instance{instance_}, scheduler{scheduler_}, render_manager{render_manager_},
|
||||||
device{instance.GetDevice()}, compute_provider{instance, pool, COMPUTE_BINDINGS},
|
device{instance.GetDevice()}, compute_provider{instance, pool, COMPUTE_BINDINGS},
|
||||||
compute_buffer_provider{instance, pool, COMPUTE_BUFFER_BINDINGS},
|
compute_buffer_provider{instance, pool, COMPUTE_BUFFER_BINDINGS},
|
||||||
two_textures_provider{instance, pool, TWO_TEXTURES_BINDINGS},
|
two_textures_provider{instance, pool, TWO_TEXTURES_BINDINGS},
|
||||||
|
@ -303,10 +303,10 @@ bool BlitHelper::BlitDepthStencil(Surface& source, Surface& dest,
|
||||||
const RenderPass depth_pass = {
|
const RenderPass depth_pass = {
|
||||||
.framebuffer = dest.Framebuffer(),
|
.framebuffer = dest.Framebuffer(),
|
||||||
.render_pass =
|
.render_pass =
|
||||||
renderpass_cache.GetRenderpass(PixelFormat::Invalid, dest.pixel_format, false),
|
render_manager.GetRenderpass(PixelFormat::Invalid, dest.pixel_format, false),
|
||||||
.render_area = dst_render_area,
|
.render_area = dst_render_area,
|
||||||
};
|
};
|
||||||
renderpass_cache.BeginRendering(depth_pass);
|
render_manager.BeginRendering(depth_pass);
|
||||||
|
|
||||||
scheduler.Record([blit, descriptor_set, this](vk::CommandBuffer cmdbuf) {
|
scheduler.Record([blit, descriptor_set, this](vk::CommandBuffer cmdbuf) {
|
||||||
const vk::PipelineLayout layout = two_textures_pipeline_layout;
|
const vk::PipelineLayout layout = two_textures_pipeline_layout;
|
||||||
|
@ -338,7 +338,7 @@ bool BlitHelper::ConvertDS24S8ToRGBA8(Surface& source, Surface& dest,
|
||||||
|
|
||||||
const auto descriptor_set = compute_provider.Acquire(textures);
|
const auto descriptor_set = compute_provider.Acquire(textures);
|
||||||
|
|
||||||
renderpass_cache.EndRendering();
|
render_manager.EndRendering();
|
||||||
scheduler.Record([this, descriptor_set, copy, src_image = source.Image(),
|
scheduler.Record([this, descriptor_set, copy, src_image = source.Image(),
|
||||||
dst_image = dest.Image()](vk::CommandBuffer cmdbuf) {
|
dst_image = dest.Image()](vk::CommandBuffer cmdbuf) {
|
||||||
const std::array pre_barriers = {
|
const std::array pre_barriers = {
|
||||||
|
@ -461,7 +461,7 @@ bool BlitHelper::DepthToBuffer(Surface& source, vk::Buffer buffer,
|
||||||
|
|
||||||
const auto descriptor_set = compute_buffer_provider.Acquire(textures);
|
const auto descriptor_set = compute_buffer_provider.Acquire(textures);
|
||||||
|
|
||||||
renderpass_cache.EndRendering();
|
render_manager.EndRendering();
|
||||||
scheduler.Record([this, descriptor_set, copy, src_image = source.Image(),
|
scheduler.Record([this, descriptor_set, copy, src_image = source.Image(),
|
||||||
extent = source.RealExtent(false)](vk::CommandBuffer cmdbuf) {
|
extent = source.RealExtent(false)](vk::CommandBuffer cmdbuf) {
|
||||||
const vk::ImageMemoryBarrier pre_barrier = {
|
const vk::ImageMemoryBarrier pre_barrier = {
|
||||||
|
@ -547,7 +547,7 @@ vk::Pipeline BlitHelper::MakeDepthStencilBlitPipeline() {
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::array stages = MakeStages(full_screen_vert, blit_depth_stencil_frag);
|
const std::array stages = MakeStages(full_screen_vert, blit_depth_stencil_frag);
|
||||||
const auto renderpass = renderpass_cache.GetRenderpass(VideoCore::PixelFormat::Invalid,
|
const auto renderpass = render_manager.GetRenderpass(VideoCore::PixelFormat::Invalid,
|
||||||
VideoCore::PixelFormat::D24S8, false);
|
VideoCore::PixelFormat::D24S8, false);
|
||||||
vk::GraphicsPipelineCreateInfo depth_stencil_info = {
|
vk::GraphicsPipelineCreateInfo depth_stencil_info = {
|
||||||
.stageCount = static_cast<u32>(stages.size()),
|
.stageCount = static_cast<u32>(stages.size()),
|
||||||
|
|
|
@ -15,7 +15,7 @@ struct BufferTextureCopy;
|
||||||
namespace Vulkan {
|
namespace Vulkan {
|
||||||
|
|
||||||
class Instance;
|
class Instance;
|
||||||
class RenderpassCache;
|
class RenderManager;
|
||||||
class Scheduler;
|
class Scheduler;
|
||||||
class Surface;
|
class Surface;
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ class BlitHelper {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BlitHelper(const Instance& instance, Scheduler& scheduler, DescriptorPool& pool,
|
BlitHelper(const Instance& instance, Scheduler& scheduler, DescriptorPool& pool,
|
||||||
RenderpassCache& renderpass_cache);
|
RenderManager& render_manager);
|
||||||
~BlitHelper();
|
~BlitHelper();
|
||||||
|
|
||||||
bool BlitDepthStencil(Surface& source, Surface& dest, const VideoCore::TextureBlit& blit);
|
bool BlitDepthStencil(Surface& source, Surface& dest, const VideoCore::TextureBlit& blit);
|
||||||
|
@ -41,7 +41,7 @@ private:
|
||||||
private:
|
private:
|
||||||
const Instance& instance;
|
const Instance& instance;
|
||||||
Scheduler& scheduler;
|
Scheduler& scheduler;
|
||||||
RenderpassCache& renderpass_cache;
|
RenderManager& render_manager;
|
||||||
|
|
||||||
vk::Device device;
|
vk::Device device;
|
||||||
vk::RenderPass r32_renderpass;
|
vk::RenderPass r32_renderpass;
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
#include "video_core/renderer_vulkan/pica_to_vk.h"
|
#include "video_core/renderer_vulkan/pica_to_vk.h"
|
||||||
#include "video_core/renderer_vulkan/vk_graphics_pipeline.h"
|
#include "video_core/renderer_vulkan/vk_graphics_pipeline.h"
|
||||||
#include "video_core/renderer_vulkan/vk_instance.h"
|
#include "video_core/renderer_vulkan/vk_instance.h"
|
||||||
#include "video_core/renderer_vulkan/vk_renderpass_cache.h"
|
#include "video_core/renderer_vulkan/vk_render_manager.h"
|
||||||
#include "video_core/renderer_vulkan/vk_shader_util.h"
|
#include "video_core/renderer_vulkan/vk_shader_util.h"
|
||||||
|
|
||||||
namespace Vulkan {
|
namespace Vulkan {
|
||||||
|
@ -64,11 +64,11 @@ Shader::~Shader() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GraphicsPipeline::GraphicsPipeline(const Instance& instance_, RenderpassCache& renderpass_cache_,
|
GraphicsPipeline::GraphicsPipeline(const Instance& instance_, RenderManager& render_manager_,
|
||||||
const PipelineInfo& info_, vk::PipelineCache pipeline_cache_,
|
const PipelineInfo& info_, vk::PipelineCache pipeline_cache_,
|
||||||
vk::PipelineLayout layout_, std::array<Shader*, 3> stages_,
|
vk::PipelineLayout layout_, std::array<Shader*, 3> stages_,
|
||||||
Common::ThreadWorker* worker_)
|
Common::ThreadWorker* worker_)
|
||||||
: instance{instance_}, renderpass_cache{renderpass_cache_}, worker{worker_},
|
: instance{instance_}, render_manager{render_manager_}, worker{worker_},
|
||||||
pipeline_layout{layout_}, pipeline_cache{pipeline_cache_}, info{info_}, stages{stages_} {}
|
pipeline_layout{layout_}, pipeline_cache{pipeline_cache_}, info{info_}, stages{stages_} {}
|
||||||
|
|
||||||
GraphicsPipeline::~GraphicsPipeline() = default;
|
GraphicsPipeline::~GraphicsPipeline() = default;
|
||||||
|
@ -265,7 +265,7 @@ bool GraphicsPipeline::Build(bool fail_on_compile_required) {
|
||||||
.pDynamicState = &dynamic_info,
|
.pDynamicState = &dynamic_info,
|
||||||
.layout = pipeline_layout,
|
.layout = pipeline_layout,
|
||||||
.renderPass =
|
.renderPass =
|
||||||
renderpass_cache.GetRenderpass(info.attachments.color, info.attachments.depth, false),
|
render_manager.GetRenderpass(info.attachments.color, info.attachments.depth, false),
|
||||||
};
|
};
|
||||||
|
|
||||||
if (fail_on_compile_required) {
|
if (fail_on_compile_required) {
|
||||||
|
|
|
@ -40,7 +40,7 @@ private:
|
||||||
namespace Vulkan {
|
namespace Vulkan {
|
||||||
|
|
||||||
class Instance;
|
class Instance;
|
||||||
class RenderpassCache;
|
class RenderManager;
|
||||||
|
|
||||||
constexpr u32 MAX_SHADER_STAGES = 3;
|
constexpr u32 MAX_SHADER_STAGES = 3;
|
||||||
constexpr u32 MAX_VERTEX_ATTRIBUTES = 16;
|
constexpr u32 MAX_VERTEX_ATTRIBUTES = 16;
|
||||||
|
@ -165,7 +165,7 @@ struct Shader : public Common::AsyncHandle {
|
||||||
|
|
||||||
class GraphicsPipeline : public Common::AsyncHandle {
|
class GraphicsPipeline : public Common::AsyncHandle {
|
||||||
public:
|
public:
|
||||||
explicit GraphicsPipeline(const Instance& instance, RenderpassCache& renderpass_cache,
|
explicit GraphicsPipeline(const Instance& instance, RenderManager& render_manager,
|
||||||
const PipelineInfo& info, vk::PipelineCache pipeline_cache,
|
const PipelineInfo& info, vk::PipelineCache pipeline_cache,
|
||||||
vk::PipelineLayout layout, std::array<Shader*, 3> stages,
|
vk::PipelineLayout layout, std::array<Shader*, 3> stages,
|
||||||
Common::ThreadWorker* worker);
|
Common::ThreadWorker* worker);
|
||||||
|
@ -181,7 +181,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Instance& instance;
|
const Instance& instance;
|
||||||
RenderpassCache& renderpass_cache;
|
RenderManager& render_manager;
|
||||||
Common::ThreadWorker* worker;
|
Common::ThreadWorker* worker;
|
||||||
|
|
||||||
vk::UniquePipeline pipeline;
|
vk::UniquePipeline pipeline;
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include "video_core/renderer_vulkan/pica_to_vk.h"
|
#include "video_core/renderer_vulkan/pica_to_vk.h"
|
||||||
#include "video_core/renderer_vulkan/vk_instance.h"
|
#include "video_core/renderer_vulkan/vk_instance.h"
|
||||||
#include "video_core/renderer_vulkan/vk_pipeline_cache.h"
|
#include "video_core/renderer_vulkan/vk_pipeline_cache.h"
|
||||||
#include "video_core/renderer_vulkan/vk_renderpass_cache.h"
|
#include "video_core/renderer_vulkan/vk_render_manager.h"
|
||||||
#include "video_core/renderer_vulkan/vk_scheduler.h"
|
#include "video_core/renderer_vulkan/vk_scheduler.h"
|
||||||
#include "video_core/renderer_vulkan/vk_shader_util.h"
|
#include "video_core/renderer_vulkan/vk_shader_util.h"
|
||||||
#include "video_core/shader/generator/glsl_fs_shader_gen.h"
|
#include "video_core/shader/generator/glsl_fs_shader_gen.h"
|
||||||
|
@ -80,9 +80,9 @@ constexpr std::array<vk::DescriptorSetLayoutBinding, 7> SHADOW_BINDINGS = {{
|
||||||
}};
|
}};
|
||||||
|
|
||||||
PipelineCache::PipelineCache(const Instance& instance_, Scheduler& scheduler_,
|
PipelineCache::PipelineCache(const Instance& instance_, Scheduler& scheduler_,
|
||||||
RenderpassCache& renderpass_cache_, DescriptorPool& pool_)
|
RenderManager& render_manager_, DescriptorPool& pool_)
|
||||||
: instance{instance_}, scheduler{scheduler_}, renderpass_cache{renderpass_cache_}, pool{pool_},
|
: instance{instance_}, scheduler{scheduler_}, render_manager{render_manager_}, pool{pool_},
|
||||||
num_worker_threads{std::max(std::thread::hardware_concurrency() >> 1, 2U)},
|
num_worker_threads{std::max(std::thread::hardware_concurrency(), 2U)},
|
||||||
workers{num_worker_threads, "Pipeline workers"},
|
workers{num_worker_threads, "Pipeline workers"},
|
||||||
descriptor_set_providers{DescriptorSetProvider{instance, pool, BUFFER_BINDINGS},
|
descriptor_set_providers{DescriptorSetProvider{instance, pool, BUFFER_BINDINGS},
|
||||||
DescriptorSetProvider{instance, pool, TEXTURE_BINDINGS},
|
DescriptorSetProvider{instance, pool, TEXTURE_BINDINGS},
|
||||||
|
@ -205,7 +205,7 @@ bool PipelineCache::BindPipeline(const PipelineInfo& info, bool wait_built) {
|
||||||
auto [it, new_pipeline] = graphics_pipelines.try_emplace(pipeline_hash);
|
auto [it, new_pipeline] = graphics_pipelines.try_emplace(pipeline_hash);
|
||||||
if (new_pipeline) {
|
if (new_pipeline) {
|
||||||
it.value() =
|
it.value() =
|
||||||
std::make_unique<GraphicsPipeline>(instance, renderpass_cache, info, *pipeline_cache,
|
std::make_unique<GraphicsPipeline>(instance, render_manager, info, *pipeline_cache,
|
||||||
*pipeline_layout, current_shaders, &workers);
|
*pipeline_layout, current_shaders, &workers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ namespace Vulkan {
|
||||||
|
|
||||||
class Instance;
|
class Instance;
|
||||||
class Scheduler;
|
class Scheduler;
|
||||||
class RenderpassCache;
|
class RenderManager;
|
||||||
class DescriptorPool;
|
class DescriptorPool;
|
||||||
|
|
||||||
constexpr u32 NUM_RASTERIZER_SETS = 3;
|
constexpr u32 NUM_RASTERIZER_SETS = 3;
|
||||||
|
@ -34,7 +34,7 @@ constexpr u32 NUM_DYNAMIC_OFFSETS = 3;
|
||||||
class PipelineCache {
|
class PipelineCache {
|
||||||
public:
|
public:
|
||||||
explicit PipelineCache(const Instance& instance, Scheduler& scheduler,
|
explicit PipelineCache(const Instance& instance, Scheduler& scheduler,
|
||||||
RenderpassCache& renderpass_cache, DescriptorPool& pool);
|
RenderManager& render_manager, DescriptorPool& pool);
|
||||||
~PipelineCache();
|
~PipelineCache();
|
||||||
|
|
||||||
[[nodiscard]] DescriptorSetProvider& TextureProvider() noexcept {
|
[[nodiscard]] DescriptorSetProvider& TextureProvider() noexcept {
|
||||||
|
@ -97,7 +97,7 @@ private:
|
||||||
private:
|
private:
|
||||||
const Instance& instance;
|
const Instance& instance;
|
||||||
Scheduler& scheduler;
|
Scheduler& scheduler;
|
||||||
RenderpassCache& renderpass_cache;
|
RenderManager& render_manager;
|
||||||
DescriptorPool& pool;
|
DescriptorPool& pool;
|
||||||
|
|
||||||
Pica::Shader::Profile profile{};
|
Pica::Shader::Profile profile{};
|
||||||
|
|
|
@ -20,7 +20,7 @@ namespace Vulkan {
|
||||||
class Instance;
|
class Instance;
|
||||||
class Swapchain;
|
class Swapchain;
|
||||||
class Scheduler;
|
class Scheduler;
|
||||||
class RenderpassCache;
|
class RenderManager;
|
||||||
|
|
||||||
struct Frame {
|
struct Frame {
|
||||||
u32 width;
|
u32 width;
|
||||||
|
|
|
@ -59,11 +59,11 @@ RasterizerVulkan::RasterizerVulkan(Memory::MemorySystem& memory, Pica::PicaCore&
|
||||||
VideoCore::RendererBase& renderer,
|
VideoCore::RendererBase& renderer,
|
||||||
Frontend::EmuWindow& emu_window, const Instance& instance,
|
Frontend::EmuWindow& emu_window, const Instance& instance,
|
||||||
Scheduler& scheduler, DescriptorPool& pool,
|
Scheduler& scheduler, DescriptorPool& pool,
|
||||||
RenderpassCache& renderpass_cache, u32 image_count)
|
RenderManager& render_manager, u32 image_count)
|
||||||
: RasterizerAccelerated{memory, pica}, instance{instance}, scheduler{scheduler},
|
: RasterizerAccelerated{memory, pica}, instance{instance}, scheduler{scheduler},
|
||||||
renderpass_cache{renderpass_cache}, pipeline_cache{instance, scheduler, renderpass_cache,
|
render_manager{render_manager}, pipeline_cache{instance, scheduler, render_manager,
|
||||||
pool},
|
pool},
|
||||||
runtime{instance, scheduler, renderpass_cache, pool, pipeline_cache.TextureProvider(),
|
runtime{instance, scheduler, render_manager, pool, pipeline_cache.TextureProvider(),
|
||||||
image_count},
|
image_count},
|
||||||
res_cache{memory, custom_tex_manager, runtime, regs, renderer},
|
res_cache{memory, custom_tex_manager, runtime, regs, renderer},
|
||||||
stream_buffer{instance, scheduler, BUFFER_USAGE, STREAM_BUFFER_SIZE},
|
stream_buffer{instance, scheduler, BUFFER_USAGE, STREAM_BUFFER_SIZE},
|
||||||
|
@ -77,6 +77,7 @@ RasterizerVulkan::RasterizerVulkan(Memory::MemorySystem& memory, Pica::PicaCore&
|
||||||
|
|
||||||
vertex_buffers.fill(stream_buffer.Handle());
|
vertex_buffers.fill(stream_buffer.Handle());
|
||||||
|
|
||||||
|
// Query uniform buffer alignment.
|
||||||
uniform_buffer_alignment = instance.UniformMinAlignment();
|
uniform_buffer_alignment = instance.UniformMinAlignment();
|
||||||
uniform_size_aligned_vs_pica =
|
uniform_size_aligned_vs_pica =
|
||||||
Common::AlignUp(sizeof(VSPicaUniformData), uniform_buffer_alignment);
|
Common::AlignUp(sizeof(VSPicaUniformData), uniform_buffer_alignment);
|
||||||
|
@ -107,6 +108,10 @@ RasterizerVulkan::RasterizerVulkan(Memory::MemorySystem& memory, Pica::PicaCore&
|
||||||
.range = VK_WHOLE_SIZE,
|
.range = VK_WHOLE_SIZE,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
scheduler.RegisterOnSubmit([&render_manager] {
|
||||||
|
render_manager.EndRendering();
|
||||||
|
});
|
||||||
|
|
||||||
// Since we don't have access to VK_EXT_descriptor_indexing we need to intiallize
|
// Since we don't have access to VK_EXT_descriptor_indexing we need to intiallize
|
||||||
// all descriptor sets even the ones we don't use.
|
// all descriptor sets even the ones we don't use.
|
||||||
pipeline_cache.BindBuffer(0, uniform_buffer.Handle(), 0, sizeof(VSPicaUniformData));
|
pipeline_cache.BindBuffer(0, uniform_buffer.Handle(), 0, sizeof(VSPicaUniformData));
|
||||||
|
@ -514,7 +519,7 @@ bool RasterizerVulkan::Draw(bool accelerate, bool is_indexed) {
|
||||||
|
|
||||||
// Begin rendering
|
// Begin rendering
|
||||||
const auto draw_rect = fb_helper.DrawRect();
|
const auto draw_rect = fb_helper.DrawRect();
|
||||||
renderpass_cache.BeginRendering(framebuffer, draw_rect);
|
render_manager.BeginRendering(framebuffer, draw_rect);
|
||||||
|
|
||||||
// Configure viewport and scissor
|
// Configure viewport and scissor
|
||||||
const auto viewport = fb_helper.Viewport();
|
const auto viewport = fb_helper.Viewport();
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
#include "video_core/rasterizer_accelerated.h"
|
#include "video_core/rasterizer_accelerated.h"
|
||||||
#include "video_core/renderer_vulkan/vk_pipeline_cache.h"
|
#include "video_core/renderer_vulkan/vk_pipeline_cache.h"
|
||||||
#include "video_core/renderer_vulkan/vk_renderpass_cache.h"
|
#include "video_core/renderer_vulkan/vk_render_manager.h"
|
||||||
#include "video_core/renderer_vulkan/vk_stream_buffer.h"
|
#include "video_core/renderer_vulkan/vk_stream_buffer.h"
|
||||||
#include "video_core/renderer_vulkan/vk_texture_runtime.h"
|
#include "video_core/renderer_vulkan/vk_texture_runtime.h"
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ struct ScreenInfo;
|
||||||
|
|
||||||
class Instance;
|
class Instance;
|
||||||
class Scheduler;
|
class Scheduler;
|
||||||
class RenderpassCache;
|
class RenderManager;
|
||||||
class DescriptorPool;
|
class DescriptorPool;
|
||||||
|
|
||||||
class RasterizerVulkan : public VideoCore::RasterizerAccelerated {
|
class RasterizerVulkan : public VideoCore::RasterizerAccelerated {
|
||||||
|
@ -40,7 +40,7 @@ public:
|
||||||
VideoCore::CustomTexManager& custom_tex_manager,
|
VideoCore::CustomTexManager& custom_tex_manager,
|
||||||
VideoCore::RendererBase& renderer, Frontend::EmuWindow& emu_window,
|
VideoCore::RendererBase& renderer, Frontend::EmuWindow& emu_window,
|
||||||
const Instance& instance, Scheduler& scheduler, DescriptorPool& pool,
|
const Instance& instance, Scheduler& scheduler, DescriptorPool& pool,
|
||||||
RenderpassCache& renderpass_cache, u32 image_count);
|
RenderManager& render_manager, u32 image_count);
|
||||||
~RasterizerVulkan() override;
|
~RasterizerVulkan() override;
|
||||||
|
|
||||||
void TickFrame();
|
void TickFrame();
|
||||||
|
@ -145,7 +145,7 @@ private:
|
||||||
private:
|
private:
|
||||||
const Instance& instance;
|
const Instance& instance;
|
||||||
Scheduler& scheduler;
|
Scheduler& scheduler;
|
||||||
RenderpassCache& renderpass_cache;
|
RenderManager& render_manager;
|
||||||
PipelineCache pipeline_cache;
|
PipelineCache pipeline_cache;
|
||||||
TextureRuntime runtime;
|
TextureRuntime runtime;
|
||||||
RasterizerCache res_cache;
|
RasterizerCache res_cache;
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "video_core/rasterizer_cache/pixel_format.h"
|
#include "video_core/rasterizer_cache/pixel_format.h"
|
||||||
#include "video_core/renderer_vulkan/vk_instance.h"
|
#include "video_core/renderer_vulkan/vk_instance.h"
|
||||||
#include "video_core/renderer_vulkan/vk_renderpass_cache.h"
|
#include "video_core/renderer_vulkan/vk_render_manager.h"
|
||||||
#include "video_core/renderer_vulkan/vk_scheduler.h"
|
#include "video_core/renderer_vulkan/vk_scheduler.h"
|
||||||
#include "video_core/renderer_vulkan/vk_texture_runtime.h"
|
#include "video_core/renderer_vulkan/vk_texture_runtime.h"
|
||||||
|
|
||||||
|
@ -17,12 +17,12 @@ constexpr u32 MIN_DRAWS_TO_FLUSH = 20;
|
||||||
using VideoCore::PixelFormat;
|
using VideoCore::PixelFormat;
|
||||||
using VideoCore::SurfaceType;
|
using VideoCore::SurfaceType;
|
||||||
|
|
||||||
RenderpassCache::RenderpassCache(const Instance& instance, Scheduler& scheduler)
|
RenderManager::RenderManager(const Instance& instance, Scheduler& scheduler)
|
||||||
: instance{instance}, scheduler{scheduler} {}
|
: instance{instance}, scheduler{scheduler} {}
|
||||||
|
|
||||||
RenderpassCache::~RenderpassCache() = default;
|
RenderManager::~RenderManager() = default;
|
||||||
|
|
||||||
void RenderpassCache::BeginRendering(const Framebuffer* framebuffer,
|
void RenderManager::BeginRendering(const Framebuffer* framebuffer,
|
||||||
Common::Rectangle<u32> draw_rect) {
|
Common::Rectangle<u32> draw_rect) {
|
||||||
const vk::Rect2D render_area = {
|
const vk::Rect2D render_area = {
|
||||||
.offset{
|
.offset{
|
||||||
|
@ -46,7 +46,7 @@ void RenderpassCache::BeginRendering(const Framebuffer* framebuffer,
|
||||||
BeginRendering(new_pass);
|
BeginRendering(new_pass);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderpassCache::BeginRendering(const RenderPass& new_pass) {
|
void RenderManager::BeginRendering(const RenderPass& new_pass) {
|
||||||
if (pass == new_pass) [[likely]] {
|
if (pass == new_pass) [[likely]] {
|
||||||
num_draws++;
|
num_draws++;
|
||||||
return;
|
return;
|
||||||
|
@ -67,12 +67,11 @@ void RenderpassCache::BeginRendering(const RenderPass& new_pass) {
|
||||||
pass = new_pass;
|
pass = new_pass;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderpassCache::EndRendering() {
|
void RenderManager::EndRendering() {
|
||||||
if (!pass.render_pass) {
|
if (!pass.render_pass) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pass.render_pass = vk::RenderPass{};
|
|
||||||
scheduler.Record([images = images, aspects = aspects](vk::CommandBuffer cmdbuf) {
|
scheduler.Record([images = images, aspects = aspects](vk::CommandBuffer cmdbuf) {
|
||||||
u32 num_barriers = 0;
|
u32 num_barriers = 0;
|
||||||
vk::PipelineStageFlags pipeline_flags{};
|
vk::PipelineStageFlags pipeline_flags{};
|
||||||
|
@ -115,6 +114,11 @@ void RenderpassCache::EndRendering() {
|
||||||
num_barriers, barriers.data());
|
num_barriers, barriers.data());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Reset state.
|
||||||
|
pass.render_pass = vk::RenderPass{};
|
||||||
|
images = {};
|
||||||
|
aspects = {};
|
||||||
|
|
||||||
// The Mali guide recommends flushing at the end of each major renderpass
|
// The Mali guide recommends flushing at the end of each major renderpass
|
||||||
// Testing has shown this has a significant effect on rendering performance
|
// Testing has shown this has a significant effect on rendering performance
|
||||||
if (num_draws > MIN_DRAWS_TO_FLUSH && instance.ShouldFlush()) {
|
if (num_draws > MIN_DRAWS_TO_FLUSH && instance.ShouldFlush()) {
|
||||||
|
@ -123,7 +127,7 @@ void RenderpassCache::EndRendering() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vk::RenderPass RenderpassCache::GetRenderpass(VideoCore::PixelFormat color,
|
vk::RenderPass RenderManager::GetRenderpass(VideoCore::PixelFormat color,
|
||||||
VideoCore::PixelFormat depth, bool is_clear) {
|
VideoCore::PixelFormat depth, bool is_clear) {
|
||||||
std::scoped_lock lock{cache_mutex};
|
std::scoped_lock lock{cache_mutex};
|
||||||
|
|
||||||
|
@ -148,7 +152,7 @@ vk::RenderPass RenderpassCache::GetRenderpass(VideoCore::PixelFormat color,
|
||||||
return *renderpass;
|
return *renderpass;
|
||||||
}
|
}
|
||||||
|
|
||||||
vk::UniqueRenderPass RenderpassCache::CreateRenderPass(vk::Format color, vk::Format depth,
|
vk::UniqueRenderPass RenderManager::CreateRenderPass(vk::Format color, vk::Format depth,
|
||||||
vk::AttachmentLoadOp load_op) const {
|
vk::AttachmentLoadOp load_op) const {
|
||||||
u32 attachment_count = 0;
|
u32 attachment_count = 0;
|
||||||
std::array<vk::AttachmentDescription, 2> attachments;
|
std::array<vk::AttachmentDescription, 2> attachments;
|
|
@ -24,23 +24,20 @@ struct RenderPass {
|
||||||
vk::RenderPass render_pass;
|
vk::RenderPass render_pass;
|
||||||
vk::Rect2D render_area;
|
vk::Rect2D render_area;
|
||||||
vk::ClearValue clear;
|
vk::ClearValue clear;
|
||||||
bool do_clear;
|
u32 do_clear;
|
||||||
|
|
||||||
bool operator==(const RenderPass& other) const noexcept {
|
bool operator==(const RenderPass& other) const noexcept {
|
||||||
return std::tie(framebuffer, render_pass, render_area, do_clear) ==
|
return std::memcmp(this, &other, sizeof(RenderPass)) == 0;
|
||||||
std::tie(other.framebuffer, other.render_pass, other.render_area,
|
|
||||||
other.do_clear) &&
|
|
||||||
std::memcmp(&clear, &other.clear, sizeof(vk::ClearValue)) == 0;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class RenderpassCache {
|
class RenderManager {
|
||||||
static constexpr std::size_t MAX_COLOR_FORMATS = 13;
|
static constexpr std::size_t MAX_COLOR_FORMATS = 13;
|
||||||
static constexpr std::size_t MAX_DEPTH_FORMATS = 4;
|
static constexpr std::size_t MAX_DEPTH_FORMATS = 4;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit RenderpassCache(const Instance& instance, Scheduler& scheduler);
|
explicit RenderManager(const Instance& instance, Scheduler& scheduler);
|
||||||
~RenderpassCache();
|
~RenderManager();
|
||||||
|
|
||||||
/// Begins a new renderpass with the provided framebuffer as render target.
|
/// Begins a new renderpass with the provided framebuffer as render target.
|
||||||
void BeginRendering(const Framebuffer* framebuffer, Common::Rectangle<u32> draw_rect);
|
void BeginRendering(const Framebuffer* framebuffer, Common::Rectangle<u32> draw_rect);
|
|
@ -8,7 +8,7 @@
|
||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
#include "common/thread.h"
|
#include "common/thread.h"
|
||||||
#include "video_core/renderer_vulkan/vk_instance.h"
|
#include "video_core/renderer_vulkan/vk_instance.h"
|
||||||
#include "video_core/renderer_vulkan/vk_renderpass_cache.h"
|
#include "video_core/renderer_vulkan/vk_render_manager.h"
|
||||||
#include "video_core/renderer_vulkan/vk_scheduler.h"
|
#include "video_core/renderer_vulkan/vk_scheduler.h"
|
||||||
|
|
||||||
MICROPROFILE_DEFINE(Vulkan_WaitForWorker, "Vulkan", "Wait for worker", MP_RGB(255, 192, 192));
|
MICROPROFILE_DEFINE(Vulkan_WaitForWorker, "Vulkan", "Wait for worker", MP_RGB(255, 192, 192));
|
||||||
|
@ -98,6 +98,8 @@ void Scheduler::DispatchWork() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//on_dispatch();
|
||||||
|
|
||||||
{
|
{
|
||||||
std::scoped_lock ql{queue_mutex};
|
std::scoped_lock ql{queue_mutex};
|
||||||
work_queue.push(std::move(chunk));
|
work_queue.push(std::move(chunk));
|
||||||
|
@ -173,6 +175,8 @@ void Scheduler::SubmitExecution(vk::Semaphore signal_semaphore, vk::Semaphore wa
|
||||||
state = StateFlags::AllDirty;
|
state = StateFlags::AllDirty;
|
||||||
const u64 signal_value = master_semaphore->NextTick();
|
const u64 signal_value = master_semaphore->NextTick();
|
||||||
|
|
||||||
|
on_submit();
|
||||||
|
|
||||||
Record([signal_semaphore, wait_semaphore, signal_value, this](vk::CommandBuffer cmdbuf) {
|
Record([signal_semaphore, wait_semaphore, signal_value, this](vk::CommandBuffer cmdbuf) {
|
||||||
MICROPROFILE_SCOPE(Vulkan_Submit);
|
MICROPROFILE_SCOPE(Vulkan_Submit);
|
||||||
std::scoped_lock lock{submit_mutex};
|
std::scoped_lock lock{submit_mutex};
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include <functional>
|
||||||
#include "common/alignment.h"
|
#include "common/alignment.h"
|
||||||
#include "common/common_funcs.h"
|
#include "common/common_funcs.h"
|
||||||
#include "common/polyfill_thread.h"
|
#include "common/polyfill_thread.h"
|
||||||
|
@ -49,11 +50,6 @@ public:
|
||||||
/// Records the command to the current chunk.
|
/// Records the command to the current chunk.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void Record(T&& command) {
|
void Record(T&& command) {
|
||||||
if (!use_worker_thread) {
|
|
||||||
command(current_cmdbuf);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (chunk->Record(command)) {
|
if (chunk->Record(command)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -76,6 +72,16 @@ public:
|
||||||
return False(state & flag);
|
return False(state & flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Registers a callback to perform on queue submission.
|
||||||
|
void RegisterOnSubmit(std::function<void()>&& func) {
|
||||||
|
on_submit = std::move(func);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Registers a callback to perform on queue submission.
|
||||||
|
void RegisterOnDispatch(std::function<void()>&& func) {
|
||||||
|
on_dispatch = std::move(func);
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the current command buffer tick.
|
/// Returns the current command buffer tick.
|
||||||
[[nodiscard]] u64 CurrentTick() const noexcept {
|
[[nodiscard]] u64 CurrentTick() const noexcept {
|
||||||
return master_semaphore->CurrentTick();
|
return master_semaphore->CurrentTick();
|
||||||
|
@ -194,6 +200,8 @@ private:
|
||||||
std::vector<std::unique_ptr<CommandChunk>> chunk_reserve;
|
std::vector<std::unique_ptr<CommandChunk>> chunk_reserve;
|
||||||
vk::CommandBuffer current_cmdbuf;
|
vk::CommandBuffer current_cmdbuf;
|
||||||
StateFlags state{};
|
StateFlags state{};
|
||||||
|
std::function<void()> on_submit;
|
||||||
|
std::function<void()> on_dispatch;
|
||||||
std::mutex execution_mutex;
|
std::mutex execution_mutex;
|
||||||
std::mutex reserve_mutex;
|
std::mutex reserve_mutex;
|
||||||
std::mutex queue_mutex;
|
std::mutex queue_mutex;
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
#include "video_core/renderer_vulkan/pica_to_vk.h"
|
#include "video_core/renderer_vulkan/pica_to_vk.h"
|
||||||
#include "video_core/renderer_vulkan/vk_descriptor_pool.h"
|
#include "video_core/renderer_vulkan/vk_descriptor_pool.h"
|
||||||
#include "video_core/renderer_vulkan/vk_instance.h"
|
#include "video_core/renderer_vulkan/vk_instance.h"
|
||||||
#include "video_core/renderer_vulkan/vk_renderpass_cache.h"
|
#include "video_core/renderer_vulkan/vk_render_manager.h"
|
||||||
#include "video_core/renderer_vulkan/vk_scheduler.h"
|
#include "video_core/renderer_vulkan/vk_scheduler.h"
|
||||||
#include "video_core/renderer_vulkan/vk_texture_runtime.h"
|
#include "video_core/renderer_vulkan/vk_texture_runtime.h"
|
||||||
|
|
||||||
|
@ -249,10 +249,10 @@ constexpr u64 DOWNLOAD_BUFFER_SIZE = 16_MiB;
|
||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
|
||||||
TextureRuntime::TextureRuntime(const Instance& instance, Scheduler& scheduler,
|
TextureRuntime::TextureRuntime(const Instance& instance, Scheduler& scheduler,
|
||||||
RenderpassCache& renderpass_cache, DescriptorPool& pool,
|
RenderManager& render_manager, DescriptorPool& pool,
|
||||||
DescriptorSetProvider& texture_provider_, u32 num_swapchain_images_)
|
DescriptorSetProvider& texture_provider_, u32 num_swapchain_images_)
|
||||||
: instance{instance}, scheduler{scheduler}, renderpass_cache{renderpass_cache},
|
: instance{instance}, scheduler{scheduler}, render_manager{render_manager},
|
||||||
texture_provider{texture_provider_}, blit_helper{instance, scheduler, pool, renderpass_cache},
|
texture_provider{texture_provider_}, blit_helper{instance, scheduler, pool, render_manager},
|
||||||
upload_buffer{instance, scheduler, vk::BufferUsageFlagBits::eTransferSrc, UPLOAD_BUFFER_SIZE,
|
upload_buffer{instance, scheduler, vk::BufferUsageFlagBits::eTransferSrc, UPLOAD_BUFFER_SIZE,
|
||||||
BufferType::Upload},
|
BufferType::Upload},
|
||||||
download_buffer{instance, scheduler,
|
download_buffer{instance, scheduler,
|
||||||
|
@ -305,7 +305,7 @@ bool TextureRuntime::Reinterpret(Surface& source, Surface& dest,
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TextureRuntime::ClearTexture(Surface& surface, const VideoCore::TextureClear& clear) {
|
bool TextureRuntime::ClearTexture(Surface& surface, const VideoCore::TextureClear& clear) {
|
||||||
renderpass_cache.EndRendering();
|
render_manager.EndRendering();
|
||||||
|
|
||||||
const RecordParams params = {
|
const RecordParams params = {
|
||||||
.aspect = surface.Aspect(),
|
.aspect = surface.Aspect(),
|
||||||
|
@ -377,7 +377,7 @@ void TextureRuntime::ClearTextureWithRenderpass(Surface& surface,
|
||||||
|
|
||||||
const auto color_format = is_color ? surface.pixel_format : PixelFormat::Invalid;
|
const auto color_format = is_color ? surface.pixel_format : PixelFormat::Invalid;
|
||||||
const auto depth_format = is_color ? PixelFormat::Invalid : surface.pixel_format;
|
const auto depth_format = is_color ? PixelFormat::Invalid : surface.pixel_format;
|
||||||
const auto render_pass = renderpass_cache.GetRenderpass(color_format, depth_format, true);
|
const auto render_pass = render_manager.GetRenderpass(color_format, depth_format, true);
|
||||||
|
|
||||||
const RecordParams params = {
|
const RecordParams params = {
|
||||||
.aspect = surface.Aspect(),
|
.aspect = surface.Aspect(),
|
||||||
|
@ -454,7 +454,7 @@ void TextureRuntime::ClearTextureWithRenderpass(Surface& surface,
|
||||||
|
|
||||||
bool TextureRuntime::CopyTextures(Surface& source, Surface& dest,
|
bool TextureRuntime::CopyTextures(Surface& source, Surface& dest,
|
||||||
const VideoCore::TextureCopy& copy) {
|
const VideoCore::TextureCopy& copy) {
|
||||||
renderpass_cache.EndRendering();
|
render_manager.EndRendering();
|
||||||
|
|
||||||
const RecordParams params = {
|
const RecordParams params = {
|
||||||
.aspect = source.Aspect(),
|
.aspect = source.Aspect(),
|
||||||
|
@ -559,7 +559,7 @@ bool TextureRuntime::BlitTextures(Surface& source, Surface& dest,
|
||||||
return blit_helper.BlitDepthStencil(source, dest, blit);
|
return blit_helper.BlitDepthStencil(source, dest, blit);
|
||||||
}
|
}
|
||||||
|
|
||||||
renderpass_cache.EndRendering();
|
render_manager.EndRendering();
|
||||||
|
|
||||||
const RecordParams params = {
|
const RecordParams params = {
|
||||||
.aspect = source.Aspect(),
|
.aspect = source.Aspect(),
|
||||||
|
@ -667,7 +667,7 @@ void TextureRuntime::GenerateMipmaps(Surface& surface) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
renderpass_cache.EndRendering();
|
render_manager.EndRendering();
|
||||||
|
|
||||||
auto [width, height] = surface.RealExtent();
|
auto [width, height] = surface.RealExtent();
|
||||||
const u32 levels = surface.levels;
|
const u32 levels = surface.levels;
|
||||||
|
@ -737,9 +737,9 @@ Surface::Surface(TextureRuntime& runtime_, const VideoCore::SurfaceParams& param
|
||||||
raw_images.emplace_back(handles[1].image);
|
raw_images.emplace_back(handles[1].image);
|
||||||
}
|
}
|
||||||
|
|
||||||
runtime->renderpass_cache.EndRendering();
|
runtime->render_manager.EndRendering();
|
||||||
scheduler->Record([raw_images, aspect = traits.aspect](vk::CommandBuffer cmdbuf) {
|
scheduler->Record([raw_images, num_images, aspect = traits.aspect](vk::CommandBuffer cmdbuf) {
|
||||||
const auto barriers = MakeInitBarriers(aspect, raw_images);
|
const auto barriers = MakeInitBarriers(aspect, raw_images, num_images);
|
||||||
cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eTopOfPipe,
|
cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eTopOfPipe,
|
||||||
vk::PipelineStageFlagBits::eTopOfPipe,
|
vk::PipelineStageFlagBits::eTopOfPipe,
|
||||||
vk::DependencyFlagBits::eByRegion, {}, {}, barriers);
|
vk::DependencyFlagBits::eByRegion, {}, {}, barriers);
|
||||||
|
@ -781,9 +781,9 @@ Surface::Surface(TextureRuntime& runtime_, const VideoCore::SurfaceBase& surface
|
||||||
raw_images.emplace_back(handles[2].image);
|
raw_images.emplace_back(handles[2].image);
|
||||||
}
|
}
|
||||||
|
|
||||||
runtime->renderpass_cache.EndRendering();
|
runtime->render_manager.EndRendering();
|
||||||
scheduler->Record([raw_images, aspect = traits.aspect](vk::CommandBuffer cmdbuf) {
|
scheduler->Record([raw_images, num_images, aspect = traits.aspect](vk::CommandBuffer cmdbuf) {
|
||||||
const auto barriers = MakeInitBarriers(aspect, raw_images);
|
const auto barriers = MakeInitBarriers(aspect, raw_images, num_images);
|
||||||
cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eTopOfPipe,
|
cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eTopOfPipe,
|
||||||
vk::PipelineStageFlagBits::eTopOfPipe,
|
vk::PipelineStageFlagBits::eTopOfPipe,
|
||||||
vk::DependencyFlagBits::eByRegion, {}, {}, barriers);
|
vk::DependencyFlagBits::eByRegion, {}, {}, barriers);
|
||||||
|
@ -812,7 +812,7 @@ Surface::~Surface() {
|
||||||
|
|
||||||
void Surface::Upload(const VideoCore::BufferTextureCopy& upload,
|
void Surface::Upload(const VideoCore::BufferTextureCopy& upload,
|
||||||
const VideoCore::StagingData& staging) {
|
const VideoCore::StagingData& staging) {
|
||||||
runtime->renderpass_cache.EndRendering();
|
runtime->render_manager.EndRendering();
|
||||||
|
|
||||||
const RecordParams params = {
|
const RecordParams params = {
|
||||||
.aspect = Aspect(),
|
.aspect = Aspect(),
|
||||||
|
@ -980,7 +980,7 @@ void Surface::Download(const VideoCore::BufferTextureCopy& download,
|
||||||
runtime->download_buffer.Commit(staging.size);
|
runtime->download_buffer.Commit(staging.size);
|
||||||
});
|
});
|
||||||
|
|
||||||
runtime->renderpass_cache.EndRendering();
|
runtime->render_manager.EndRendering();
|
||||||
|
|
||||||
if (pixel_format == PixelFormat::D24S8) {
|
if (pixel_format == PixelFormat::D24S8) {
|
||||||
runtime->blit_helper.DepthToBuffer(*this, runtime->download_buffer.Handle(), download);
|
runtime->blit_helper.DepthToBuffer(*this, runtime->download_buffer.Handle(), download);
|
||||||
|
@ -1080,7 +1080,7 @@ void Surface::ScaleUp(u32 new_scale) {
|
||||||
MakeHandle(instance, GetScaledWidth(), GetScaledHeight(), levels, texture_type,
|
MakeHandle(instance, GetScaledWidth(), GetScaledHeight(), levels, texture_type,
|
||||||
traits.native, traits.usage, flags, traits.aspect, false, DebugName(true));
|
traits.native, traits.usage, flags, traits.aspect, false, DebugName(true));
|
||||||
|
|
||||||
runtime->renderpass_cache.EndRendering();
|
runtime->render_manager.EndRendering();
|
||||||
scheduler->Record(
|
scheduler->Record(
|
||||||
[raw_images = std::array{Image()}, aspect = traits.aspect](vk::CommandBuffer cmdbuf) {
|
[raw_images = std::array{Image()}, aspect = traits.aspect](vk::CommandBuffer cmdbuf) {
|
||||||
const auto barriers = MakeInitBarriers(aspect, raw_images);
|
const auto barriers = MakeInitBarriers(aspect, raw_images);
|
||||||
|
@ -1158,7 +1158,7 @@ vk::ImageView Surface::CopyImageView() noexcept {
|
||||||
copy_layout = vk::ImageLayout::eUndefined;
|
copy_layout = vk::ImageLayout::eUndefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
runtime->renderpass_cache.EndRendering();
|
runtime->render_manager.EndRendering();
|
||||||
|
|
||||||
const RecordParams params = {
|
const RecordParams params = {
|
||||||
.aspect = Aspect(),
|
.aspect = Aspect(),
|
||||||
|
@ -1346,7 +1346,7 @@ vk::Framebuffer Surface::Framebuffer() noexcept {
|
||||||
const auto color_format = is_depth ? PixelFormat::Invalid : pixel_format;
|
const auto color_format = is_depth ? PixelFormat::Invalid : pixel_format;
|
||||||
const auto depth_format = is_depth ? pixel_format : PixelFormat::Invalid;
|
const auto depth_format = is_depth ? pixel_format : PixelFormat::Invalid;
|
||||||
const auto render_pass =
|
const auto render_pass =
|
||||||
runtime->renderpass_cache.GetRenderpass(color_format, depth_format, false);
|
runtime->render_manager.GetRenderpass(color_format, depth_format, false);
|
||||||
const auto attachments = std::array{ImageView()};
|
const auto attachments = std::array{ImageView()};
|
||||||
framebuffers[index] = MakeFramebuffer(instance->GetDevice(), render_pass, GetScaledWidth(),
|
framebuffers[index] = MakeFramebuffer(instance->GetDevice(), render_pass, GetScaledWidth(),
|
||||||
GetScaledHeight(), attachments);
|
GetScaledHeight(), attachments);
|
||||||
|
@ -1460,7 +1460,7 @@ Framebuffer::Framebuffer(TextureRuntime& runtime, const VideoCore::FramebufferPa
|
||||||
Surface* color, Surface* depth)
|
Surface* color, Surface* depth)
|
||||||
: VideoCore::FramebufferParams{params}, res_scale{color ? color->res_scale
|
: VideoCore::FramebufferParams{params}, res_scale{color ? color->res_scale
|
||||||
: (depth ? depth->res_scale : 1u)} {
|
: (depth ? depth->res_scale : 1u)} {
|
||||||
auto& renderpass_cache = runtime.GetRenderpassCache();
|
auto& render_manager = runtime.GetRenderpassCache();
|
||||||
if (shadow_rendering && !color) {
|
if (shadow_rendering && !color) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1494,12 +1494,13 @@ Framebuffer::Framebuffer(TextureRuntime& runtime, const VideoCore::FramebufferPa
|
||||||
const vk::Device device = runtime.GetInstance().GetDevice();
|
const vk::Device device = runtime.GetInstance().GetDevice();
|
||||||
if (shadow_rendering) {
|
if (shadow_rendering) {
|
||||||
render_pass =
|
render_pass =
|
||||||
renderpass_cache.GetRenderpass(PixelFormat::Invalid, PixelFormat::Invalid, false);
|
render_manager.GetRenderpass(PixelFormat::Invalid, PixelFormat::Invalid, false);
|
||||||
framebuffer = MakeFramebuffer(device, render_pass, color->GetScaledWidth(),
|
framebuffer = MakeFramebuffer(device, render_pass, color->GetScaledWidth(),
|
||||||
color->GetScaledHeight(), {});
|
color->GetScaledHeight(), {});
|
||||||
} else {
|
} else {
|
||||||
render_pass = renderpass_cache.GetRenderpass(formats[0], formats[1], false);
|
render_pass = render_manager.GetRenderpass(formats[0], formats[1], false);
|
||||||
framebuffer = MakeFramebuffer(device, render_pass, width, height, attachments);
|
framebuffer =
|
||||||
|
MakeFramebuffer(device, render_pass, width, height, attachments, num_attachments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ struct Material;
|
||||||
namespace Vulkan {
|
namespace Vulkan {
|
||||||
|
|
||||||
class Instance;
|
class Instance;
|
||||||
class RenderpassCache;
|
class RenderManager;
|
||||||
class DescriptorPool;
|
class DescriptorPool;
|
||||||
class DescriptorSetProvider;
|
class DescriptorSetProvider;
|
||||||
class Surface;
|
class Surface;
|
||||||
|
@ -42,7 +42,7 @@ class TextureRuntime {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit TextureRuntime(const Instance& instance, Scheduler& scheduler,
|
explicit TextureRuntime(const Instance& instance, Scheduler& scheduler,
|
||||||
RenderpassCache& renderpass_cache, DescriptorPool& pool,
|
RenderManager& render_manager, DescriptorPool& pool,
|
||||||
DescriptorSetProvider& texture_provider, u32 num_swapchain_images);
|
DescriptorSetProvider& texture_provider, u32 num_swapchain_images);
|
||||||
~TextureRuntime();
|
~TextureRuntime();
|
||||||
|
|
||||||
|
@ -54,8 +54,8 @@ public:
|
||||||
return scheduler;
|
return scheduler;
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderpassCache& GetRenderpassCache() {
|
RenderManager& GetRenderpassCache() {
|
||||||
return renderpass_cache;
|
return render_manager;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the removal threshold ticks for the garbage collector
|
/// Returns the removal threshold ticks for the garbage collector
|
||||||
|
@ -95,7 +95,7 @@ private:
|
||||||
private:
|
private:
|
||||||
const Instance& instance;
|
const Instance& instance;
|
||||||
Scheduler& scheduler;
|
Scheduler& scheduler;
|
||||||
RenderpassCache& renderpass_cache;
|
RenderManager& render_manager;
|
||||||
DescriptorSetProvider& texture_provider;
|
DescriptorSetProvider& texture_provider;
|
||||||
BlitHelper blit_helper;
|
BlitHelper blit_helper;
|
||||||
StreamBuffer upload_buffer;
|
StreamBuffer upload_buffer;
|
||||||
|
|
Loading…
Reference in a new issue