diff options
| author | lizzie <lizzie@eden-emu.dev> | 2026-05-29 03:28:47 +0200 |
|---|---|---|
| committer | crueter <crueter@eden-emu.dev> | 2026-05-29 03:28:47 +0200 |
| commit | def03f6589007026572816baed73f762818f05bb (patch) | |
| tree | 100949ba575fe2eb66492d10a7c7cc0b825bf3f6 /src/video_core/renderer_opengl | |
| parent | 5ea24621cf8e75fe20ff35c4e41a05baf9497be8 (diff) | |
[video_core] fix redundant resize-copy overload and just use default-init resize, to reduce stutter on Mario BP (#3874)
before vs. after
Mario Brothership kept remaking vectors of sizes 256 AND 4095 (TIC) and 1215 AND 524287 (TSC) every single frame, which resulted in a noticeable overhead
the main cause was because of using `resize(n, c)` instead of `resize(n)` (also to aggressively resize for more room beforehand), the copy overload of resize does a copy of... well.. the value over the entire vector, additionally __append() keeps getting called because the capacity goes bonkers and all over the place


Signed-off-by: lizzie <lizzie@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3874
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Diffstat (limited to 'src/video_core/renderer_opengl')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_compute_pipeline.cpp | 6 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_graphics_pipeline.cpp | 6 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 4 |
3 files changed, 8 insertions, 8 deletions
diff --git a/src/video_core/renderer_opengl/gl_compute_pipeline.cpp b/src/video_core/renderer_opengl/gl_compute_pipeline.cpp index d1c61be743..f0a7baf9aa 100644 --- a/src/video_core/renderer_opengl/gl_compute_pipeline.cpp +++ b/src/video_core/renderer_opengl/gl_compute_pipeline.cpp @@ -90,7 +90,7 @@ void ComputePipeline::Configure() { desc.is_written); ++ssbo_index; } - texture_cache.SynchronizeComputeDescriptors(); + texture_cache.SynchronizeDescriptors(true); boost::container::static_vector<VideoCommon::ImageViewInOut, MAX_TEXTURES + MAX_IMAGES> views; boost::container::static_vector<VideoCommon::SamplerId, MAX_TEXTURES> samplers; @@ -148,14 +148,14 @@ void ComputePipeline::Configure() { const auto handle{read_handle(desc, index)}; views.push_back({handle.first}); - VideoCommon::SamplerId sampler = texture_cache.GetComputeSamplerId(handle.second); + VideoCommon::SamplerId sampler = texture_cache.GetSamplerId(handle.second, true); samplers.push_back(sampler); } } for (const auto& desc : info.image_descriptors) { add_image(desc, desc.is_written); } - texture_cache.FillComputeImageViews(std::span(views.data(), views.size())); + texture_cache.FillImageViews(std::span(views.data(), views.size()), true); if (!is_built) { WaitForBuild(); diff --git a/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp b/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp index ee3498428e..83545463ac 100644 --- a/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp +++ b/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp @@ -283,7 +283,7 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { size_t views_index{}; size_t samplers_index{}; - texture_cache.SynchronizeGraphicsDescriptors(); + texture_cache.SynchronizeDescriptors(false); buffer_cache.SetUniformBuffersState(enabled_uniform_buffer_masks, &uniform_buffer_sizes); buffer_cache.runtime.SetBaseUniformBindings(base_uniform_bindings); @@ -354,7 +354,7 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { const auto handle{read_handle(desc, index)}; views[views_index++] = {handle.first}; - VideoCommon::SamplerId sampler{texture_cache.GetGraphicsSamplerId(handle.second)}; + VideoCommon::SamplerId sampler{texture_cache.GetSamplerId(handle.second, false)}; samplers[samplers_index++] = sampler; } } @@ -379,7 +379,7 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { if constexpr (Spec::enabled_stages[4]) { config_stage(4); } - texture_cache.FillGraphicsImageViews<Spec::has_images>(std::span(views.data(), views_index)); + texture_cache.FillImageViews(std::span(views.data(), views_index), false, Spec::has_images); texture_cache.UpdateRenderTargets(false); state_tracker.BindFramebuffer(texture_cache.GetFramebuffer()->Handle()); diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 70f244809f..1d77d28c46 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -353,13 +353,13 @@ void RasterizerOpenGL::DrawTexture() { gpu.TickWork(); }; - texture_cache.SynchronizeGraphicsDescriptors(); + texture_cache.SynchronizeDescriptors(false); texture_cache.UpdateRenderTargets(false); SyncState(); const auto& draw_texture_state = maxwell3d->draw_manager.draw_texture_state; - const auto& sampler = texture_cache.GetGraphicsSampler(draw_texture_state.src_sampler); + const auto& sampler = texture_cache.GetSampler(draw_texture_state.src_sampler, true); const auto& texture = texture_cache.GetImageView(draw_texture_state.src_texture); const auto Scale = [&](auto dim) -> s32 { |
