mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	OpenGL: Limit lmem warmup to NVIDIA
🐸
			
			
This commit is contained in:
		@@ -194,6 +194,7 @@ Device::Device(Core::Frontend::EmuWindow& emu_window) {
 | 
				
			|||||||
            has_bool_ref_bug = true;
 | 
					            has_bool_ref_bug = true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    has_lmem_perf_bug = is_nvidia;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    strict_context_required = emu_window.StrictContextRequired();
 | 
					    strict_context_required = emu_window.StrictContextRequired();
 | 
				
			||||||
    // Blocks AMD and Intel OpenGL drivers on Windows from using asynchronous shader compilation.
 | 
					    // Blocks AMD and Intel OpenGL drivers on Windows from using asynchronous shader compilation.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -192,6 +192,10 @@ public:
 | 
				
			|||||||
        return supports_conditional_barriers;
 | 
					        return supports_conditional_barriers;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool HasLmemPerfBug() const {
 | 
				
			||||||
 | 
					        return has_lmem_perf_bug;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    static bool TestVariableAoffi();
 | 
					    static bool TestVariableAoffi();
 | 
				
			||||||
    static bool TestPreciseBug();
 | 
					    static bool TestPreciseBug();
 | 
				
			||||||
@@ -238,6 +242,7 @@ private:
 | 
				
			|||||||
    bool can_report_memory{};
 | 
					    bool can_report_memory{};
 | 
				
			||||||
    bool strict_context_required{};
 | 
					    bool strict_context_required{};
 | 
				
			||||||
    bool supports_conditional_barriers{};
 | 
					    bool supports_conditional_barriers{};
 | 
				
			||||||
 | 
					    bool has_lmem_perf_bug{};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    std::string vendor_name;
 | 
					    std::string vendor_name;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,12 +14,15 @@ static constexpr std::array ASSEMBLY_PROGRAM_ENUMS{
 | 
				
			|||||||
    GL_GEOMETRY_PROGRAM_NV, GL_FRAGMENT_PROGRAM_NV,
 | 
					    GL_GEOMETRY_PROGRAM_NV, GL_FRAGMENT_PROGRAM_NV,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ProgramManager::ProgramManager(const Device& device)
 | 
					ProgramManager::ProgramManager(const Device& device) {
 | 
				
			||||||
    : lmem_warmup_program(CreateProgram(HostShaders::OPENGL_LMEM_WARMUP_COMP, GL_COMPUTE_SHADER)) {
 | 
					 | 
				
			||||||
    glCreateProgramPipelines(1, &pipeline.handle);
 | 
					    glCreateProgramPipelines(1, &pipeline.handle);
 | 
				
			||||||
    if (device.UseAssemblyShaders()) {
 | 
					    if (device.UseAssemblyShaders()) {
 | 
				
			||||||
        glEnable(GL_COMPUTE_PROGRAM_NV);
 | 
					        glEnable(GL_COMPUTE_PROGRAM_NV);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (device.HasLmemPerfBug()) {
 | 
				
			||||||
 | 
					        lmem_warmup_program =
 | 
				
			||||||
 | 
					            CreateProgram(HostShaders::OPENGL_LMEM_WARMUP_COMP, GL_COMPUTE_SHADER);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ProgramManager::BindComputeProgram(GLuint program) {
 | 
					void ProgramManager::BindComputeProgram(GLuint program) {
 | 
				
			||||||
@@ -102,8 +105,10 @@ void ProgramManager::BindAssemblyPrograms(std::span<const OGLAssemblyProgram, NU
 | 
				
			|||||||
void ProgramManager::RestoreGuestCompute() {}
 | 
					void ProgramManager::RestoreGuestCompute() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ProgramManager::LocalMemoryWarmup() {
 | 
					void ProgramManager::LocalMemoryWarmup() {
 | 
				
			||||||
 | 
					    if (lmem_warmup_program.handle != 0) {
 | 
				
			||||||
        BindComputeProgram(lmem_warmup_program.handle);
 | 
					        BindComputeProgram(lmem_warmup_program.handle);
 | 
				
			||||||
        glDispatchCompute(1, 1, 1);
 | 
					        glDispatchCompute(1, 1, 1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ProgramManager::BindPipeline() {
 | 
					void ProgramManager::BindPipeline() {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user