AHardwareBuffer* dvrHwcFrameGetLayerBuffer(DvrHwcFrame* frame, size_t layer_index) { AHardwareBuffer* buffer = android::AHardwareBuffer_from_GraphicBuffer( frame->frame.layers[layer_index].buffer.get()); AHardwareBuffer_acquire(buffer); return buffer; }
GrAHardwareBufferImageGenerator::GrAHardwareBufferImageGenerator(const SkImageInfo& info, AHardwareBuffer* hardwareBuffer, SkAlphaType alphaType, bool isProtectedContent, uint32_t bufferFormat, GrSurfaceOrigin surfaceOrigin) : INHERITED(info) , fHardwareBuffer(hardwareBuffer) , fBufferFormat(bufferFormat) , fIsProtectedContent(isProtectedContent) , fSurfaceOrigin(surfaceOrigin) { AHardwareBuffer_acquire(fHardwareBuffer); }
sk_sp<GrTextureProxy> GrAHardwareBufferImageGenerator::makeProxy(GrContext* context) { if (context->abandoned()) { return nullptr; } GrPixelConfig pixelConfig; GrBackendFormat backendFormat = get_backend_format(context->contextPriv().getBackend(), fBufferFormat); if (!context->contextPriv().caps()->getConfigFromBackendFormat( backendFormat, this->getInfo().colorType(), &pixelConfig)) { return nullptr; } int width = this->getInfo().width(); int height = this->getInfo().height(); GrSurfaceDesc desc; desc.fWidth = width; desc.fHeight = height; desc.fConfig = pixelConfig; GrTextureType textureType = GrTextureType::k2D; if (context->contextPriv().getBackend() == kOpenGL_GrBackend) { textureType = GrTextureType::kExternal; } auto proxyProvider = context->contextPriv().proxyProvider(); AHardwareBuffer* hardwareBuffer = fHardwareBuffer; AHardwareBuffer_acquire(hardwareBuffer); const bool isProtectedContent = fIsProtectedContent; sk_sp<GrTextureProxy> texProxy = proxyProvider->createLazyProxy( [context, hardwareBuffer, width, height, pixelConfig, isProtectedContent, backendFormat] (GrResourceProvider* resourceProvider) { if (!resourceProvider) { AHardwareBuffer_release(hardwareBuffer); return sk_sp<GrTexture>(); } DeleteImageProc deleteImageProc = nullptr; DeleteImageCtx deleteImageCtx = nullptr; GrBackendTexture backendTex = make_backend_texture(context, hardwareBuffer, width, height, pixelConfig, &deleteImageProc, &deleteImageCtx, isProtectedContent, backendFormat); if (!backendTex.isValid()) { return sk_sp<GrTexture>(); } SkASSERT(deleteImageProc && deleteImageCtx); backendTex.fConfig = pixelConfig; sk_sp<GrTexture> tex = resourceProvider->wrapBackendTexture(backendTex); if (!tex) { deleteImageProc(deleteImageCtx); return sk_sp<GrTexture>(); } if (deleteImageProc) { sk_sp<GrReleaseProcHelper> releaseProcHelper( new GrReleaseProcHelper(deleteImageProc, deleteImageCtx)); tex->setRelease(releaseProcHelper); } return tex; }, desc, fSurfaceOrigin, GrMipMapped::kNo, textureType, SkBackingFit::kExact, SkBudgeted::kNo); if (!texProxy) { AHardwareBuffer_release(hardwareBuffer); } return texProxy; }