Verify gralloc supports fp16

Bug: 77973662
Test: builds
Change-Id: Id8a53885178d698c7b2fd6fc5ea8d4e36ce2ef15
This commit is contained in:
John Reck
2018-05-07 08:14:14 -07:00
parent 9e29859d2e
commit 437f6fb15c

View File

@@ -29,8 +29,8 @@
#include "utils/TraceUtils.h"
#include <GrBackendSurface.h>
#include <SkImageInfo.h>
#include <SkBlendMode.h>
#include <SkImageInfo.h>
#include <cutils/properties.h>
#include <strings.h>
@@ -63,8 +63,7 @@ Frame SkiaOpenGLPipeline::getFrame() {
bool SkiaOpenGLPipeline::draw(const Frame& frame, const SkRect& screenDirty, const SkRect& dirty,
const LightGeometry& lightGeometry,
LayerUpdateQueue* layerUpdateQueue, const Rect& contentDrawBounds,
bool opaque, bool wideColorGamut,
const LightInfo& lightInfo,
bool opaque, bool wideColorGamut, const LightInfo& lightInfo,
const std::vector<sp<RenderNode>>& renderNodes,
FrameInfoVisualizer* profiler) {
mEglManager.damageFrame(frame, dirty);
@@ -151,8 +150,8 @@ bool SkiaOpenGLPipeline::copyLayerInto(DeferredLayerUpdater* deferredLayer, SkBi
if (!tmpSurface.get()) {
surfaceInfo = surfaceInfo.makeColorType(SkColorType::kN32_SkColorType);
tmpSurface = SkSurface::MakeRenderTarget(mRenderThread.getGrContext(),
SkBudgeted::kYes, surfaceInfo);
tmpSurface = SkSurface::MakeRenderTarget(mRenderThread.getGrContext(), SkBudgeted::kYes,
surfaceInfo);
if (!tmpSurface.get()) {
ALOGW("Unable to readback GPU contents into the provided bitmap");
return false;
@@ -172,11 +171,10 @@ bool SkiaOpenGLPipeline::copyLayerInto(DeferredLayerUpdater* deferredLayer, SkBi
// if we fail to readback from the GPU directly (e.g. 565) then we attempt to read into 8888
// and then draw that into the destination format before giving up.
SkBitmap tmpBitmap;
SkImageInfo bitmapInfo = SkImageInfo::MakeN32(bitmap->width(), bitmap->height(),
bitmap->alphaType());
SkImageInfo bitmapInfo =
SkImageInfo::MakeN32(bitmap->width(), bitmap->height(), bitmap->alphaType());
if (tmpBitmap.tryAllocPixels(bitmapInfo) &&
tmpImage->readPixels(bitmapInfo, tmpBitmap.getPixels(),
tmpBitmap.rowBytes(), 0, 0)) {
tmpImage->readPixels(bitmapInfo, tmpBitmap.getPixels(), tmpBitmap.rowBytes(), 0, 0)) {
SkCanvas canvas(*bitmap);
SkPaint paint;
paint.setBlendMode(SkBlendMode::kSrc);
@@ -190,7 +188,8 @@ bool SkiaOpenGLPipeline::copyLayerInto(DeferredLayerUpdater* deferredLayer, SkBi
}
static Layer* createLayer(RenderState& renderState, uint32_t layerWidth, uint32_t layerHeight,
sk_sp<SkColorFilter> colorFilter, int alpha, SkBlendMode mode, bool blend) {
sk_sp<SkColorFilter> colorFilter, int alpha, SkBlendMode mode,
bool blend) {
GlLayer* layer =
new GlLayer(renderState, layerWidth, layerHeight, colorFilter, alpha, mode, blend);
layer->generateTexture();
@@ -288,7 +287,6 @@ private:
};
struct FormatInfo {
PixelFormat pixelFormat;
GLint format, type;
bool isSupported = false;
@@ -299,7 +297,16 @@ static bool gpuSupportsHalfFloatTextures(renderthread::RenderThread& renderThrea
static bool isSupported = renderThread.queue().runSync([&renderThread]() -> bool {
renderThread.requireGlContext();
sk_sp<GrContext> grContext = sk_ref_sp(renderThread.getGrContext());
return grContext->colorTypeSupportedAsImage(kRGBA_F16_SkColorType);
if (!grContext->colorTypeSupportedAsImage(kRGBA_F16_SkColorType)) {
return false;
}
sp<GraphicBuffer> 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();
return error != OK;
});
return isSupported;
}