Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
instructions to use skia and glfw together. (download, installation, first program). maybe broken, I tried to fix it without compiling. patches welcome (or maintainership). resolution with pixel scaling is borked. see replies for details
/* Note: this Google copyright notice only applies to the original file, which has large sections copy-pasted here. my changes are under CC0 (public domain).
* Copyright 2015 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/*
The official instructions don't work well. These alternative instructions are intended to be the shortest path to get a minimal setup running.
The Linux steps were run through successfully on October 2019.
The Windows steps are known to be broken; the broken part is Step 7. The Include and Library directories should be tweaked.
This was made by copy-pasting and fixing two sources: https://github.com/google/skia/tree/master/experimental/GLFWTest and https://gist.github.com/zester/5163313
Don't bother trying these two sources; neither of them works.
step 1: install glfw (on Linux, "sudo apt install libglfw3-dev" will get you an acceptable (and outdated) version. on Visual Studio 2017, you must build glfw from source, contrary to Internet claims that glfw's VS2015 pre-compiled version works.)
step 2: follow the Setting Up section at http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up
step 3: if you're in Windows, you will need a copy of bash; cmd.exe will fail in a later step. on my system, a copy of bash came with my installation of Git for Windows.
step 4: follow https://skia.org/user/download, using the "Clone the Skia repository" section only. Use Bash, even if you're on Windows. the Windows check "where python" is useful because sometimes python ends up in stupid places for stupid reasons
step 5: go to https://skia.org/user/build and look at the instructions, but don't follow them.
Move forward to either Windows step 6 or Linux step 6.
Windows step 6, Visual Studio 2017:
here is where bash is required, because cmd.exe doesn't allow single quotes, which are necessary to give the VC path. the various skia_use_foo commands are necessary to stop VS from erroring out when the headers are missing
run these two commands, replacing "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC" with your own VC directory:
gn gen out/Static --args='is_official_build=true win_vc="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC" skia_use_libpng=false skia_use_zlib=false skia_use_libwebp=false skia_enable_pdf=false skia_use_libjpeg_turbo=false skia_use_expat=false'
ninja -C out/Static
Windows step 7. Warning, this is outdated. The massive "FOLDER1\x" was changed to not be necessary, but I haven't tested the correct steps now:
add this file to a new VS project
append "FOLDER1\skia\include\core;FOLDER1\skia\include\gpu;FOLDER1\skia\include\config;FOLDER1\skia\include\utils;FOLDER2\glfw\include'" to the VC include directories of your project, where FOLDERX represents the directories you put them in.
you must include all 4 skia folders because the files inside skia folders assume they see the other folders.
if you're unfamiliar with how the include directory works, it's in Project->Properties, VC++ Directories, Include Directories.
append "FOLDER1\skia\out\Static;FOLDER2\glfw\src\Debug;" to Library Directories, again replacing FOLDERX with the true location. add "opengl32.lib;skia.lib;glfw3.lib;" to Linker->Input->Additional Dependencies
Set build mode to x64.
Build! This will produce a debug mode binary.
If in the future you want a release mode binary, you will need to re-build glfw in release mode, and change the glfw library folder to FOLDER2\glfw\src\Release;
Linux step 6, Ubuntu 19.04. October 18, 2019:
Run:
sudo apt install clang libjpeg-dev libicu-dev libwebp-dev
bin/gn gen out/Static --args='is_official_build=true cc="clang" cxx="clang++"'
ninja -C out/Static
Linux step 7:
download this file as "glfw_ship.cpp", and place it in the parent folder of the "skia" directory. (this just makes "-Iskia" in the right place)
g++ -g -std=c++1z glfw_ship.cpp -lskia -ldl -lpthread -ljpeg -lfreetype -lz -lpng -lglfw -lfontconfig -lwebp -lwebpmux -lwebpdemux -lGL -Iskia -Lskia/out/Static/
./a.out
eventually, you will want color-correct spaces, and there are 5 places below (Ctrl+F "enable correct color spaces"), where you should replace/uncomment lines to enable this.
warning: color-correct spaces don't work in VMWare, because mesa doesn't support it.
*/
#include "GLFW/glfw3.h"
#define SK_GL
#include "include/gpu/GrBackendSurface.h"
#include "include/gpu/GrDirectContext.h"
#include "include/gpu/gl/GrGLInterface.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkColorSpace.h"
#include "include/core/SkSurface.h"
#include <stdio.h>
#include <stdlib.h>
//uncomment the two lines below to enable correct color spaces
//#define GL_FRAMEBUFFER_SRGB 0x8DB9
//#define GL_SRGB8_ALPHA8 0x8C43
GrDirectContext* sContext = nullptr;
SkSurface* sSurface = nullptr;
void error_callback(int error, const char* description) {
fputs(description, stderr);
}
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
}
void init_skia(int w, int h) {
auto interface = GrGLMakeNativeInterface();
sContext = GrDirectContext::MakeGL(interface).release();
GrGLFramebufferInfo framebufferInfo;
framebufferInfo.fFBOID = 0; // assume default framebuffer
// We are always using OpenGL and we use RGBA8 internal format for both RGBA and BGRA configs in OpenGL.
//(replace line below with this one to enable correct color spaces) framebufferInfo.fFormat = GL_SRGB8_ALPHA8;
framebufferInfo.fFormat = GL_RGBA8;
SkColorType colorType = kRGBA_8888_SkColorType;
GrBackendRenderTarget backendRenderTarget(w, h,
0, // sample count
0, // stencil bits
framebufferInfo);
//(replace line below with this one to enable correct color spaces) sSurface = SkSurface::MakeFromBackendRenderTarget(sContext, backendRenderTarget, kBottomLeft_GrSurfaceOrigin, colorType, SkColorSpace::MakeSRGB(), nullptr).release();
sSurface = SkSurface::MakeFromBackendRenderTarget(sContext, backendRenderTarget, kBottomLeft_GrSurfaceOrigin, colorType, nullptr, nullptr).release();
if (sSurface == nullptr) abort();
}
void cleanup_skia() {
delete sSurface;
delete sContext;
}
const int kWidth = 960;
const int kHeight = 640;
int main(void) {
GLFWwindow* window;
glfwSetErrorCallback(error_callback);
if (!glfwInit()) {
exit(EXIT_FAILURE);
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//(uncomment to enable correct color spaces) glfwWindowHint(GLFW_SRGB_CAPABLE, GL_TRUE);
glfwWindowHint(GLFW_STENCIL_BITS, 0);
//glfwWindowHint(GLFW_ALPHA_BITS, 0);
glfwWindowHint(GLFW_DEPTH_BITS, 0);
window = glfwCreateWindow(kWidth, kHeight, "Simple example", NULL, NULL);
if (!window) {
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(window);
//(uncomment to enable correct color spaces) glEnable(GL_FRAMEBUFFER_SRGB);
init_skia(kWidth, kHeight);
glfwSwapInterval(1);
glfwSetKeyCallback(window, key_callback);
// Draw to the surface via its SkCanvas.
SkCanvas* canvas = sSurface->getCanvas(); // We don't manage this pointer's lifetime.
while (!glfwWindowShouldClose(window)) {
glfwWaitEvents();
SkPaint paint;
paint.setColor(SK_ColorWHITE);
canvas->drawPaint(paint);
paint.setColor(SK_ColorBLUE);
canvas->drawRect({100, 200, 300, 500}, paint);
sContext->flush();
glfwSwapBuffers(window);
}
cleanup_skia();
glfwDestroyWindow(window);
glfwTerminate();
exit(EXIT_SUCCESS);
}
@natanfudge

This comment has been minimized.

Copy link

@natanfudge natanfudge commented Oct 18, 2019

I get an error while building :/

/libs/skia\include/core/SkRefCnt.h:150:12: error: member access into incomplete type 'const GrGLInterface'
        obj->unref();

Fixed that by including GrGlInterface, now I get this:

skia.lib(gpu.GrGLMakeNativeInterface_win.obj) : error LNK2019: unresolved external symbol __imp_wglGetCurrentContext referenced in function "class sk_sp<struct GrGLInterface const > __cdecl GrGLMakeNativeInterface(void)" (?GrGLMakeNativeInterface@@YA?AV?$sk_sp@$$CBUGrGLInterface@@@@XZ)
skia.lib(gpu.GrGLMakeNativeInterface_win.obj) : error LNK2019: unresolved external symbol __imp_wglGetProcAddress referenced in function "class sk_sp<struct GrGLInterface const > __cdecl GrGLMakeNativeInterface(void)" (?GrGLMakeNativeInterface@@YA?AV?$sk_sp@$$CBUGrGLInterface@@@@XZ)

Edit: oops I didn't add opengl.lib

@ad8e

This comment has been minimized.

Copy link
Owner Author

@ad8e ad8e commented Oct 18, 2019

@natanfudge Thanks for the info! I'll step through the build process and update changes I find. The compiler info is almost certainly out of date as well; I think probably both stock clang and stock gcc should work (hopefully!).

@natanfudge

This comment has been minimized.

Copy link

@natanfudge natanfudge commented Oct 18, 2019

Dude, this gist saved me. I googled something completely unrelated and somehow got here. I’ve been trying to get Skia to work for 2 weeks and this was the only thing that did it!

@ad8e

This comment has been minimized.

Copy link
Owner Author

@ad8e ad8e commented Oct 18, 2019

I updated the Linux build thanks to @natanfudge. Google made the build process saner and changed some things. The best change is that Ubuntu's stock clang (version 8.0) works now, so no need to dig for exotic compiler builds.

@scott1717

This comment has been minimized.

Copy link

@scott1717 scott1717 commented Oct 20, 2019

I get an error while building on Windows:

C:\Development\skia\bin>ninja -C out/Static
ninja: Entering directory `out/Static'
[13/2662] copy ../../../third_party/externals/icu/common/icudtl.dat icudtl.dat
FAILED: icudtl.dat
python C:/Development/skia/gn/cp.py ../../../third_party/externals/icu/common/icudtl.dat icudtl.dat
CreateProcess failed: The system cannot find the file specified.
ninja: fatal: ReadFile: The handle is invalid.

I believe the file is in the correct spot. Any thoughts?

@natanfudge

This comment has been minimized.

Copy link

@natanfudge natanfudge commented Oct 20, 2019

Try verifying your python installation is valid (python -v). Mine was actually invalid when I started compiling.

@scott1717

This comment has been minimized.

Copy link

@scott1717 scott1717 commented Oct 20, 2019

Looks like everything is correct when I run that command. The python path is inside \depot_tools\bootstrap-3_8_0b1_chromium_1_bin\python.

@natanfudge

This comment has been minimized.

Copy link

@natanfudge natanfudge commented Oct 20, 2019

@scott1717 , you need to be in the root directory of the skia repository!

@ad8e

This comment has been minimized.

Copy link
Owner Author

@ad8e ad8e commented Oct 20, 2019

I tried the Windows build, but I got stuck in multiple places too. I received a mysterious "gn.py: Could not find checkout in any parent of the current path", even when working in the root directory and "git status" says everything is ok. Googling didn't produce any reasonable solutions, so I used "fetch skia" instead. That just gives me .sha1 files but not the files themselves, so I give up.

In these instructions, everything was derived by trial-and-error: the code, libraries, includes, compilers, shells, packages, and flags. The build process would error out, then I manually tweaked it until it progressed. Each parameter was earned by a failure and attempt, and there are about 30 such parameters. The ridiculous workarounds like clang nightlies and git bash are the remnants of great misery.

Now that it's broken again and my initial attempts to re-fix it failed, I'm feeling quite negative about skia. I don't believe that google tests its build process outside of its standard google machines, because it has been broken for years. Servo's Pathfinder may be a more suitable solution, intended for the general public.

@scott1717

This comment has been minimized.

Copy link

@scott1717 scott1717 commented Oct 21, 2019

It is unfortunate that Google hasn’t simplified the build process. That’s what gn was supposed to do. I’m going to delete everything and start from scratch. If I can’t get this to build soon then I’ll have to look into something else. Pathfinder sounds interesting. Thanks. I’ll keep watching this thread. Let us know if you can rebuild on Windows. I’ll also post here if I build it successfully.

@ZhenFTW

This comment has been minimized.

Copy link

@ZhenFTW ZhenFTW commented Dec 21, 2019

Add more example please!! Like draw image

@ZhenFTW

This comment has been minimized.

Copy link

@ZhenFTW ZhenFTW commented Dec 23, 2019

How do you combine opengl drawn 3d and skia?

@gavinliu

This comment has been minimized.

Copy link

@gavinliu gavinliu commented Aug 9, 2020

I have a question, why SkiaCanvas is not full screen ? How to fix it ?

image

@ad8e

This comment has been minimized.

Copy link
Owner Author

@ad8e ad8e commented Aug 9, 2020

It looks like your macOS has 2x DPI scaling, which the skia/glfw code doesn't know about. I have no idea how to fix it, since I'm not on a Mac. I think a fix would be universal and I would welcome a patch, since it seems every shipped software would need to take care of this problem.

@gavinliu

This comment has been minimized.

Copy link

@gavinliu gavinliu commented Aug 9, 2020

It looks like your macOS has 2x DPI scaling, which the skia/glfw code doesn't know about. I have no idea how to fix it, since I'm not on a Mac. I think a fix would be universal and I would welcome a patch, since it seems every shipped software would need to take care of this problem.

Yep, I turned off the zoom of the display and it was normal.

I found the relevant code in the SkiaSDLExample https://github.com/google/skia/blob/master/example/SkiaSDLExample.cpp#L240 , but I don't know what to do in glfw

@prakhar144

This comment has been minimized.

Copy link

@prakhar144 prakhar144 commented Sep 15, 2020

Doesn't work for me. I am getting following errors.

glfw_ship.cpp: In function ‘void init_skia(int, int)’:
glfw_ship.cpp:87:24: error: ‘MakeGL’ is not a member of ‘GrContext’
  sContext = GrContext::MakeGL(nullptr, options).release();
                        ^~~~~~
glfw_ship.cpp:96:6: error: ‘kRGBA_8888_GrPixelConfig’ was not declared in this scope
  if (kRGBA_8888_GrPixelConfig == kSkia8888_GrPixelConfig) {
      ^~~~~~~~~~~~~~~~~~~~~~~~
glfw_ship.cpp:96:6: note: suggested alternative: ‘kRGBA_8888_SkColorType’
  if (kRGBA_8888_GrPixelConfig == kSkia8888_GrPixelConfig) {
      ^~~~~~~~~~~~~~~~~~~~~~~~
      kRGBA_8888_SkColorType
glfw_ship.cpp:96:34: error: ‘kSkia8888_GrPixelConfig’ was not declared in this scope
  if (kRGBA_8888_GrPixelConfig == kSkia8888_GrPixelConfig) {
@Tremeschin

This comment has been minimized.

Copy link

@Tremeschin Tremeschin commented Sep 25, 2020

@prakhar144 You need to #define SK_GL before including GrContext.h for the GrContext::MakeGL to work, I'm not sure yet about those color spaces.. I'm still trying to link Skia with C++.. any updates I'll lyk and the others

@Tremeschin

This comment has been minimized.

Copy link

@Tremeschin Tremeschin commented Sep 25, 2020

@prakhar144 Hey I could compile, link and execute this file after doing this last comment I posted, building a shared library of skia and moving its libskia.so to /usr/lib/libskia.so (so it's always on LD_LIBRARY_PATH), then just add /usr/lib/libskia.so argument to the linker while compiling the C++ code :)

@prakhar144

This comment has been minimized.

Copy link

@prakhar144 prakhar144 commented Sep 25, 2020

@prakhar144 Hey I could compile, link and execute this file after doing this last comment I posted, building a shared library of skia and moving its libskia.so to /usr/lib/libskia.so (so it's always on LD_LIBRARY_PATH), then just add /usr/lib/libskia.so argument to the linker while compiling the C++ code :)

Cool, glad it worked for you. I will try it tomorrow again. Lets see how it goes.

@prakhar144

This comment has been minimized.

Copy link

@prakhar144 prakhar144 commented Oct 10, 2020

@prakhar144 You need to #define SK_GL before including GrContext.h for the GrContext::MakeGL to work, I'm not sure yet about those color spaces.. I'm still trying to link Skia with C++.. any updates I'll lyk and the others

Hi, Can you share the command you used to make this program work ? I created a makefile to make it work but unfortunately I lost it. It will also help people who land here in future.

@Tremeschin

This comment has been minimized.

Copy link

@Tremeschin Tremeschin commented Oct 10, 2020

@prakhar144 Here are the Skia related files I used, I'm kinda giving up on that project (this was an rewrite attempt of the original in Python) so not sure if I'll keep this repo, but basically I had to:

#define SK_GL // For GrContext::MakeGL
#include "GLFW/glfw3.h"

And on this gist that says..

if (kRGBA_8888_GrPixelConfig == kSkia8888_GrPixelConfig) {
    colorType = kRGBA_8888_SkColorType;
}
else {
    colorType = kBGRA_8888_SkColorType;
}

It was undefined one of the two color at the top so I manually set to only

color_type = kRGBA_8888_SkColorType;

(I'm not sure but I think Windows uses BGRA by default and Linux uses RGBA, at least on skia-python I had to change the pixel format of the FFmpeg piped video for it to render colors right)

Also to link Skia properly I moved its shared library build to /usr/lib/libskia.so and added this file to the global link arguments on Meson.

Sorry I'm a but inexperienced with C++ don't think I can really help any further :p

Also, I just noticed the formatting is a bit wrong, thank you tabs vs spaces lol; and I made this gist's code into a class there as I understand more this way.

@prakhar144

This comment has been minimized.

Copy link

@prakhar144 prakhar144 commented Oct 10, 2020

@prakhar144 Here are the Skia related files I used, I'm kinda giving up on that project (this was an rewrite attempt of the original in Python) so not sure if I'll keep this repo, but basically I had to:

#define SK_GL // For GrContext::MakeGL
#include "GLFW/glfw3.h"

And on this gist that says..

if (kRGBA_8888_GrPixelConfig == kSkia8888_GrPixelConfig) {
    colorType = kRGBA_8888_SkColorType;
}
else {
    colorType = kBGRA_8888_SkColorType;
}

It was undefined one of the two color at the top so I manually set to only

color_type = kRGBA_8888_SkColorType;

(I'm not sure but I think Windows uses BGRA by default and Linux uses RGBA, at least on skia-python I had to change the pixel format of the FFmpeg piped video for it to render colors right)

Also to link Skia properly I moved its shared library build to /usr/lib/libskia.so and added this file to the global link arguments on Meson.

Sorry I'm a but inexperienced with C++ don't think I can really help any further :p

Also, I just noticed the formatting is a bit wrong, thank you tabs vs spaces lol; and I made this gist's code into a class there as I understand more this way.

Yea that is pretty much it. Idk why its so hard to find working examples related to this library when its extensively used everywhere. I will myself create a complete tutorial once I am comfortable enough with basics of this library. Also, in the newer versions of skia they have changed the code and it looks like GrContext is no more inside include/gpu directory but in /include/private. Thanks

@Ard2148810

This comment has been minimized.

Copy link

@Ard2148810 Ard2148810 commented Nov 17, 2020

GrContext doesn't exist anymore and it's not in include/private neither. The name was changed to GrDirectContext. I forked it and updated here.

Thanks for tips in previous comments, it helped.

@tritao

This comment has been minimized.

Copy link

@tritao tritao commented Nov 18, 2020

The code provided did not work under macOS and led to crashing inside Skia.

Upon further inspection, and by using ASAN -fsanitize-address the cause becomes apparent:

==43003==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffee98f8060 at pc 0x00010845c5e8 bp 0x7ffee98f7a40 sp 0x7ffee98f71e0
READ of size 152 at 0x7ffee98f8060 thread T0
    #0 0x10845c5e7 in wrap_memcpy (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x1c5e7)
    #1 0x106a1598e in GrContextThreadSafeProxy::GrContextThreadSafeProxy(GrBackendApi, GrContextOptions const&) GrContextThreadSafeProxy.cpp:35
    #2 0x106a15c82 in GrContextThreadSafeProxy::GrContextThreadSafeProxy(GrBackendApi, GrContextOptions const&) GrContextThreadSafeProxy.cpp:35
    #3 0x106a173cc in GrContextThreadSafeProxyPriv::Make(GrBackendApi, GrContextOptions const&) GrContextThreadSafeProxy.cpp:167
    #4 0x106a20695 in GrDirectContext::GrDirectContext(GrBackendApi, GrContextOptions const&) GrDirectContext.cpp:54
    #5 0x106a20d12 in GrDirectContext::GrDirectContext(GrBackendApi, GrContextOptions const&) GrDirectContext.cpp:54
    #6 0x106a2964b in GrDirectContext::MakeGL(sk_sp<GrGLInterface const>, GrContextOptions const&) GrDirectContext.cpp:905
    #7 0x106308daa in init_skia(int, int) glfw_ship.cpp:85
    #8 0x1063096f7 in main glfw_ship.cpp:146
    #9 0x7fff7b697014 in start (libdyld.dylib:x86_64+0x1014)

Address 0x7ffee98f8060 is located in stack of thread T0 at offset 1

I got it to work like this:

-       GrContextOptions options;
-       //options.fRequireDecodeDisableForSRGB = false; //was removed?
-       sContext = GrDirectContext::MakeGL(nullptr, options).release();
+       auto interface = GrGLMakeNativeInterface();
+       sContext = GrDirectContext::MakeGL(interface).release();

However there are still some issues, when the window is first shown, the blue rectangle inside is pretty small, and only after the mouse moves (does not even need to be over the window) does it go to the correct size.

On Linux everything works like expected. Any idea what it could be? Some kind of DPI issue maybe?

@RyanAfrish7

This comment has been minimized.

Copy link

@RyanAfrish7 RyanAfrish7 commented Dec 28, 2020

auto interface = GrGLMakeNativeInterface();

After this, I get a null for interface and GrDirectContext::MakeGL is returning another null. Any hints?

@stevenlstarr

This comment has been minimized.

Copy link

@stevenlstarr stevenlstarr commented Mar 22, 2021

Crazy to think I started this gist 8 years ago https://gist.github.com/zester/5163313 and I only ever got it to work once in glfw and once in sfml until google made changes to the build system and it never worked properly again.

@ad8e

This comment has been minimized.

Copy link
Owner Author

@ad8e ad8e commented Mar 22, 2021

That's amusing, and I'm in the same boat. My gist too is in a state of disrepair and doesn't work. I'm lucky I don't need skia anymore.

With cairo obsolete and pathfinder being unmaintained, skia is now the premier spline rendering middleware. The in-tree SDL2 version was still being maintained when I last checked 2 years ago, so it's probably the way forward for an initial bootstrap. I generally prefer glfw because it's lighter, but skia is already 8 MB, so SDL2's 1 MB may be acceptable. It's probably a better (easier) bootstrap.

@qsyttkx

This comment has been minimized.

Copy link

@qsyttkx qsyttkx commented Mar 23, 2021

Worked for me

I compiled skia to a static library, on linux mint.

Now skia(master branch, Sun Mar 21 2021) replaced GrContext with GrDirectContext so we need to change the header and class name.

  1. define SK_GL before include
  2. set colorType as kRGBA_8888_SkColorType manually
  3. replace GrContext
  4. build

2021-03-23 22-13-12screenshot

@ad8e

This comment has been minimized.

Copy link
Owner Author

@ad8e ad8e commented Mar 23, 2021

I tried to incorporate all the suggested changes. I haven't tried to compile so it might not work!

  1. BGRA detection now removed, as suggested by Tremeschin. I don't know if it's correct to assume that it's always RGBA, but at least with an OpenGL-only backend, I can't imagine channel ordering becoming a problem.
  2. GrContextOptions replaced by GrGLMakeNativeInterface, as suggested by tritao. Maybe some people might need options, but maybe the bootstrap doesn't.

High DPI probably still not working.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment