From 7ae80a928564eba96c4fef0b91b1c50e1647fb8d Mon Sep 17 00:00:00 2001 From: Georgios Pinitas Date: Fri, 25 Oct 2019 18:25:17 +0100 Subject: COMPMID-2549: Add GLES Runtime Context interfaces. * Creates interfaces and concrete classes * Ports GCActivationalLayer * Adapts test framework and relevant tests Change-Id: Ide36cd65ebf185958db3c4a5bebd630fcb2f39b3 Signed-off-by: Georgios Pinitas Reviewed-on: https://review.mlplatform.org/c/2199 Reviewed-by: Pablo Marquez Tested-by: Arm Jenkins Comments-Addressed: Arm Jenkins --- src/core/CL/CLHelpers.cpp | 4 +- src/core/GLES_COMPUTE/GCCoreRuntimeContext.cpp | 42 +++++++++++ src/core/GLES_COMPUTE/GCHelpers.cpp | 18 ++++- src/core/GLES_COMPUTE/GCKernelLibrary.cpp | 27 +++++++ .../kernels/GCActivationLayerKernel.cpp | 6 +- src/runtime/GLES_COMPUTE/GCHelpers.cpp | 85 ++++++++++++++++++++++ src/runtime/GLES_COMPUTE/GCRuntimeContext.cpp | 67 +++++++++++++++++ src/runtime/GLES_COMPUTE/GCScheduler.cpp | 8 ++ src/runtime/GLES_COMPUTE/IGCSimpleFunction.cpp | 15 ++-- .../GLES_COMPUTE/functions/GCActivationLayer.cpp | 8 +- 10 files changed, 265 insertions(+), 15 deletions(-) create mode 100644 src/core/GLES_COMPUTE/GCCoreRuntimeContext.cpp create mode 100644 src/runtime/GLES_COMPUTE/GCHelpers.cpp create mode 100644 src/runtime/GLES_COMPUTE/GCRuntimeContext.cpp (limited to 'src') diff --git a/src/core/CL/CLHelpers.cpp b/src/core/CL/CLHelpers.cpp index 1132aa4540..26660ce215 100644 --- a/src/core/CL/CLHelpers.cpp +++ b/src/core/CL/CLHelpers.cpp @@ -338,12 +338,12 @@ cl::Kernel create_opencl_kernel(CLCoreRuntimeContext *ctx, const std::string &ke { if(ctx && ctx->kernel_library()) { - //New api going through the core context + // New api going through the core context return static_cast(ctx->kernel_library()->create_kernel(kernel_name, build_opts.options())); } else { - //Legacy code through the singleton + // Legacy code through the singleton return static_cast(CLKernelLibrary::get().create_kernel(kernel_name, build_opts.options())); } } diff --git a/src/core/GLES_COMPUTE/GCCoreRuntimeContext.cpp b/src/core/GLES_COMPUTE/GCCoreRuntimeContext.cpp new file mode 100644 index 0000000000..311dfd2fa7 --- /dev/null +++ b/src/core/GLES_COMPUTE/GCCoreRuntimeContext.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2019 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#include "arm_compute/core/GLES_COMPUTE/GCCoreRuntimeContext.h" + +namespace arm_compute +{ +GCCoreRuntimeContext::GCCoreRuntimeContext() + : _kernel_lib(nullptr) +{ +} + +GCCoreRuntimeContext::GCCoreRuntimeContext(GCKernelLibrary *kernel_lib) + : _kernel_lib(kernel_lib) +{ +} + +GCKernelLibrary *GCCoreRuntimeContext::kernel_library() const +{ + return _kernel_lib; +} +} // namespace arm_compute diff --git a/src/core/GLES_COMPUTE/GCHelpers.cpp b/src/core/GLES_COMPUTE/GCHelpers.cpp index 8970688ca7..b9740071a5 100644 --- a/src/core/GLES_COMPUTE/GCHelpers.cpp +++ b/src/core/GLES_COMPUTE/GCHelpers.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 ARM Limited. + * Copyright (c) 2018-2019 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -23,6 +23,8 @@ */ #include "arm_compute/core/GLES_COMPUTE/GCHelpers.h" +#include "arm_compute/core/GLES_COMPUTE/GCCoreRuntimeContext.h" + namespace arm_compute { GPUTarget get_target_from_device() @@ -31,4 +33,18 @@ GPUTarget get_target_from_device() return get_target_from_name(device_name); } + +GCKernel create_opengl_kernel(GCCoreRuntimeContext *ctx, const std::string &kernel_name, const std::set &build_opts) +{ + if(ctx && ctx->kernel_library()) + { + // New api going through the core context + return ctx->kernel_library()->create_kernel(kernel_name, build_opts); + } + else + { + // Legacy code through the singleton + return GCKernelLibrary::get().create_kernel(kernel_name, build_opts); + } +} } // namespace arm_compute diff --git a/src/core/GLES_COMPUTE/GCKernelLibrary.cpp b/src/core/GLES_COMPUTE/GCKernelLibrary.cpp index 015e085355..4b3c5aa869 100644 --- a/src/core/GLES_COMPUTE/GCKernelLibrary.cpp +++ b/src/core/GLES_COMPUTE/GCKernelLibrary.cpp @@ -337,6 +337,33 @@ GCKernelLibrary &GCKernelLibrary::get() return _kernel_library; } +void GCKernelLibrary::init(std::string shader_path, EGLDisplay dpy, EGLContext ctx) +{ + //TODO: deal with old display and context. + _shader_path = std::move(shader_path); + + _display = dpy; + _context = ctx; + + eglMakeCurrent(_display, EGL_NO_SURFACE, EGL_NO_SURFACE, _context); + setup_dummy_fbo(); +} + +void GCKernelLibrary::set_shader_path(const std::string &shader_path) +{ + _shader_path = shader_path; +} + +void GCKernelLibrary::set_context(EGLDisplay dpy, EGLContext ctx) +{ + //TODO: deal with old display and context. + _display = dpy; + _context = ctx; + + eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, ctx); + setup_dummy_fbo(); +} + GCKernel GCKernelLibrary::create_kernel(const std::string &shader_name, const StringSet &build_options_set) const { // Find which program contains the kernel diff --git a/src/core/GLES_COMPUTE/kernels/GCActivationLayerKernel.cpp b/src/core/GLES_COMPUTE/kernels/GCActivationLayerKernel.cpp index 174e04811a..ab3e179a14 100644 --- a/src/core/GLES_COMPUTE/kernels/GCActivationLayerKernel.cpp +++ b/src/core/GLES_COMPUTE/kernels/GCActivationLayerKernel.cpp @@ -39,8 +39,8 @@ using namespace arm_compute; -GCActivationLayerKernel::GCActivationLayerKernel() - : _input(nullptr), _output(nullptr) +GCActivationLayerKernel::GCActivationLayerKernel(GCCoreRuntimeContext *ctx) + : _input(nullptr), _output(nullptr), _ctx(ctx) { } @@ -77,7 +77,7 @@ void GCActivationLayerKernel::configure(IGCTensor *input, IGCTensor *output, Act build_opts.emplace(("#define LOCAL_SIZE_Z " + support::cpp11::to_string(1))); // Create kernel - _kernel = static_cast(GCKernelLibrary::get().create_kernel("activation_layer", build_opts)); + _kernel = create_opengl_kernel(_ctx, "activation_layer", build_opts); // Configure kernel window Window win = calculate_max_window(*input->info(), Steps(num_elems_processed_per_iteration)); diff --git a/src/runtime/GLES_COMPUTE/GCHelpers.cpp b/src/runtime/GLES_COMPUTE/GCHelpers.cpp new file mode 100644 index 0000000000..df2f4f5e6e --- /dev/null +++ b/src/runtime/GLES_COMPUTE/GCHelpers.cpp @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2019 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "arm_compute/runtime/GLES_COMPUTE/GCHelpers.h" + +#include "arm_compute/core/Error.h" + +namespace arm_compute +{ +std::tuple create_opengl_display_and_context() +{ + EGLBoolean res; + EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + + ARM_COMPUTE_ERROR_ON_MSG_VAR(display == EGL_NO_DISPLAY, "Failed to get display: 0x%x.", eglGetError()); + + res = eglInitialize(display, nullptr, nullptr); + + ARM_COMPUTE_ERROR_ON_MSG_VAR(res == EGL_FALSE, "Failed to initialize egl: 0x%x.", eglGetError()); + ARM_COMPUTE_UNUSED(res); + + const char *egl_extension_st = eglQueryString(display, EGL_EXTENSIONS); + ARM_COMPUTE_ERROR_ON_MSG((strstr(egl_extension_st, "EGL_KHR_create_context") == nullptr), "Failed to query EGL_KHR_create_context"); + ARM_COMPUTE_ERROR_ON_MSG((strstr(egl_extension_st, "EGL_KHR_surfaceless_context") == nullptr), "Failed to query EGL_KHR_surfaceless_context"); + ARM_COMPUTE_UNUSED(egl_extension_st); + + const std::array config_attribs = + { + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR, + EGL_NONE + }; + EGLConfig cfg; + EGLint count; + + res = eglChooseConfig(display, config_attribs.data(), &cfg, 1, &count); + + ARM_COMPUTE_ERROR_ON_MSG_VAR(res == EGL_FALSE, "Failed to choose config: 0x%x.", eglGetError()); + ARM_COMPUTE_UNUSED(res); + + res = eglBindAPI(EGL_OPENGL_ES_API); + + ARM_COMPUTE_ERROR_ON_MSG_VAR(res == EGL_FALSE, "Failed to bind api: 0x%x.", eglGetError()); + + const std::array attribs = + { + EGL_CONTEXT_CLIENT_VERSION, 3, + EGL_NONE + }; + EGLContext context = eglCreateContext(display, + cfg, + EGL_NO_CONTEXT, + attribs.data()); + + ARM_COMPUTE_ERROR_ON_MSG_VAR(context == EGL_NO_CONTEXT, "Failed to create context: 0x%x.", eglGetError()); + ARM_COMPUTE_UNUSED(res); + + res = eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, context); + + ARM_COMPUTE_ERROR_ON_MSG_VAR(res == EGL_FALSE, "Failed to make current: 0x%x.", eglGetError()); + ARM_COMPUTE_UNUSED(res); + + return std::make_tuple(display, context, res); +} +} // namespace arm_compute diff --git a/src/runtime/GLES_COMPUTE/GCRuntimeContext.cpp b/src/runtime/GLES_COMPUTE/GCRuntimeContext.cpp new file mode 100644 index 0000000000..1c30af1b71 --- /dev/null +++ b/src/runtime/GLES_COMPUTE/GCRuntimeContext.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2019 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#include "arm_compute/runtime/GLES_COMPUTE/GCRuntimeContext.h" + +#include "arm_compute/core/Validate.h" +#include "arm_compute/runtime/GLES_COMPUTE/GCHelpers.h" +#include "arm_compute/runtime/GLES_COMPUTE/GCScheduler.h" + +namespace arm_compute +{ +GCRuntimeContext::GCRuntimeContext() + : _gpu_owned_scheduler(support::cpp14::make_unique()), + _gpu_scheduler(_gpu_owned_scheduler.get()), + _core_context() +{ + auto attrs = create_opengl_display_and_context(); + auto display = std::get<0>(attrs); + auto ctx = std::get<1>(attrs); + + _gpu_owned_scheduler->default_init_with_context(display, ctx); + _kernel_lib.init("./cs_shaders/", display, ctx); + + _core_context = GCCoreRuntimeContext(&_kernel_lib); +} + +GCKernelLibrary &GCRuntimeContext::kernel_library() +{ + return _kernel_lib; +} + +GCCoreRuntimeContext *GCRuntimeContext::core_runtime_context() +{ + return &_core_context; +} + +void GCRuntimeContext::set_gpu_scheduler(GCScheduler *scheduler) +{ + ARM_COMPUTE_ERROR_ON_NULLPTR(scheduler); + _gpu_scheduler = scheduler; +} + +GCScheduler *GCRuntimeContext::gpu_scheduler() +{ + return _gpu_scheduler; +} +} // namespace arm_compute diff --git a/src/runtime/GLES_COMPUTE/GCScheduler.cpp b/src/runtime/GLES_COMPUTE/GCScheduler.cpp index 0824af3ed4..a45d7931be 100644 --- a/src/runtime/GLES_COMPUTE/GCScheduler.cpp +++ b/src/runtime/GLES_COMPUTE/GCScheduler.cpp @@ -52,6 +52,14 @@ void GCScheduler::default_init() init(_display, _context); } +void GCScheduler::default_init_with_context(EGLDisplay display, EGLContext ctx) +{ + _context = ctx; + _display = display; + + _target = get_target_from_device(); +} + void GCScheduler::init(EGLDisplay dpy, EGLContext ctx) { _target = get_target_from_device(); diff --git a/src/runtime/GLES_COMPUTE/IGCSimpleFunction.cpp b/src/runtime/GLES_COMPUTE/IGCSimpleFunction.cpp index f2926b0a3f..bb9239eabe 100644 --- a/src/runtime/GLES_COMPUTE/IGCSimpleFunction.cpp +++ b/src/runtime/GLES_COMPUTE/IGCSimpleFunction.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 ARM Limited. + * Copyright (c) 2017-2019 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -28,17 +28,20 @@ using namespace arm_compute; -IGCSimpleFunction::IGCSimpleFunction() //NOLINT +IGCSimpleFunction::IGCSimpleFunction(GCRuntimeContext *ctx) //NOLINT : _kernel(), - _border_handler() + _border_handler(), + _ctx(ctx) { } void IGCSimpleFunction::run() { ARM_COMPUTE_ERROR_ON_MSG(!_kernel, "The child class didn't set the GLES kernel or function isn't configured"); + GCScheduler *scheduler = (_ctx != nullptr) ? _ctx->gpu_scheduler() : &GCScheduler::get().get(); + ARM_COMPUTE_ERROR_ON(scheduler == nullptr); - GCScheduler::get().dispatch(_border_handler, false); - GCScheduler::get().memory_barrier(); - GCScheduler::get().dispatch(*_kernel); + scheduler->dispatch(_border_handler, false); + scheduler->memory_barrier(); + scheduler->dispatch(*_kernel); } diff --git a/src/runtime/GLES_COMPUTE/functions/GCActivationLayer.cpp b/src/runtime/GLES_COMPUTE/functions/GCActivationLayer.cpp index 207e8cef56..0700b2b400 100644 --- a/src/runtime/GLES_COMPUTE/functions/GCActivationLayer.cpp +++ b/src/runtime/GLES_COMPUTE/functions/GCActivationLayer.cpp @@ -29,14 +29,16 @@ namespace arm_compute { -GCActivationLayer::GCActivationLayer(void *ctx) +GCActivationLayer::GCActivationLayer(GCRuntimeContext *ctx) + : IGCSimpleFunction(ctx) { - ARM_COMPUTE_UNUSED(ctx); } void GCActivationLayer::configure(IGCTensor *input, IGCTensor *output, ActivationLayerInfo act_info) { - auto k = arm_compute::support::cpp14::make_unique(); + auto core_ctx = _ctx ? _ctx->core_runtime_context() : /* Legacy */ nullptr; + + auto k = arm_compute::support::cpp14::make_unique(core_ctx); k->configure(input, output, act_info); _kernel = std::move(k); } -- cgit v1.2.1