| // | |
| // Copyright 2021 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. | |
| // | |
| // entry_points_cl_utils.cpp: These helpers are used in CL entry point routines. | |
| #include "libGLESv2/entry_points_cl_utils.h" | |
| #include "libGLESv2/cl_dispatch_table.h" | |
| #include "libANGLE/CLPlatform.h" | |
| #ifdef ANGLE_ENABLE_CL_PASSTHROUGH | |
| # include "libANGLE/renderer/cl/CLPlatformCL.h" | |
| #endif | |
| #ifdef ANGLE_ENABLE_VULKAN | |
| # include "libANGLE/renderer/vulkan/CLPlatformVk.h" | |
| #endif | |
| #include "anglebase/no_destructor.h" | |
| #include <mutex> | |
| namespace cl | |
| { | |
| void InitBackEnds(bool isIcd) | |
| { | |
| enum struct State | |
| { | |
| Uninitialized, | |
| Initializing, | |
| Initialized | |
| }; | |
| static State sState = State::Uninitialized; | |
| // Fast thread-unsafe check first | |
| if (sState == State::Initialized) | |
| { | |
| return; | |
| } | |
| static angle::base::NoDestructor<std::recursive_mutex> sMutex; | |
| std::lock_guard<std::recursive_mutex> lock(*sMutex); | |
| // Thread-safe check, return if initialized | |
| // or if already initializing (re-entry from CL pass-through back end) | |
| if (sState != State::Uninitialized) | |
| { | |
| return; | |
| } | |
| sState = State::Initializing; | |
| rx::CLPlatformImpl::CreateFuncs createFuncs; | |
| #ifdef ANGLE_ENABLE_CL_PASSTHROUGH | |
| rx::CLPlatformCL::Initialize(createFuncs, isIcd); | |
| #endif | |
| #ifdef ANGLE_ENABLE_VULKAN | |
| rx::CLPlatformVk::Initialize(createFuncs); | |
| #endif | |
| Platform::Initialize(gCLIcdDispatchTable, std::move(createFuncs)); | |
| sState = State::Initialized; | |
| } | |
| } // namespace cl |