early-access version 2526

This commit is contained in:
pineappleEA 2022-03-01 23:49:44 +01:00
parent 165c5792cc
commit 68d478c863
26 changed files with 15576 additions and 10000 deletions

View file

@ -1,7 +1,7 @@
yuzu emulator early access yuzu emulator early access
============= =============
This is the source code for early-access 2524. This is the source code for early-access 2526.
## Legal Notice ## Legal Notice

877
dist/languages/ca.ts vendored

File diff suppressed because it is too large Load diff

839
dist/languages/cs.ts vendored

File diff suppressed because it is too large Load diff

837
dist/languages/da.ts vendored

File diff suppressed because it is too large Load diff

839
dist/languages/de.ts vendored

File diff suppressed because it is too large Load diff

839
dist/languages/es.ts vendored

File diff suppressed because it is too large Load diff

837
dist/languages/fi.ts vendored

File diff suppressed because it is too large Load diff

841
dist/languages/fr.ts vendored

File diff suppressed because it is too large Load diff

883
dist/languages/id.ts vendored

File diff suppressed because it is too large Load diff

839
dist/languages/it.ts vendored

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

837
dist/languages/nb.ts vendored

File diff suppressed because it is too large Load diff

837
dist/languages/nl.ts vendored

File diff suppressed because it is too large Load diff

969
dist/languages/pl.ts vendored

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

1316
dist/languages/pt_PT.ts vendored

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

837
dist/languages/sv.ts vendored

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

6202
dist/languages/vi.ts vendored Executable file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -243,10 +243,6 @@ GraphicsPipeline::GraphicsPipeline(
case Settings::ShaderBackend::GLASM: case Settings::ShaderBackend::GLASM:
if (!sources[stage].empty()) { if (!sources[stage].empty()) {
assembly_programs[stage] = CompileProgram(sources[stage], AssemblyStage(stage)); assembly_programs[stage] = CompileProgram(sources[stage], AssemblyStage(stage));
if (in_parallel) {
// Make sure program is built before continuing when building in parallel
glGetString(GL_PROGRAM_ERROR_STRING_NV);
}
} }
break; break;
case Settings::ShaderBackend::SPIRV: case Settings::ShaderBackend::SPIRV:
@ -256,20 +252,18 @@ GraphicsPipeline::GraphicsPipeline(
break; break;
} }
} }
if (in_parallel && backend != Settings::ShaderBackend::GLASM) { if (in_parallel) {
// Make sure programs have built if we are building shaders in parallel std::lock_guard lock{built_mutex};
for (OGLProgram& program : source_programs) { built_fence.Create();
if (program.handle != 0) { // Flush this context to ensure compilation commands and fence are in the GPU pipe.
GLint status{}; glFlush();
glGetProgramiv(program.handle, GL_LINK_STATUS, &status); built_condvar.notify_one();
} } else {
} is_built = true;
} }
if (shader_notify) { if (shader_notify) {
shader_notify->MarkShaderComplete(); shader_notify->MarkShaderComplete();
} }
is_built = true;
built_condvar.notify_one();
}}; }};
if (thread_worker) { if (thread_worker) {
thread_worker->QueueWork(std::move(func)); thread_worker->QueueWork(std::move(func));
@ -440,7 +434,7 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) {
buffer_cache.UpdateGraphicsBuffers(is_indexed); buffer_cache.UpdateGraphicsBuffers(is_indexed);
buffer_cache.BindHostGeometryBuffers(is_indexed); buffer_cache.BindHostGeometryBuffers(is_indexed);
if (!is_built.load(std::memory_order::relaxed)) { if (!IsBuilt()) {
WaitForBuild(); WaitForBuild();
} }
const bool use_assembly{assembly_programs[0].handle != 0}; const bool use_assembly{assembly_programs[0].handle != 0};
@ -585,8 +579,26 @@ void GraphicsPipeline::GenerateTransformFeedbackState() {
} }
void GraphicsPipeline::WaitForBuild() { void GraphicsPipeline::WaitForBuild() {
std::unique_lock lock{built_mutex}; if (built_fence.handle == 0) {
built_condvar.wait(lock, [this] { return is_built.load(std::memory_order::relaxed); }); std::unique_lock lock{built_mutex};
built_condvar.wait(lock, [this] { return built_fence.handle != 0; });
}
ASSERT(glClientWaitSync(built_fence.handle, 0, GL_TIMEOUT_IGNORED) != GL_WAIT_FAILED);
is_built = true;
}
bool GraphicsPipeline::IsBuilt() noexcept {
if (is_built) {
return true;
}
if (built_fence.handle == 0) {
return false;
}
// Timeout of zero means this is non-blocking
const auto sync_status = glClientWaitSync(built_fence.handle, 0, 0);
ASSERT(sync_status != GL_WAIT_FAILED);
is_built = sync_status != GL_TIMEOUT_EXPIRED;
return is_built;
} }
} // namespace OpenGL } // namespace OpenGL

View file

@ -100,9 +100,7 @@ public:
return writes_global_memory; return writes_global_memory;
} }
[[nodiscard]] bool IsBuilt() const noexcept { [[nodiscard]] bool IsBuilt() noexcept;
return is_built.load(std::memory_order::relaxed);
}
template <typename Spec> template <typename Spec>
static auto MakeConfigureSpecFunc() { static auto MakeConfigureSpecFunc() {
@ -154,7 +152,8 @@ private:
std::mutex built_mutex; std::mutex built_mutex;
std::condition_variable built_condvar; std::condition_variable built_condvar;
std::atomic_bool is_built{false}; OGLSync built_fence{};
bool is_built{false};
}; };
} // namespace OpenGL } // namespace OpenGL