Hash :
b0e15ee4
Author :
Date :
2021-12-28T20:37:33
Decide GL_KHR_parallel_shader_compile in backends GL_KHR_parallel_shader_compile was previously being enabled unconditionally in the front end. However, some backends (Vulkan) perform worse with parallel shader compilation. This CL moves the decision of enabling GL_KHR_parallel_shader_compile to the backends. To support single-threaded shader compilation without affecting the generic worker thread pool, Context::mSingleThreadPool is added to own the single-threaded WorkerThreadPool and can be returned by the new function Context::getShaderCompileThreadPool(). Otherwise, if the extension is enabled, the (renamed) Context::mMultiThreadPool is returned. Bug: angleproject:6748 Change-Id: Ic8d3a183f397608f3002a05480deb976dfe44792 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3360337 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Tim Van Patten <timvp@google.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
//
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// ShaderImpl.cpp: Implementation methods of ShaderImpl
#include "libANGLE/renderer/ShaderImpl.h"
#include "libANGLE/Context.h"
#include "libANGLE/trace.h"
namespace rx
{
WaitableCompileEvent::WaitableCompileEvent(std::shared_ptr<angle::WaitableEvent> waitableEvent)
: mWaitableEvent(waitableEvent)
{}
WaitableCompileEvent::~WaitableCompileEvent()
{
mWaitableEvent.reset();
}
void WaitableCompileEvent::wait()
{
mWaitableEvent->wait();
}
bool WaitableCompileEvent::isReady()
{
return mWaitableEvent->isReady();
}
const std::string &WaitableCompileEvent::getInfoLog()
{
return mInfoLog;
}
class TranslateTask : public angle::Closure
{
public:
TranslateTask(ShHandle handle, ShCompileOptions options, const std::string &source)
: mHandle(handle), mOptions(options), mSource(source), mResult(false)
{}
void operator()() override
{
ANGLE_TRACE_EVENT1("gpu.angle", "TranslateTask::run", "source", mSource);
const char *source = mSource.c_str();
mResult = sh::Compile(mHandle, &source, 1, mOptions);
}
bool getResult() { return mResult; }
ShHandle getHandle() { return mHandle; }
private:
ShHandle mHandle;
ShCompileOptions mOptions;
std::string mSource;
bool mResult;
};
class WaitableCompileEventImpl final : public WaitableCompileEvent
{
public:
WaitableCompileEventImpl(std::shared_ptr<angle::WaitableEvent> waitableEvent,
std::shared_ptr<TranslateTask> translateTask)
: WaitableCompileEvent(waitableEvent), mTranslateTask(translateTask)
{}
bool getResult() override { return mTranslateTask->getResult(); }
bool postTranslate(std::string *infoLog) override { return true; }
private:
std::shared_ptr<TranslateTask> mTranslateTask;
};
std::shared_ptr<WaitableCompileEvent> ShaderImpl::compileImpl(
const gl::Context *context,
gl::ShCompilerInstance *compilerInstance,
const std::string &source,
ShCompileOptions compileOptions)
{
#if defined(ANGLE_ENABLE_ASSERTS)
compileOptions |= SH_VALIDATE_AST;
#endif
auto workerThreadPool = context->getShaderCompileThreadPool();
auto translateTask =
std::make_shared<TranslateTask>(compilerInstance->getHandle(), compileOptions, source);
return std::make_shared<WaitableCompileEventImpl>(
angle::WorkerThreadPool::PostWorkerTask(workerThreadPool, translateTask), translateTask);
}
} // namespace rx