2017-02-07 3 views
0

Можно ли добавить OpenGL в UIWindow и использовать Skia для рисования на нем?Как использовать ускоренный SkCanvas с графическим процессором в обычном приложении iOS (на основе UIWindow)?

Я нашел пример, где мы инициализируем такой вид:

- (void)initialize { 
    CAEAGLLayer* layer = (CAEAGLLayer*)self.layer; 

    layer.opaque = NO; 
    layer.drawableProperties = @{kEAGLDrawablePropertyRetainedBacking: @(NO), 
            kEAGLDrawablePropertyColorFormat: kEAGLColorFormatRGBA8}; 

    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 
     if (!self.context || ![EAGLContext setCurrentContext:self.context]) 
     NSLog(@"Cannot create EAGLContext!"); 

    GLuint framebuffer; 
    GLuint renderbuffer; 
    glGenFramebuffers(1, &framebuffer); 
    glGenRenderbuffers(1, &renderbuffer); 
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); 
    glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer); 

    [self.context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)layer]; 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer); 

    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
    if (status != GL_FRAMEBUFFER_COMPLETE) 
     NSLog(@"Failed to make complete frame buffer: %x", status); 

    CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(drawFrame:)]; 
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
} 

- (void)drawFrame:(CADisplayLink*)sender { 
    glClearColor(1.0, 0.0, 0.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    [self.context presentRenderbuffer:GL_RENDERBUFFER]; 
} 

Красный фон рисуется, но я не могу заставить Skia работать с этой точкой зрения.

Мой Skia код:

const GrGLInterface* glInterface = GrGLCreateNativeInterface(); 
NSAssert(glInterface->validate(), nil); 

GrContextOptions contextOptions; 
GrContext* grContext = GrContext::Create(kOpenGL_GrBackend, (intptr_t)glInterface, contextOptions); 
sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named); 

GrBackendRenderTargetDesc grBackendRenderTargetDesc; 

// This is GLuint framebuffer value from view setup code above. 
grBackendRenderTargetDesc.fRenderTargetHandle = self.framebufferID; 

grBackendRenderTargetDesc.fWidth = self.rboWidth; 
grBackendRenderTargetDesc.fHeight = self.rboHeight; 
grBackendRenderTargetDesc.fConfig = kRGBA_8888_GrPixelConfig; 
grBackendRenderTargetDesc.fOrigin = kTopLeft_GrSurfaceOrigin; 
grBackendRenderTargetDesc.fSampleCnt = 0; 
grBackendRenderTargetDesc.fStencilBits = 0; 

SkSurfaceProps skSurfaceProps(0, kUnknown_SkPixelGeometry); 
sk_sp<SkSurface> skSurface = SkSurface::MakeFromBackendRenderTarget(grContext, grBackendRenderTargetDesc, &skSurfaceProps); 

if (skSurface) 
{ 
    skCanvas = skSurface->getCanvas(); 

    SkPaint paint; 
    paint.setColor(SK_ColorGREEN); 
    skCanvas->drawPaint(paint); 
} 

Когда я помещаю холст сделать код в [... drawFrame:] перед [self.context presentRenderbuffer: GL_RENDERBUFFER], это ничего не сделать.

Что мне не хватает? Как мне связать SkSurface/SkCanvas с данным EAGLContext и как я должен называть код рисования skia, чтобы правильно работать?

ответ

0

Он работает, как ожидалось, когда я звоню

skSurface->prepareForExternalIO() 

после всего Skia рисунок кода и, прежде чем я называю

[self.context presentRenderbuffer:GL_RENDERBUFFER]; 
Смежные вопросы