|
|
|
@ -3,13 +3,19 @@
|
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
|
|
#include <chrono>
|
|
|
|
|
#include <condition_variable>
|
|
|
|
|
#include <mutex>
|
|
|
|
|
#include <thread>
|
|
|
|
|
#include <vector>
|
|
|
|
|
#include "video_core/engines/maxwell_3d.h"
|
|
|
|
|
#include "video_core/renderer_base.h"
|
|
|
|
|
#include "video_core/renderer_opengl/gl_shader_cache.h"
|
|
|
|
|
#include "video_core/shader/async_shaders.h"
|
|
|
|
|
|
|
|
|
|
namespace VideoCommon::Shader {
|
|
|
|
|
|
|
|
|
|
AsyncShaders::AsyncShaders(Core::Frontend::EmuWindow& emu_window) : emu_window(emu_window) {}
|
|
|
|
|
|
|
|
|
|
AsyncShaders::~AsyncShaders() {
|
|
|
|
|
KillWorkers();
|
|
|
|
|
}
|
|
|
|
@ -64,7 +70,7 @@ bool AsyncShaders::HasWorkQueued() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool AsyncShaders::HasCompletedWork() {
|
|
|
|
|
std::shared_lock lock(completed_mutex);
|
|
|
|
|
std::shared_lock lock{completed_mutex};
|
|
|
|
|
return !finished_work.empty();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -90,7 +96,7 @@ bool AsyncShaders::IsShaderAsync(const Tegra::GPU& gpu) const {
|
|
|
|
|
std::vector<AsyncShaders::Result> AsyncShaders::GetCompletedWork() {
|
|
|
|
|
std::vector<AsyncShaders::Result> results;
|
|
|
|
|
{
|
|
|
|
|
std::unique_lock lock(completed_mutex);
|
|
|
|
|
std::unique_lock lock{completed_mutex};
|
|
|
|
|
results.assign(std::make_move_iterator(finished_work.begin()),
|
|
|
|
|
std::make_move_iterator(finished_work.end()));
|
|
|
|
|
finished_work.clear();
|
|
|
|
@ -124,8 +130,8 @@ void AsyncShaders::QueueOpenGLShader(const OpenGL::Device& device,
|
|
|
|
|
void AsyncShaders::ShaderCompilerThread(Core::Frontend::GraphicsContext* context) {
|
|
|
|
|
using namespace std::chrono_literals;
|
|
|
|
|
while (!is_thread_exiting.load(std::memory_order_relaxed)) {
|
|
|
|
|
std::unique_lock<std::mutex> lock(queue_mutex);
|
|
|
|
|
cv.wait(lock, [&] { return HasWorkQueued() || is_thread_exiting; });
|
|
|
|
|
std::unique_lock lock{queue_mutex};
|
|
|
|
|
cv.wait(lock, [this] { return HasWorkQueued() || is_thread_exiting; });
|
|
|
|
|
if (is_thread_exiting) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|