|
|
@@ -14,12 +14,15 @@ static constexpr std::array ASSEMBLY_PROGRAM_ENUMS{
|
|
|
GL_GEOMETRY_PROGRAM_NV, GL_FRAGMENT_PROGRAM_NV,
|
|
|
};
|
|
|
|
|
|
-ProgramManager::ProgramManager(const Device& device)
|
|
|
- : lmem_warmup_program(CreateProgram(HostShaders::OPENGL_LMEM_WARMUP_COMP, GL_COMPUTE_SHADER)) {
|
|
|
+ProgramManager::ProgramManager(const Device& device) {
|
|
|
glCreateProgramPipelines(1, &pipeline.handle);
|
|
|
if (device.UseAssemblyShaders()) {
|
|
|
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) {
|
|
|
@@ -102,8 +105,10 @@ void ProgramManager::BindAssemblyPrograms(std::span<const OGLAssemblyProgram, NU
|
|
|
void ProgramManager::RestoreGuestCompute() {}
|
|
|
|
|
|
void ProgramManager::LocalMemoryWarmup() {
|
|
|
- BindComputeProgram(lmem_warmup_program.handle);
|
|
|
- glDispatchCompute(1, 1, 1);
|
|
|
+ if (lmem_warmup_program.handle != 0) {
|
|
|
+ BindComputeProgram(lmem_warmup_program.handle);
|
|
|
+ glDispatchCompute(1, 1, 1);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void ProgramManager::BindPipeline() {
|