OpenGL: Limit lmem warmup to NVIDIA
🐸
This commit is contained in:
parent
405eae3734
commit
4f160633d3
3 changed files with 15 additions and 4 deletions
|
@ -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,9 +105,11 @@ 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() {
|
||||||
if (!is_pipeline_bound) {
|
if (!is_pipeline_bound) {
|
||||||
|
|
Loading…
Reference in a new issue