diff options
| -rw-r--r-- | src/video_core/renderer_opengl/gl_compute_program.cpp | 5 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_manager.h | 19 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 1 |
3 files changed, 21 insertions, 4 deletions
diff --git a/src/video_core/renderer_opengl/gl_compute_program.cpp b/src/video_core/renderer_opengl/gl_compute_program.cpp index fb54618a4..ce52a0052 100644 --- a/src/video_core/renderer_opengl/gl_compute_program.cpp +++ b/src/video_core/renderer_opengl/gl_compute_program.cpp | |||
| @@ -125,10 +125,7 @@ void ComputeProgram::Configure() { | |||
| 125 | texture_cache.FillComputeImageViews(indices_span, image_view_ids); | 125 | texture_cache.FillComputeImageViews(indices_span, image_view_ids); |
| 126 | 126 | ||
| 127 | if (assembly_program.handle != 0) { | 127 | if (assembly_program.handle != 0) { |
| 128 | // FIXME: State track this | 128 | program_manager.BindComputeAssemblyProgram(assembly_program.handle); |
| 129 | glEnable(GL_COMPUTE_PROGRAM_NV); | ||
| 130 | glBindProgramARB(GL_COMPUTE_PROGRAM_NV, assembly_program.handle); | ||
| 131 | program_manager.BindProgram(0); | ||
| 132 | } else { | 129 | } else { |
| 133 | program_manager.BindProgram(source_program.handle); | 130 | program_manager.BindProgram(source_program.handle); |
| 134 | } | 131 | } |
diff --git a/src/video_core/renderer_opengl/gl_shader_manager.h b/src/video_core/renderer_opengl/gl_shader_manager.h index 48669b3cd..df7e1f644 100644 --- a/src/video_core/renderer_opengl/gl_shader_manager.h +++ b/src/video_core/renderer_opengl/gl_shader_manager.h | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <glad/glad.h> | 10 | #include <glad/glad.h> |
| 11 | 11 | ||
| 12 | #include "video_core/renderer_opengl/gl_resource_manager.h" | 12 | #include "video_core/renderer_opengl/gl_resource_manager.h" |
| 13 | #include "video_core/renderer_opengl/gl_device.h" | ||
| 13 | 14 | ||
| 14 | #pragma optimize("", off) | 15 | #pragma optimize("", off) |
| 15 | 16 | ||
| @@ -24,6 +25,12 @@ class ProgramManager { | |||
| 24 | }; | 25 | }; |
| 25 | 26 | ||
| 26 | public: | 27 | public: |
| 28 | explicit ProgramManager(const Device& device) { | ||
| 29 | if (device.UseAssemblyShaders()) { | ||
| 30 | glEnable(GL_COMPUTE_PROGRAM_NV); | ||
| 31 | } | ||
| 32 | } | ||
| 33 | |||
| 27 | void BindProgram(GLuint program) { | 34 | void BindProgram(GLuint program) { |
| 28 | if (current_source_program == program) { | 35 | if (current_source_program == program) { |
| 29 | return; | 36 | return; |
| @@ -32,6 +39,17 @@ public: | |||
| 32 | glUseProgram(program); | 39 | glUseProgram(program); |
| 33 | } | 40 | } |
| 34 | 41 | ||
| 42 | void BindComputeAssemblyProgram(GLuint program) { | ||
| 43 | if (current_compute_assembly_program != program) { | ||
| 44 | current_compute_assembly_program = program; | ||
| 45 | glBindProgramARB(GL_COMPUTE_PROGRAM_NV, program); | ||
| 46 | } | ||
| 47 | if (current_source_program != 0) { | ||
| 48 | current_source_program = 0; | ||
| 49 | glUseProgram(0); | ||
| 50 | } | ||
| 51 | } | ||
| 52 | |||
| 35 | void BindAssemblyPrograms(std::span<const OGLAssemblyProgram, NUM_STAGES> programs, | 53 | void BindAssemblyPrograms(std::span<const OGLAssemblyProgram, NUM_STAGES> programs, |
| 36 | u32 stage_mask) { | 54 | u32 stage_mask) { |
| 37 | const u32 changed_mask = current_assembly_mask ^ stage_mask; | 55 | const u32 changed_mask = current_assembly_mask ^ stage_mask; |
| @@ -67,6 +85,7 @@ private: | |||
| 67 | 85 | ||
| 68 | u32 current_assembly_mask = 0; | 86 | u32 current_assembly_mask = 0; |
| 69 | std::array<GLuint, NUM_STAGES> current_assembly_programs; | 87 | std::array<GLuint, NUM_STAGES> current_assembly_programs; |
| 88 | GLuint current_compute_assembly_program = 0; | ||
| 70 | }; | 89 | }; |
| 71 | 90 | ||
| 72 | } // namespace OpenGL | 91 | } // namespace OpenGL |
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 4e77ef808..a4805f3da 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp | |||
| @@ -130,6 +130,7 @@ RendererOpenGL::RendererOpenGL(Core::TelemetrySession& telemetry_session_, | |||
| 130 | std::unique_ptr<Core::Frontend::GraphicsContext> context_) | 130 | std::unique_ptr<Core::Frontend::GraphicsContext> context_) |
| 131 | : RendererBase{emu_window_, std::move(context_)}, telemetry_session{telemetry_session_}, | 131 | : RendererBase{emu_window_, std::move(context_)}, telemetry_session{telemetry_session_}, |
| 132 | emu_window{emu_window_}, cpu_memory{cpu_memory_}, gpu{gpu_}, state_tracker{gpu}, | 132 | emu_window{emu_window_}, cpu_memory{cpu_memory_}, gpu{gpu_}, state_tracker{gpu}, |
| 133 | program_manager{device}, | ||
| 133 | rasterizer(emu_window, gpu, cpu_memory, device, screen_info, program_manager, state_tracker) { | 134 | rasterizer(emu_window, gpu, cpu_memory, device, screen_info, program_manager, state_tracker) { |
| 134 | if (Settings::values.renderer_debug && GLAD_GL_KHR_debug) { | 135 | if (Settings::values.renderer_debug && GLAD_GL_KHR_debug) { |
| 135 | glEnable(GL_DEBUG_OUTPUT); | 136 | glEnable(GL_DEBUG_OUTPUT); |