Rive-cpp 2.0: GPU-based rendering backend 51/281151/3
authorMichal Maciola <m.maciola@samsung.com>
Tue, 13 Sep 2022 13:21:21 +0000 (15:21 +0200)
committerMichal Maciola <m.maciola@samsung.com>
Mon, 17 Oct 2022 11:59:55 +0000 (13:59 +0200)
This commit adds a backend for GPU-based rendering

Change-Id: I7d255c999f0e8616b576f5296a19b7e884e8cff1

meson.build
src/rive_tizen.cpp

index e1dc93316a1097606a2971853b5a6aeff54bccbf..5b3ae11d34e7dae10594b357256746f7f5371918 100644 (file)
@@ -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')
index 3dbf9fff2b8530018783f14ea3a79b36578d3ea7..5b8ad9d0fbc92c55a2cab700916450157d2a3bd9 100644 (file)
@@ -1,15 +1,5 @@
 #include "rive_tizen.hpp"
 
-#include <SkCanvas.h>
-#include <SkColorSpace.h>
-#include <SkSurface.h>
-#include <SkTypes.h>
-
-#include <SkCanvas.h>
-#include <SkColorSpace.h>
-#include <SkSurface.h>
-#include <SkTypes.h>
-
 #include <skia_factory.hpp>
 #include <skia_renderer.hpp>
 
@@ -18,6 +8,15 @@
 #include <SkSurface.h>
 #include <SkTypes.h>
 
+#ifdef USE_GL
+#define SK_GL
+#include <GLFW/glfw3.h>
+
+#include "GrBackendSurface.h"
+#include "GrDirectContext.h"
+#include "gl/GrGLInterface.h"
+#endif
+
 #include <rive/node.hpp>
 #include <rive/shapes/paint/color.hpp>
 #include <rive/shapes/paint/solid_color.hpp>
@@ -45,6 +44,10 @@ static rive::SkiaFactory mSkiaFactory;
 static std::unique_ptr<rive::File> mFile;
 static std::unique_ptr<rive::ArtboardInstance> mArtboardInstance;
 
+#ifdef USE_GL
+static sk_sp<GrDirectContext> 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;
 }