From: Michal Maciola Date: Tue, 13 Sep 2022 13:21:21 +0000 (+0200) Subject: Rive-cpp 2.0: GPU-based rendering backend X-Git-Tag: accepted/tizen/unified/20221115.022406~10 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5ea6a1e13c293e2d22abc2c41598e08bbe083ad3;p=platform%2Fcore%2Fuifw%2Frive-tizen.git Rive-cpp 2.0: GPU-based rendering backend This commit adds a backend for GPU-based rendering Change-Id: I7d255c999f0e8616b576f5296a19b7e884e8cff1 --- diff --git a/meson.build b/meson.build index e1dc933..5b3ae11 100644 --- a/meson.build +++ b/meson.build @@ -762,16 +762,18 @@ skia_inc_core = include_directories('submodule/skia/include/core') skia_inc_effects = include_directories('submodule/skia/include/effects') skia_inc_dirs = [skia_inc, skia_inc_core, skia_inc_effects] -skia_inc_gpu = include_directories('submodule/skia/include/gpu') +if get_option('use_gl') == true + skia_inc_dirs += include_directories('submodule/skia/include/gpu') +endif skia_dir = meson.current_source_dir() + '/submodule/skia/out/static/' skia_lib = cc.find_library('libskia', dirs : skia_dir, static: true, header_include_directories: skia_inc_dirs) skia_dep = declare_dependency( - include_directories: [skia_inc, skia_inc_core, skia_inc_effects], + include_directories: skia_inc_dirs, dependencies: skia_lib, ) -headers = [include_directories('inc'), include_directories('src'), rive_cpp_inc, skia_inc, skia_inc_core, skia_inc_effects] +headers = [include_directories('inc'), include_directories('src'), rive_cpp_inc, skia_inc_dirs] subdir('inc') subdir('src') diff --git a/src/rive_tizen.cpp b/src/rive_tizen.cpp index 3dbf9ff..5b8ad9d 100644 --- a/src/rive_tizen.cpp +++ b/src/rive_tizen.cpp @@ -1,15 +1,5 @@ #include "rive_tizen.hpp" -#include -#include -#include -#include - -#include -#include -#include -#include - #include #include @@ -18,6 +8,15 @@ #include #include +#ifdef USE_GL +#define SK_GL +#include + +#include "GrBackendSurface.h" +#include "GrDirectContext.h" +#include "gl/GrGLInterface.h" +#endif + #include #include #include @@ -45,6 +44,10 @@ static rive::SkiaFactory mSkiaFactory; static std::unique_ptr mFile; static std::unique_ptr mArtboardInstance; +#ifdef USE_GL +static sk_sp mContext; +#endif + RiveTizen::RiveTizen() { } @@ -116,9 +119,34 @@ bool RiveTizen::loadRiveResource(uint8_t *bytes, size_t size) bool RiveTizen::createCanvas(unsigned char *buffer, unsigned int width, unsigned int height, unsigned int stride) { - +#ifdef USE_GL + // Buffer is unused for gpu-based version + GrContextOptions options; + mContext = GrDirectContext::MakeGL(nullptr, options); + + GrGLFramebufferInfo framebufferInfo; + framebufferInfo.fFBOID = 0; + framebufferInfo.fFormat = GL_RGBA8; + GrBackendRenderTarget backendRenderTarget(width, height, 0 /* sample count */, 0 /* stencil bits */, framebufferInfo); + + mSkiaSurface = SkSurface::MakeFromBackendRenderTarget(mContext.get(), backendRenderTarget, kBottomLeft_GrSurfaceOrigin, + kRGBA_8888_SkColorType, nullptr, nullptr); +#else SkImageInfo info = SkImageInfo::MakeN32Premul(width, height); mSkiaSurface = SkSurface::MakeRasterDirect(info, buffer, stride * 4); +#endif + + if (!mSkiaSurface) + { + #ifdef USE_GL + #define USE_GL_VALUE "true" + #else + #define USE_GL_VALUE "false" + #endif + LOGE("[Failed to create Skia surface][USE_GL = " USE_GL_VALUE "]"); + return false; + } + mSkiaCanvas = mSkiaSurface->getCanvas(); mSkiaCanvas->clear(SK_ColorTRANSPARENT); return true; @@ -134,6 +162,11 @@ bool RiveTizen::render(double elapsed, unsigned int width, unsigned int height) renderer.transform(viewTransform); mArtboardInstance->draw(&renderer); renderer.restore(); + +#ifdef USE_GL + mContext->flush(); +#endif + return true; }