Merge "Revert "Fix recent apps in system UI for Skia pipeline"" into oc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
9363d33262
@@ -60,17 +60,14 @@ static void Shader_safeUnref(JNIEnv* env, jobject o, jlong shaderHandle) {
|
|||||||
static jlong BitmapShader_constructor(JNIEnv* env, jobject o, jlong matrixPtr, jobject jbitmap,
|
static jlong BitmapShader_constructor(JNIEnv* env, jobject o, jlong matrixPtr, jobject jbitmap,
|
||||||
jint tileModeX, jint tileModeY) {
|
jint tileModeX, jint tileModeY) {
|
||||||
const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
|
const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
|
||||||
sk_sp<SkImage> image;
|
SkBitmap bitmap;
|
||||||
if (jbitmap) {
|
if (jbitmap) {
|
||||||
// Only pass a valid SkBitmap object to the constructor if the Bitmap exists. Otherwise,
|
// Only pass a valid SkBitmap object to the constructor if the Bitmap exists. Otherwise,
|
||||||
// we'll pass an empty SkBitmap to avoid crashing/excepting for compatibility.
|
// we'll pass an empty SkBitmap to avoid crashing/excepting for compatibility.
|
||||||
image = android::bitmap::toBitmap(env, jbitmap).makeImage(nullptr);
|
android::bitmap::toBitmap(env, jbitmap).getSkBitmapForShaders(&bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!image.get()) {
|
sk_sp<SkImage> image = SkMakeImageFromRasterBitmap(bitmap, kNever_SkCopyPixelsMode);
|
||||||
SkBitmap bitmap;
|
|
||||||
image = SkMakeImageFromRasterBitmap(bitmap, kNever_SkCopyPixelsMode);
|
|
||||||
}
|
|
||||||
sk_sp<SkShader> baseShader = image->makeShader(
|
sk_sp<SkShader> baseShader = image->makeShader(
|
||||||
(SkShader::TileMode)tileModeX, (SkShader::TileMode)tileModeY);
|
(SkShader::TileMode)tileModeX, (SkShader::TileMode)tileModeY);
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,6 @@
|
|||||||
#include "Bitmap.h"
|
#include "Bitmap.h"
|
||||||
|
|
||||||
#include "Caches.h"
|
#include "Caches.h"
|
||||||
#include "pipeline/skia/SkiaOpenGLPipeline.h"
|
|
||||||
#include "renderthread/EglManager.h"
|
#include "renderthread/EglManager.h"
|
||||||
#include "renderthread/RenderThread.h"
|
#include "renderthread/RenderThread.h"
|
||||||
#include "renderthread/RenderProxy.h"
|
#include "renderthread/RenderProxy.h"
|
||||||
@@ -35,15 +34,11 @@
|
|||||||
#include <private/gui/ComposerService.h>
|
#include <private/gui/ComposerService.h>
|
||||||
#include <binder/IServiceManager.h>
|
#include <binder/IServiceManager.h>
|
||||||
#include <ui/PixelFormat.h>
|
#include <ui/PixelFormat.h>
|
||||||
#include <GrTexture.h>
|
|
||||||
|
|
||||||
#include <SkCanvas.h>
|
#include <SkCanvas.h>
|
||||||
#include <SkImagePriv.h>
|
|
||||||
|
|
||||||
namespace android {
|
namespace android {
|
||||||
|
|
||||||
Mutex Bitmap::gLock;
|
|
||||||
|
|
||||||
static bool computeAllocationSize(size_t rowBytes, int height, size_t* size) {
|
static bool computeAllocationSize(size_t rowBytes, int height, size_t* size) {
|
||||||
int32_t rowBytes32 = SkToS32(rowBytes);
|
int32_t rowBytes32 = SkToS32(rowBytes);
|
||||||
int64_t bigSize = (int64_t) height * rowBytes32;
|
int64_t bigSize = (int64_t) height * rowBytes32;
|
||||||
@@ -322,7 +317,8 @@ sk_sp<Bitmap> Bitmap::createFrom(sp<GraphicBuffer> graphicBuffer) {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
SkImageInfo info = SkImageInfo::Make(graphicBuffer->getWidth(), graphicBuffer->getHeight(),
|
SkImageInfo info = SkImageInfo::Make(graphicBuffer->getWidth(), graphicBuffer->getHeight(),
|
||||||
kRGBA_8888_SkColorType, kPremul_SkAlphaType, SkColorSpace::MakeSRGB());
|
kRGBA_8888_SkColorType, kPremul_SkAlphaType,
|
||||||
|
SkColorSpace::MakeSRGB());
|
||||||
return sk_sp<Bitmap>(new Bitmap(graphicBuffer.get(), info));
|
return sk_sp<Bitmap>(new Bitmap(graphicBuffer.get(), info));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -397,7 +393,6 @@ Bitmap::Bitmap(GraphicBuffer* buffer, const SkImageInfo& info)
|
|||||||
mPixelStorage.hardware.buffer = buffer;
|
mPixelStorage.hardware.buffer = buffer;
|
||||||
buffer->incStrong(buffer);
|
buffer->incStrong(buffer);
|
||||||
mRowBytes = bytesPerPixel(buffer->getPixelFormat()) * buffer->getStride();
|
mRowBytes = bytesPerPixel(buffer->getPixelFormat()) * buffer->getStride();
|
||||||
setImmutable(); // HW bitmaps are always immutable
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Bitmap::~Bitmap() {
|
Bitmap::~Bitmap() {
|
||||||
@@ -491,13 +486,7 @@ void Bitmap::setAlphaType(SkAlphaType alphaType) {
|
|||||||
void Bitmap::getSkBitmap(SkBitmap* outBitmap) {
|
void Bitmap::getSkBitmap(SkBitmap* outBitmap) {
|
||||||
outBitmap->setHasHardwareMipMap(mHasHardwareMipMap);
|
outBitmap->setHasHardwareMipMap(mHasHardwareMipMap);
|
||||||
if (isHardware()) {
|
if (isHardware()) {
|
||||||
if (uirenderer::Properties::isSkiaEnabled()) {
|
outBitmap->allocPixels(info());
|
||||||
// TODO: add color correctness for Skia pipeline - pass null color space for now
|
|
||||||
outBitmap->allocPixels(SkImageInfo::Make(info().width(), info().height(),
|
|
||||||
info().colorType(), info().alphaType(), nullptr));
|
|
||||||
} else {
|
|
||||||
outBitmap->allocPixels(info());
|
|
||||||
}
|
|
||||||
uirenderer::renderthread::RenderProxy::copyGraphicBufferInto(graphicBuffer(), outBitmap);
|
uirenderer::renderthread::RenderProxy::copyGraphicBufferInto(graphicBuffer(), outBitmap);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -523,28 +512,4 @@ GraphicBuffer* Bitmap::graphicBuffer() {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
sk_sp<SkImage> Bitmap::makeImage(const uirenderer::renderthread::RenderThread* renderThread) {
|
|
||||||
AutoMutex _lock(gLock); //TODO: implement lock free solution
|
|
||||||
auto image = mImage;
|
|
||||||
//TODO: use new API SkImage::isValid() instead of SkImage::getTexture()->getContext()
|
|
||||||
if (!image.get() || (image->getTexture() && nullptr == image->getTexture()->getContext())) {
|
|
||||||
if (isHardware() && uirenderer::RenderPipelineType::SkiaGL
|
|
||||||
== uirenderer::Properties::getRenderPipelineType()) {
|
|
||||||
//TODO: add Vulkan support
|
|
||||||
if (renderThread) {
|
|
||||||
image = uirenderer::skiapipeline::SkiaOpenGLPipeline::makeTextureImage(
|
|
||||||
*renderThread, this);
|
|
||||||
} else {
|
|
||||||
image = uirenderer::renderthread::RenderProxy::makeTextureImage(this);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
SkBitmap skiaBitmap;
|
|
||||||
getSkBitmapForShaders(&skiaBitmap);
|
|
||||||
image = SkMakeImageFromRasterBitmap(skiaBitmap, kNever_SkCopyPixelsMode);
|
|
||||||
}
|
|
||||||
mImage = image;
|
|
||||||
}
|
|
||||||
return image;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace android
|
} // namespace android
|
||||||
|
|||||||
@@ -22,8 +22,6 @@
|
|||||||
#include <SkPixelRef.h>
|
#include <SkPixelRef.h>
|
||||||
#include <cutils/compiler.h>
|
#include <cutils/compiler.h>
|
||||||
#include <ui/GraphicBuffer.h>
|
#include <ui/GraphicBuffer.h>
|
||||||
#include <utils/Mutex.h>
|
|
||||||
#include <SkImage.h>
|
|
||||||
|
|
||||||
namespace android {
|
namespace android {
|
||||||
|
|
||||||
@@ -113,13 +111,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
GraphicBuffer* graphicBuffer();
|
GraphicBuffer* graphicBuffer();
|
||||||
|
|
||||||
// makeImage creates or returns a cached SkImage. Can be invoked from UI or render thread.
|
|
||||||
// If invoked on the render thread, then RenderThread* argument is required.
|
|
||||||
// If not invoked on the render thread, then RenderThread* must be nullptr.
|
|
||||||
// makeImage is wrapping a gralloc buffer with an EGLImage and is passing a texture to Skia.
|
|
||||||
// This is a temporary implementation until Skia can wrap the gralloc buffer in a SkImage.
|
|
||||||
sk_sp<SkImage> makeImage(const uirenderer::renderthread::RenderThread*);
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool onNewLockPixels(LockRec* rec) override;
|
virtual bool onNewLockPixels(LockRec* rec) override;
|
||||||
virtual void onUnlockPixels() override { };
|
virtual void onUnlockPixels() override { };
|
||||||
@@ -154,9 +145,6 @@ private:
|
|||||||
GraphicBuffer* buffer;
|
GraphicBuffer* buffer;
|
||||||
} hardware;
|
} hardware;
|
||||||
} mPixelStorage;
|
} mPixelStorage;
|
||||||
|
|
||||||
sk_sp<SkImage> mImage;
|
|
||||||
static Mutex gLock;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} //namespace android
|
} //namespace android
|
||||||
@@ -28,8 +28,6 @@
|
|||||||
|
|
||||||
#include <cutils/properties.h>
|
#include <cutils/properties.h>
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
#include <SkImagePriv.h>
|
|
||||||
#include <gl/GrGLTypes.h>
|
|
||||||
|
|
||||||
using namespace android::uirenderer::renderthread;
|
using namespace android::uirenderer::renderthread;
|
||||||
|
|
||||||
@@ -199,87 +197,6 @@ void SkiaOpenGLPipeline::invokeFunctor(const RenderThread& thread, Functor* func
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void deleteImageTexture(void* context) {
|
|
||||||
EGLImageKHR EGLimage = reinterpret_cast<EGLImageKHR>(context);
|
|
||||||
if (EGLimage != EGL_NO_IMAGE_KHR) {
|
|
||||||
EGLDisplay display = eglGetCurrentDisplay();
|
|
||||||
if (EGL_NO_DISPLAY == display) {
|
|
||||||
display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
|
||||||
}
|
|
||||||
eglDestroyImageKHR(display, EGLimage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sk_sp<SkImage> SkiaOpenGLPipeline::makeTextureImage(
|
|
||||||
const uirenderer::renderthread::RenderThread& renderThread, Bitmap* bitmap) {
|
|
||||||
renderThread.eglManager().initialize();
|
|
||||||
|
|
||||||
GraphicBuffer* buffer = bitmap->graphicBuffer();
|
|
||||||
EGLDisplay display = eglGetCurrentDisplay();
|
|
||||||
if (EGL_NO_DISPLAY == display) {
|
|
||||||
display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
|
||||||
}
|
|
||||||
LOG_ALWAYS_FATAL_IF(!bitmap->isHardware(),
|
|
||||||
"Texture image requires a HW bitmap.");
|
|
||||||
// We use an EGLImage to access the content of the GraphicBuffer
|
|
||||||
// The EGL image is later bound to a 2D texture
|
|
||||||
EGLClientBuffer clientBuffer = (EGLClientBuffer) buffer->getNativeBuffer();
|
|
||||||
EGLint imageAttrs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE };
|
|
||||||
EGLImageKHR EGLimage = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
|
|
||||||
clientBuffer, imageAttrs);
|
|
||||||
if (EGLimage == EGL_NO_IMAGE_KHR) {
|
|
||||||
ALOGW("Could not create EGL image, err =%s",
|
|
||||||
uirenderer::renderthread::EglManager::eglErrorString());
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
GLuint textureId = 0;
|
|
||||||
glGenTextures(1, &textureId);
|
|
||||||
glBindTexture(GL_TEXTURE_EXTERNAL_OES, textureId);
|
|
||||||
glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, EGLimage);
|
|
||||||
|
|
||||||
GLenum status = GL_NO_ERROR;
|
|
||||||
while ((status = glGetError()) != GL_NO_ERROR) {
|
|
||||||
ALOGW("glEGLImageTargetTexture2DOES failed (%#x)", status);
|
|
||||||
eglDestroyImageKHR(display, EGLimage);
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
sk_sp<GrContext> grContext = sk_ref_sp(renderThread.getGrContext());
|
|
||||||
grContext->resetContext();
|
|
||||||
|
|
||||||
GrGLTextureInfo textureInfo;
|
|
||||||
textureInfo.fTarget = GL_TEXTURE_EXTERNAL_OES;
|
|
||||||
textureInfo.fID = textureId;
|
|
||||||
|
|
||||||
GrBackendTextureDesc textureDescription;
|
|
||||||
textureDescription.fWidth = bitmap->info().width();
|
|
||||||
textureDescription.fHeight = bitmap->info().height();
|
|
||||||
textureDescription.fOrigin = kTopLeft_GrSurfaceOrigin;
|
|
||||||
textureDescription.fTextureHandle = reinterpret_cast<GrBackendObject>(&textureInfo);
|
|
||||||
PixelFormat format = buffer->getPixelFormat();
|
|
||||||
switch (format) {
|
|
||||||
case PIXEL_FORMAT_RGBA_8888:
|
|
||||||
textureDescription.fConfig = kRGBA_8888_GrPixelConfig;
|
|
||||||
break;
|
|
||||||
case PIXEL_FORMAT_RGBA_FP16:
|
|
||||||
textureDescription.fConfig = kRGBA_half_GrPixelConfig;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
eglDestroyImageKHR(display, EGLimage);
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: add color correctness - pass null color space for now
|
|
||||||
sk_sp<SkImage> image = SkImage::MakeFromTexture(grContext.get(), textureDescription,
|
|
||||||
bitmap->info().alphaType(), nullptr, deleteImageTexture, EGLimage);
|
|
||||||
if (!image.get()) {
|
|
||||||
eglDestroyImageKHR(display, EGLimage);
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return image;
|
|
||||||
}
|
|
||||||
|
|
||||||
} /* namespace skiapipeline */
|
} /* namespace skiapipeline */
|
||||||
} /* namespace uirenderer */
|
} /* namespace uirenderer */
|
||||||
} /* namespace android */
|
} /* namespace android */
|
||||||
|
|||||||
@@ -46,8 +46,6 @@ public:
|
|||||||
bool isContextReady() override;
|
bool isContextReady() override;
|
||||||
|
|
||||||
static void invokeFunctor(const renderthread::RenderThread& thread, Functor* functor);
|
static void invokeFunctor(const renderthread::RenderThread& thread, Functor* functor);
|
||||||
static sk_sp<SkImage> makeTextureImage(
|
|
||||||
const uirenderer::renderthread::RenderThread& renderThread, Bitmap* bitmap);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
renderthread::EglManager& mEglManager;
|
renderthread::EglManager& mEglManager;
|
||||||
|
|||||||
@@ -61,7 +61,6 @@ CopyResult SkiaOpenGLReadback::copyImageInto(EGLImageKHR eglImage, const Matrix4
|
|||||||
textureDescription.fTextureHandle = reinterpret_cast<GrBackendObject>(&externalTexture);
|
textureDescription.fTextureHandle = reinterpret_cast<GrBackendObject>(&externalTexture);
|
||||||
|
|
||||||
CopyResult copyResult = CopyResult::UnknownError;
|
CopyResult copyResult = CopyResult::UnknownError;
|
||||||
// TODO: add color correctness - pass null color space for now
|
|
||||||
sk_sp<SkImage> image(SkImage::MakeFromAdoptedTexture(grContext.get(), textureDescription));
|
sk_sp<SkImage> image(SkImage::MakeFromAdoptedTexture(grContext.get(), textureDescription));
|
||||||
if (image) {
|
if (image) {
|
||||||
SkAutoLockPixels alp(*bitmap);
|
SkAutoLockPixels alp(*bitmap);
|
||||||
|
|||||||
@@ -155,11 +155,11 @@ void SkiaPipeline::prepareToDraw(const RenderThread& thread, Bitmap* bitmap) {
|
|||||||
GrContext* context = thread.getGrContext();
|
GrContext* context = thread.getGrContext();
|
||||||
if (context) {
|
if (context) {
|
||||||
ATRACE_FORMAT("Bitmap#prepareToDraw %dx%d", bitmap->width(), bitmap->height());
|
ATRACE_FORMAT("Bitmap#prepareToDraw %dx%d", bitmap->width(), bitmap->height());
|
||||||
auto image = bitmap->makeImage(&thread);
|
SkBitmap skiaBitmap;
|
||||||
if (image.get() && !bitmap->isHardware()) {
|
bitmap->getSkBitmap(&skiaBitmap);
|
||||||
SkImage_pinAsTexture(image.get(), context);
|
sk_sp<SkImage> image = SkMakeImageFromRasterBitmap(skiaBitmap, kNever_SkCopyPixelsMode);
|
||||||
SkImage_unpinAsTexture(image.get(), context);
|
SkImage_pinAsTexture(image.get(), context);
|
||||||
}
|
SkImage_unpinAsTexture(image.get(), context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -168,8 +168,11 @@ inline static const SkPaint* nonAAPaint(const SkPaint* origPaint, SkPaint* tmpPa
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, float left, float top, const SkPaint* paint) {
|
void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, float left, float top, const SkPaint* paint) {
|
||||||
sk_sp<SkImage> image = bitmap.makeImage(nullptr);
|
SkBitmap skBitmap;
|
||||||
if (!bitmap.isImmutable()) {
|
bitmap.getSkBitmap(&skBitmap);
|
||||||
|
|
||||||
|
sk_sp<SkImage> image = SkMakeImageFromRasterBitmap(skBitmap, kNever_SkCopyPixelsMode);
|
||||||
|
if (!skBitmap.isImmutable()) {
|
||||||
mDisplayList->mMutableImages.push_back(image.get());
|
mDisplayList->mMutableImages.push_back(image.get());
|
||||||
}
|
}
|
||||||
SkPaint tmpPaint;
|
SkPaint tmpPaint;
|
||||||
@@ -178,10 +181,12 @@ void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, float left, float top, cons
|
|||||||
|
|
||||||
void SkiaRecordingCanvas::drawBitmap(Bitmap& hwuiBitmap, const SkMatrix& matrix,
|
void SkiaRecordingCanvas::drawBitmap(Bitmap& hwuiBitmap, const SkMatrix& matrix,
|
||||||
const SkPaint* paint) {
|
const SkPaint* paint) {
|
||||||
|
SkBitmap bitmap;
|
||||||
|
hwuiBitmap.getSkBitmap(&bitmap);
|
||||||
SkAutoCanvasRestore acr(&mRecorder, true);
|
SkAutoCanvasRestore acr(&mRecorder, true);
|
||||||
concat(matrix);
|
concat(matrix);
|
||||||
sk_sp<SkImage> image = hwuiBitmap.makeImage(nullptr);
|
sk_sp<SkImage> image = SkMakeImageFromRasterBitmap(bitmap, kNever_SkCopyPixelsMode);
|
||||||
if (!hwuiBitmap.isImmutable()) {
|
if (!bitmap.isImmutable()) {
|
||||||
mDisplayList->mMutableImages.push_back(image.get());
|
mDisplayList->mMutableImages.push_back(image.get());
|
||||||
}
|
}
|
||||||
SkPaint tmpPaint;
|
SkPaint tmpPaint;
|
||||||
@@ -191,10 +196,12 @@ void SkiaRecordingCanvas::drawBitmap(Bitmap& hwuiBitmap, const SkMatrix& matrix,
|
|||||||
void SkiaRecordingCanvas::drawBitmap(Bitmap& hwuiBitmap, float srcLeft, float srcTop,
|
void SkiaRecordingCanvas::drawBitmap(Bitmap& hwuiBitmap, float srcLeft, float srcTop,
|
||||||
float srcRight, float srcBottom, float dstLeft, float dstTop, float dstRight,
|
float srcRight, float srcBottom, float dstLeft, float dstTop, float dstRight,
|
||||||
float dstBottom, const SkPaint* paint) {
|
float dstBottom, const SkPaint* paint) {
|
||||||
|
SkBitmap bitmap;
|
||||||
|
hwuiBitmap.getSkBitmap(&bitmap);
|
||||||
SkRect srcRect = SkRect::MakeLTRB(srcLeft, srcTop, srcRight, srcBottom);
|
SkRect srcRect = SkRect::MakeLTRB(srcLeft, srcTop, srcRight, srcBottom);
|
||||||
SkRect dstRect = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom);
|
SkRect dstRect = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom);
|
||||||
sk_sp<SkImage> image = hwuiBitmap.makeImage(nullptr);
|
sk_sp<SkImage> image = SkMakeImageFromRasterBitmap(bitmap, kNever_SkCopyPixelsMode);
|
||||||
if (!hwuiBitmap.isImmutable()) {
|
if (!bitmap.isImmutable()) {
|
||||||
mDisplayList->mMutableImages.push_back(image.get());
|
mDisplayList->mMutableImages.push_back(image.get());
|
||||||
}
|
}
|
||||||
SkPaint tmpPaint;
|
SkPaint tmpPaint;
|
||||||
@@ -203,8 +210,11 @@ void SkiaRecordingCanvas::drawBitmap(Bitmap& hwuiBitmap, float srcLeft, float sr
|
|||||||
|
|
||||||
void SkiaRecordingCanvas::drawNinePatch(Bitmap& hwuiBitmap, const Res_png_9patch& chunk,
|
void SkiaRecordingCanvas::drawNinePatch(Bitmap& hwuiBitmap, const Res_png_9patch& chunk,
|
||||||
float dstLeft, float dstTop, float dstRight, float dstBottom, const SkPaint* paint) {
|
float dstLeft, float dstTop, float dstRight, float dstBottom, const SkPaint* paint) {
|
||||||
|
SkBitmap bitmap;
|
||||||
|
hwuiBitmap.getSkBitmap(&bitmap);
|
||||||
|
|
||||||
SkCanvas::Lattice lattice;
|
SkCanvas::Lattice lattice;
|
||||||
NinePatchUtils::SetLatticeDivs(&lattice, chunk, hwuiBitmap.width(), hwuiBitmap.height());
|
NinePatchUtils::SetLatticeDivs(&lattice, chunk, bitmap.width(), bitmap.height());
|
||||||
|
|
||||||
lattice.fFlags = nullptr;
|
lattice.fFlags = nullptr;
|
||||||
int numFlags = 0;
|
int numFlags = 0;
|
||||||
@@ -221,8 +231,8 @@ void SkiaRecordingCanvas::drawNinePatch(Bitmap& hwuiBitmap, const Res_png_9patch
|
|||||||
|
|
||||||
lattice.fBounds = nullptr;
|
lattice.fBounds = nullptr;
|
||||||
SkRect dst = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom);
|
SkRect dst = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom);
|
||||||
sk_sp<SkImage> image = hwuiBitmap.makeImage(nullptr);
|
sk_sp<SkImage> image = SkMakeImageFromRasterBitmap(bitmap, kNever_SkCopyPixelsMode);
|
||||||
if (!hwuiBitmap.isImmutable()) {
|
if (!bitmap.isImmutable()) {
|
||||||
mDisplayList->mMutableImages.push_back(image.get());
|
mDisplayList->mMutableImages.push_back(image.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -693,18 +693,6 @@ int RenderProxy::copyGraphicBufferInto(GraphicBuffer* buffer, SkBitmap* bitmap)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CREATE_BRIDGE2(makeTextureImage, RenderThread* thread, Bitmap* bitmap) {
|
|
||||||
return args->thread->makeTextureImage(args->bitmap).release();
|
|
||||||
}
|
|
||||||
|
|
||||||
sk_sp<SkImage> RenderProxy::makeTextureImage(Bitmap* bitmap) {
|
|
||||||
SETUP_TASK(makeTextureImage);
|
|
||||||
args->bitmap = bitmap;
|
|
||||||
args->thread = &RenderThread::getInstance();
|
|
||||||
sk_sp<SkImage> hardwareImage(reinterpret_cast<SkImage*>(staticPostAndWait(task)));
|
|
||||||
return hardwareImage;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderProxy::post(RenderTask* task) {
|
void RenderProxy::post(RenderTask* task) {
|
||||||
mRenderThread.queue(task);
|
mRenderThread.queue(task);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,8 +135,6 @@ public:
|
|||||||
static sk_sp<Bitmap> allocateHardwareBitmap(SkBitmap& bitmap);
|
static sk_sp<Bitmap> allocateHardwareBitmap(SkBitmap& bitmap);
|
||||||
|
|
||||||
static int copyGraphicBufferInto(GraphicBuffer* buffer, SkBitmap* bitmap);
|
static int copyGraphicBufferInto(GraphicBuffer* buffer, SkBitmap* bitmap);
|
||||||
|
|
||||||
static sk_sp<SkImage> makeTextureImage(Bitmap* bitmap);
|
|
||||||
private:
|
private:
|
||||||
RenderThread& mRenderThread;
|
RenderThread& mRenderThread;
|
||||||
CanvasContext* mContext;
|
CanvasContext* mContext;
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
#include "RenderThread.h"
|
#include "RenderThread.h"
|
||||||
|
|
||||||
#include "../renderstate/RenderState.h"
|
#include "../renderstate/RenderState.h"
|
||||||
#include "../pipeline/skia/SkiaOpenGLPipeline.h"
|
|
||||||
#include "../pipeline/skia/SkiaOpenGLReadback.h"
|
#include "../pipeline/skia/SkiaOpenGLReadback.h"
|
||||||
#include "CanvasContext.h"
|
#include "CanvasContext.h"
|
||||||
#include "EglManager.h"
|
#include "EglManager.h"
|
||||||
@@ -434,24 +433,6 @@ RenderTask* RenderThread::nextTask(nsecs_t* nextWakeup) {
|
|||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
sk_sp<SkImage> RenderThread::makeTextureImage(Bitmap* bitmap) {
|
|
||||||
auto renderType = Properties::getRenderPipelineType();
|
|
||||||
sk_sp<SkImage> hardwareImage;
|
|
||||||
switch (renderType) {
|
|
||||||
case RenderPipelineType::SkiaGL:
|
|
||||||
hardwareImage = skiapipeline::SkiaOpenGLPipeline::makeTextureImage(*this, bitmap);
|
|
||||||
break;
|
|
||||||
case RenderPipelineType::SkiaVulkan:
|
|
||||||
//TODO: add Vulkan support
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
LOG_ALWAYS_FATAL("makeTextureImage: canvas context type %d not supported",
|
|
||||||
(int32_t) renderType);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return hardwareImage;
|
|
||||||
}
|
|
||||||
|
|
||||||
} /* namespace renderthread */
|
} /* namespace renderthread */
|
||||||
} /* namespace uirenderer */
|
} /* namespace uirenderer */
|
||||||
} /* namespace android */
|
} /* namespace android */
|
||||||
|
|||||||
@@ -33,7 +33,6 @@
|
|||||||
|
|
||||||
namespace android {
|
namespace android {
|
||||||
|
|
||||||
class Bitmap;
|
|
||||||
class DisplayEventReceiver;
|
class DisplayEventReceiver;
|
||||||
|
|
||||||
namespace uirenderer {
|
namespace uirenderer {
|
||||||
@@ -105,8 +104,6 @@ public:
|
|||||||
|
|
||||||
VulkanManager& vulkanManager() { return *mVkManager; }
|
VulkanManager& vulkanManager() { return *mVkManager; }
|
||||||
|
|
||||||
sk_sp<SkImage> makeTextureImage(Bitmap* bitmap);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool threadLoop() override;
|
virtual bool threadLoop() override;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user