diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp index 79bb534a99be0..270527d551a9e 100644 --- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp @@ -297,6 +297,26 @@ private: GLuint mTexture = 0; }; +static bool isFP16Supported(const sk_sp& grContext) { + static std::once_flag sOnceFlag; + static bool supported = false; + + std::call_once(sOnceFlag, [](const sk_sp& grContext) { + if (!grContext->caps()->isConfigTexturable(kRGBA_half_GrPixelConfig)) { + supported = false; + return; + } + + sp buffer = new GraphicBuffer(1, 1, PIXEL_FORMAT_RGBA_FP16, + GraphicBuffer::USAGE_HW_TEXTURE | GraphicBuffer::USAGE_SW_WRITE_NEVER | + GraphicBuffer::USAGE_SW_READ_NEVER, "tempFp16Buffer"); + status_t error = buffer->initCheck(); + supported = !error; + }, grContext); + + return supported; +} + sk_sp SkiaOpenGLPipeline::allocateHardwareBitmap(renderthread::RenderThread& renderThread, SkBitmap& skBitmap) { renderThread.eglManager().initialize(); @@ -318,7 +338,7 @@ sk_sp SkiaOpenGLPipeline::allocateHardwareBitmap(renderthread::RenderThr type = GL_UNSIGNED_BYTE; break; case kRGBA_F16_SkColorType: - isSupported = grContext->caps()->isConfigTexturable(kRGBA_half_GrPixelConfig); + isSupported = isFP16Supported(grContext); if (isSupported) { type = GL_HALF_FLOAT; pixelFormat = PIXEL_FORMAT_RGBA_FP16;