renderer_opengl: State track compute assembly programs
This commit is contained in:
		@@ -125,10 +125,7 @@ void ComputeProgram::Configure() {
 | 
			
		||||
    texture_cache.FillComputeImageViews(indices_span, image_view_ids);
 | 
			
		||||
 | 
			
		||||
    if (assembly_program.handle != 0) {
 | 
			
		||||
        // FIXME: State track this
 | 
			
		||||
        glEnable(GL_COMPUTE_PROGRAM_NV);
 | 
			
		||||
        glBindProgramARB(GL_COMPUTE_PROGRAM_NV, assembly_program.handle);
 | 
			
		||||
        program_manager.BindProgram(0);
 | 
			
		||||
        program_manager.BindComputeAssemblyProgram(assembly_program.handle);
 | 
			
		||||
    } else {
 | 
			
		||||
        program_manager.BindProgram(source_program.handle);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,7 @@
 | 
			
		||||
#include <glad/glad.h>
 | 
			
		||||
 | 
			
		||||
#include "video_core/renderer_opengl/gl_resource_manager.h"
 | 
			
		||||
#include "video_core/renderer_opengl/gl_device.h"
 | 
			
		||||
 | 
			
		||||
#pragma optimize("", off)
 | 
			
		||||
 | 
			
		||||
@@ -24,6 +25,12 @@ class ProgramManager {
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    explicit ProgramManager(const Device& device) {
 | 
			
		||||
        if (device.UseAssemblyShaders()) {
 | 
			
		||||
            glEnable(GL_COMPUTE_PROGRAM_NV);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void BindProgram(GLuint program) {
 | 
			
		||||
        if (current_source_program == program) {
 | 
			
		||||
            return;
 | 
			
		||||
@@ -32,6 +39,17 @@ public:
 | 
			
		||||
        glUseProgram(program);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void BindComputeAssemblyProgram(GLuint program) {
 | 
			
		||||
        if (current_compute_assembly_program != program) {
 | 
			
		||||
            current_compute_assembly_program = program;
 | 
			
		||||
            glBindProgramARB(GL_COMPUTE_PROGRAM_NV, program);
 | 
			
		||||
        }
 | 
			
		||||
        if (current_source_program != 0) {
 | 
			
		||||
            current_source_program = 0;
 | 
			
		||||
            glUseProgram(0);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void BindAssemblyPrograms(std::span<const OGLAssemblyProgram, NUM_STAGES> programs,
 | 
			
		||||
                              u32 stage_mask) {
 | 
			
		||||
        const u32 changed_mask = current_assembly_mask ^ stage_mask;
 | 
			
		||||
@@ -67,6 +85,7 @@ private:
 | 
			
		||||
 | 
			
		||||
    u32 current_assembly_mask = 0;
 | 
			
		||||
    std::array<GLuint, NUM_STAGES> current_assembly_programs;
 | 
			
		||||
    GLuint current_compute_assembly_program = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace OpenGL
 | 
			
		||||
 
 | 
			
		||||
@@ -130,6 +130,7 @@ RendererOpenGL::RendererOpenGL(Core::TelemetrySession& telemetry_session_,
 | 
			
		||||
                               std::unique_ptr<Core::Frontend::GraphicsContext> context_)
 | 
			
		||||
    : RendererBase{emu_window_, std::move(context_)}, telemetry_session{telemetry_session_},
 | 
			
		||||
      emu_window{emu_window_}, cpu_memory{cpu_memory_}, gpu{gpu_}, state_tracker{gpu},
 | 
			
		||||
      program_manager{device},
 | 
			
		||||
      rasterizer(emu_window, gpu, cpu_memory, device, screen_info, program_manager, state_tracker) {
 | 
			
		||||
    if (Settings::values.renderer_debug && GLAD_GL_KHR_debug) {
 | 
			
		||||
        glEnable(GL_DEBUG_OUTPUT);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user