diff options
author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2021-05-21 23:17:53 +0200 |
---|---|---|
committer | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-07-23 03:51:33 +0200 |
commit | 6bc54e12a0d274beee0cb7584f73429112ec98b2 (patch) | |
tree | 76d875eebeb3de8380a6071366e92995d1b1df80 /src/video_core/renderer_opengl/gl_shader_cache.cpp | |
parent | video_core: Abstract transform feedback translation utility (diff) | |
download | yuzu-6bc54e12a0d274beee0cb7584f73429112ec98b2.tar yuzu-6bc54e12a0d274beee0cb7584f73429112ec98b2.tar.gz yuzu-6bc54e12a0d274beee0cb7584f73429112ec98b2.tar.bz2 yuzu-6bc54e12a0d274beee0cb7584f73429112ec98b2.tar.lz yuzu-6bc54e12a0d274beee0cb7584f73429112ec98b2.tar.xz yuzu-6bc54e12a0d274beee0cb7584f73429112ec98b2.tar.zst yuzu-6bc54e12a0d274beee0cb7584f73429112ec98b2.zip |
Diffstat (limited to '')
-rw-r--r-- | src/video_core/renderer_opengl/gl_shader_cache.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index b4f26dd74..0a0f1324f 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp @@ -254,6 +254,17 @@ Shader::RuntimeInfo MakeRuntimeInfo(const GraphicsProgramKey& key, } return info; } + +void SetXfbState(VideoCommon::TransformFeedbackState& state, const Maxwell& regs) { + std::ranges::transform(regs.tfb_layouts, state.layouts.begin(), [](const auto& layout) { + return VideoCommon::TransformFeedbackState::Layout{ + .stream = layout.stream, + .varying_count = layout.varying_count, + .stride = layout.stride, + }; + }); + state.varyings = regs.tfb_varying_locs; +} } // Anonymous namespace ShaderCache::ShaderCache(RasterizerOpenGL& rasterizer_, Core::Frontend::EmuWindow& emu_window_, @@ -282,7 +293,10 @@ GraphicsProgram* ShaderCache::CurrentGraphicsProgram() { graphics_key.tessellation_primitive.Assign(regs.tess_mode.prim.Value()); graphics_key.tessellation_spacing.Assign(regs.tess_mode.spacing.Value()); graphics_key.tessellation_clockwise.Assign(regs.tess_mode.cw.Value()); - + graphics_key.xfb_enabled.Assign(regs.tfb_enabled != 0 ? 1 : 0); + if (graphics_key.xfb_enabled) { + SetXfbState(graphics_key.xfb_state, regs); + } const auto [pair, is_new]{graphics_cache.try_emplace(graphics_key)}; auto& program{pair->second}; if (is_new) { @@ -368,7 +382,8 @@ std::unique_ptr<GraphicsProgram> ShaderCache::CreateGraphicsProgram( } return std::make_unique<GraphicsProgram>( texture_cache, buffer_cache, gpu_memory, maxwell3d, program_manager, state_tracker, - std::move(source_program), std::move(assembly_programs), infos); + std::move(source_program), std::move(assembly_programs), infos, + key.xfb_enabled != 0 ? &key.xfb_state : nullptr); } std::unique_ptr<ComputeProgram> ShaderCache::CreateComputeProgram( |