summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_opengl/gl_shader_cache.cpp
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2021-05-21 23:17:53 +0200
committerameerj <52414509+ameerj@users.noreply.github.com>2021-07-23 03:51:33 +0200
commit6bc54e12a0d274beee0cb7584f73429112ec98b2 (patch)
tree76d875eebeb3de8380a6071366e92995d1b1df80 /src/video_core/renderer_opengl/gl_shader_cache.cpp
parentvideo_core: Abstract transform feedback translation utility (diff)
downloadyuzu-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 'src/video_core/renderer_opengl/gl_shader_cache.cpp')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_cache.cpp19
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(