renderer_vulkan: Flush scheduler on renderpass end
* Follows the Mali guide recommendation and fixes performance regression introduced by async shaders commit
This commit is contained in:
@ -118,6 +118,8 @@ void Config::ReadValues() {
|
|||||||
static_cast<Settings::GraphicsAPI>(sdl2_config->GetInteger("Renderer", "graphics_api", 2));
|
static_cast<Settings::GraphicsAPI>(sdl2_config->GetInteger("Renderer", "graphics_api", 2));
|
||||||
Settings::values.async_command_recording =
|
Settings::values.async_command_recording =
|
||||||
sdl2_config->GetBoolean("Renderer", "async_command_recording", true);
|
sdl2_config->GetBoolean("Renderer", "async_command_recording", true);
|
||||||
|
Settings::values.async_shader_compilation =
|
||||||
|
sdl2_config->GetBoolean("Renderer", "async_shader_compilation", true);
|
||||||
Settings::values.spirv_shader_gen =
|
Settings::values.spirv_shader_gen =
|
||||||
sdl2_config->GetBoolean("Renderer", "spirv_shader_gen", true);
|
sdl2_config->GetBoolean("Renderer", "spirv_shader_gen", true);
|
||||||
Settings::values.renderer_debug = sdl2_config->GetBoolean("Renderer", "renderer_debug", false);
|
Settings::values.renderer_debug = sdl2_config->GetBoolean("Renderer", "renderer_debug", false);
|
||||||
|
@ -207,6 +207,11 @@ public:
|
|||||||
return min_vertex_stride_alignment;
|
return min_vertex_stride_alignment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true if the physical device is a Mali gpu
|
||||||
|
bool IsMaliGpu() const {
|
||||||
|
return driver_id == vk::DriverIdKHR::eArmProprietary;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// Returns the optimal supported usage for the requested format
|
/// Returns the optimal supported usage for the requested format
|
||||||
[[nodiscard]] FormatTraits DetermineTraits(VideoCore::PixelFormat pixel_format,
|
[[nodiscard]] FormatTraits DetermineTraits(VideoCore::PixelFormat pixel_format,
|
||||||
|
@ -84,15 +84,15 @@ RenderpassCache::~RenderpassCache() {
|
|||||||
void RenderpassCache::EnterRenderpass(const RenderpassState& state) {
|
void RenderpassCache::EnterRenderpass(const RenderpassState& state) {
|
||||||
const bool is_dirty = scheduler.IsStateDirty(StateFlags::Renderpass);
|
const bool is_dirty = scheduler.IsStateDirty(StateFlags::Renderpass);
|
||||||
if (current_state == state && !is_dirty) {
|
if (current_state == state && !is_dirty) {
|
||||||
|
cmd_count++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
scheduler.Record(
|
if (current_state.renderpass) {
|
||||||
[should_end = bool(current_state.renderpass), state](vk::CommandBuffer cmdbuf) {
|
ExitRenderpass();
|
||||||
if (should_end) {
|
}
|
||||||
cmdbuf.endRenderPass();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
scheduler.Record([state](vk::CommandBuffer cmdbuf) {
|
||||||
const vk::RenderPassBeginInfo renderpass_begin_info = {
|
const vk::RenderPassBeginInfo renderpass_begin_info = {
|
||||||
.renderPass = state.renderpass,
|
.renderPass = state.renderpass,
|
||||||
.framebuffer = state.framebuffer,
|
.framebuffer = state.framebuffer,
|
||||||
@ -118,6 +118,13 @@ void RenderpassCache::ExitRenderpass() {
|
|||||||
|
|
||||||
scheduler.Record([](vk::CommandBuffer cmdbuf) { cmdbuf.endRenderPass(); });
|
scheduler.Record([](vk::CommandBuffer cmdbuf) { cmdbuf.endRenderPass(); });
|
||||||
current_state = {};
|
current_state = {};
|
||||||
|
|
||||||
|
// The Mali guide recommends flushing at the end of each major renderpass
|
||||||
|
// Testing has shown this has a significant effect on rendering performance
|
||||||
|
if (cmd_count > 20 && instance.IsMaliGpu()) {
|
||||||
|
scheduler.Flush();
|
||||||
|
cmd_count = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderpassCache::CreatePresentRenderpass(vk::Format format) {
|
void RenderpassCache::CreatePresentRenderpass(vk::Format format) {
|
||||||
|
@ -62,6 +62,7 @@ private:
|
|||||||
RenderpassState current_state{};
|
RenderpassState current_state{};
|
||||||
vk::RenderPass present_renderpass{};
|
vk::RenderPass present_renderpass{};
|
||||||
vk::RenderPass cached_renderpasses[MAX_COLOR_FORMATS + 1][MAX_DEPTH_FORMATS + 1][2];
|
vk::RenderPass cached_renderpasses[MAX_COLOR_FORMATS + 1][MAX_DEPTH_FORMATS + 1][2];
|
||||||
|
u32 cmd_count{};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Vulkan
|
} // namespace Vulkan
|
||||||
|
Reference in New Issue
Block a user