diff options
author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2021-05-20 21:53:51 +0200 |
---|---|---|
committer | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-07-23 03:51:32 +0200 |
commit | c5ca4fe451c398542f4f6c5e468e0bb96866175d (patch) | |
tree | b88671fe102002eaca3bf6e93152b3bf3be4da52 /src/video_core/renderer_opengl/gl_shader_manager.h | |
parent | glasm: Fix potential aliasing bug on cube array samples (diff) | |
download | yuzu-c5ca4fe451c398542f4f6c5e468e0bb96866175d.tar yuzu-c5ca4fe451c398542f4f6c5e468e0bb96866175d.tar.gz yuzu-c5ca4fe451c398542f4f6c5e468e0bb96866175d.tar.bz2 yuzu-c5ca4fe451c398542f4f6c5e468e0bb96866175d.tar.lz yuzu-c5ca4fe451c398542f4f6c5e468e0bb96866175d.tar.xz yuzu-c5ca4fe451c398542f4f6c5e468e0bb96866175d.tar.zst yuzu-c5ca4fe451c398542f4f6c5e468e0bb96866175d.zip |
Diffstat (limited to '')
-rw-r--r-- | src/video_core/renderer_opengl/gl_shader_manager.h | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_manager.h b/src/video_core/renderer_opengl/gl_shader_manager.h index 70781d6f5..48669b3cd 100644 --- a/src/video_core/renderer_opengl/gl_shader_manager.h +++ b/src/video_core/renderer_opengl/gl_shader_manager.h @@ -4,24 +4,69 @@ #pragma once +#include <array> +#include <span> + #include <glad/glad.h> +#include "video_core/renderer_opengl/gl_resource_manager.h" + +#pragma optimize("", off) + namespace OpenGL { class ProgramManager { + static constexpr size_t NUM_STAGES = 5; + + static constexpr std::array ASSEMBLY_PROGRAM_ENUMS{ + GL_VERTEX_PROGRAM_NV, GL_TESS_CONTROL_PROGRAM_NV, GL_TESS_EVALUATION_PROGRAM_NV, + GL_GEOMETRY_PROGRAM_NV, GL_FRAGMENT_PROGRAM_NV, + }; + public: void BindProgram(GLuint program) { - if (bound_program == program) { + if (current_source_program == program) { return; } - bound_program = program; + current_source_program = program; glUseProgram(program); } + void BindAssemblyPrograms(std::span<const OGLAssemblyProgram, NUM_STAGES> programs, + u32 stage_mask) { + const u32 changed_mask = current_assembly_mask ^ stage_mask; + current_assembly_mask = stage_mask; + + if (changed_mask != 0) { + for (size_t stage = 0; stage < NUM_STAGES; ++stage) { + if (((changed_mask >> stage) & 1) != 0) { + if (((stage_mask >> stage) & 1) != 0) { + glEnable(ASSEMBLY_PROGRAM_ENUMS[stage]); + } else { + glDisable(ASSEMBLY_PROGRAM_ENUMS[stage]); + } + } + } + } + for (size_t stage = 0; stage < NUM_STAGES; ++stage) { + if (current_assembly_programs[stage] != programs[stage].handle) { + current_assembly_programs[stage] = programs[stage].handle; + glBindProgramARB(ASSEMBLY_PROGRAM_ENUMS[stage], programs[stage].handle); + } + } + if (current_source_program != 0) { + current_source_program = 0; + glUseProgram(0); + } + } + void RestoreGuestCompute() {} private: - GLuint bound_program = 0; + GLuint current_source_program = 0; + + u32 current_assembly_mask = 0; + std::array<GLuint, NUM_STAGES> current_assembly_programs; }; } // namespace OpenGL |