Yeah, this is probably problem them, I've asked before what gpu state skia touches was wasn't able to get an answer. I guess I can make a list of drawing commands instead of executing them
Here's a simplified version of the init code that always assumes the gpu backend, it's kinda hacked together from various SDL and opengl examples, I don't know if there's official up-to-date instructions for the gpu backend:
void resetSkia(Vec2 size, Vec2 scale, bool useGpu, int msaaSamples) {
if (!skiaSys) {
SkGraphics::Init();
skiaSys = (SkiaSys *)zalloc(sizeof(SkiaSys));
}
skiaSys->width = size.x;
skiaSys->height = size.y;
skiaSys->scale = scale;
skiaSys->useGpu = useGpu;
if (skiaSys->backTexture) destroyTexture(skiaSys->backTexture);
skiaSys->backTexture = createTexture(skiaSys->width, skiaSys->height);
if (skiaSys->gpuSurface) {
delete skiaSys->gpuSurface;
skiaSys->gpuSurface = NULL;
}
if (!skiaSys->grInterface) {
sk_sp<const GrGLInterface> grInterface = GrGLMakeNativeInterface();
if (!grInterface || !grInterface.get()) logf("NULL native interface\n");
skiaSys->grInterface = grInterface.release();
}
if (!skiaSys->grDirectContext) {
sk_sp<GrDirectContext> grDirectContext = GrDirectContext::MakeGL();
if (!grDirectContext || !grDirectContext.get()) logf("Failed to create grDirectContext\n");
skiaSys->grDirectContext = grDirectContext.release();
}
if (!skiaSys->flatFramebuffer) skiaSys->flatFramebuffer = createFramebuffer();
setColorAttachment(skiaSys->flatFramebuffer, skiaSys->backTexture, 0);
if (!skiaSys->multiSampleFramebuffer) skiaSys->multiSampleFramebuffer = createFramebuffer();
glBindFramebuffer(GL_FRAMEBUFFER, skiaSys->multiSampleFramebuffer);
if (skiaSys->msaaColorRenderbuffer) glDeleteRenderbuffers(1, &skiaSys->msaaColorRenderbuffer);
glGenRenderbuffers(1, &skiaSys->msaaColorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, skiaSys->msaaColorRenderbuffer);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaaSamples, GL_RGBA8, skiaSys->width, skiaSys->height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, skiaSys->msaaColorRenderbuffer);
if (skiaSys->msaaDepthRenderbuffer) glDeleteRenderbuffers(1, &skiaSys->msaaDepthRenderbuffer);
glGenRenderbuffers(1, &skiaSys->msaaDepthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, skiaSys->msaaDepthRenderbuffer);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaaSamples, GL_DEPTH24_STENCIL8, skiaSys->width, skiaSys->height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, skiaSys->msaaDepthRenderbuffer);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) logf("Bad fb\n");
glBindFramebuffer(GL_FRAMEBUFFER, skiaSys->multiSampleFramebuffer);
GrGLFramebufferInfo framebufferInfo;
framebufferInfo.fFBOID = skiaSys->multiSampleFramebuffer->id;
framebufferInfo.fFormat = GL_RGBA8;
GrBackendRenderTarget backendRenderTarget(
skiaSys->width,
skiaSys->height,
msaaSamples,
8, // stencil bits
framebufferInfo
);
SkSurfaceProps surfaceProps(0, SkPixelGeometry::kUnknown_SkPixelGeometry);
skiaSys->gpuSurface = SkSurface::MakeFromBackendRenderTarget(
skiaSys->grDirectContext,
backendRenderTarget,
kBottomLeft_GrSurfaceOrigin,
kRGBA_8888_SkColorType,
NULL,
&surfaceProps
).release();
if (!skiaSys->gpuSurface) {
if (msaaSamples == 16) {
logf("Failed to create skia MSAA surface, falling back\n");
resetSkia(size, scale, true, 8);
} else if (msaaSamples == 8) {
logf("Failed to create skia MSAA surface, falling back\n");
resetSkia(size, scale, true, 4);
} else if (msaaSamples == 4) {
logf("Failed to create skia MSAA surface, falling back\n");
resetSkia(size, scale, true, 2);
} else if (msaaSamples == 2) {
logf("Failed to create skia MSAA surface, falling back\n");
resetSkia(size, scale, true, 0);
} else {
logf("Failed to create skia GPU surface, falling back\n");
resetSkia(size, scale, false, 0); // This would take a cpu branch, which is omitted but always works
}
return;
}
skiaSys->mainCanvas = skiaSys->gpuSurface->getCanvas();
if (!skiaSys->mainCanvas) logf("Failed to create skia canvas\n");
}