Loading graphics/java/android/graphics/HardwareBufferRenderer.java +13 −2 Original line number Diff line number Diff line Loading @@ -275,11 +275,22 @@ public class HardwareBufferRenderer implements AutoCloseable { Consumer<RenderResult> wrapped = consumable -> executor.execute( () -> renderCallback.accept(consumable)); if (!isClosed()) { int renderWidth; int renderHeight; if (mTransform == SurfaceControl.BUFFER_TRANSFORM_ROTATE_90 || mTransform == SurfaceControl.BUFFER_TRANSFORM_ROTATE_270) { renderWidth = mHardwareBuffer.getHeight(); renderHeight = mHardwareBuffer.getWidth(); } else { renderWidth = mHardwareBuffer.getWidth(); renderHeight = mHardwareBuffer.getHeight(); } nRender( mProxy, mTransform, mHardwareBuffer.getWidth(), mHardwareBuffer.getHeight(), renderWidth, renderHeight, mColorSpace.getNativeInstance(), wrapped); } else { Loading libs/hwui/jni/android_graphics_HardwareBufferRenderer.cpp +6 −14 Original line number Diff line number Diff line Loading @@ -85,28 +85,20 @@ static void HardwareBufferRenderer_destroy(jlong renderProxy) { } static SkMatrix createMatrixFromBufferTransform(SkScalar width, SkScalar height, int transform) { auto matrix = SkMatrix(); switch (transform) { case ANATIVEWINDOW_TRANSFORM_ROTATE_90: matrix.setRotate(90); matrix.postTranslate(width, 0); break; return SkMatrix::MakeAll(0, -1, height, 1, 0, 0, 0, 0, 1); case ANATIVEWINDOW_TRANSFORM_ROTATE_180: matrix.setRotate(180); matrix.postTranslate(width, height); break; return SkMatrix::MakeAll(-1, 0, width, 0, -1, height, 0, 0, 1); case ANATIVEWINDOW_TRANSFORM_ROTATE_270: matrix.setRotate(270); matrix.postTranslate(0, width); break; return SkMatrix::MakeAll(0, 1, 0, -1, 0, width, 0, 0, 1); default: ALOGE("Invalid transform provided. Transform should be validated from" "the java side. Leveraging identity transform as a fallback"); [[fallthrough]]; case ANATIVEWINDOW_TRANSFORM_IDENTITY: break; return SkMatrix::I(); } return matrix; } static int android_graphics_HardwareBufferRenderer_render(JNIEnv* env, jobject, jlong renderProxy, Loading @@ -117,8 +109,8 @@ static int android_graphics_HardwareBufferRenderer_render(JNIEnv* env, jobject, auto skHeight = static_cast<SkScalar>(height); auto matrix = createMatrixFromBufferTransform(skWidth, skHeight, transform); auto colorSpace = GraphicsJNI::getNativeColorSpace(colorspacePtr); proxy->setHardwareBufferRenderParams( HardwareBufferRenderParams(matrix, colorSpace, createRenderCallback(env, consumer))); proxy->setHardwareBufferRenderParams(HardwareBufferRenderParams( width, height, matrix, colorSpace, createRenderCallback(env, consumer))); nsecs_t vsync = systemTime(SYSTEM_TIME_MONOTONIC); UiFrameInfoBuilder(proxy->frameInfo()) .setVsync(vsync, vsync, UiFrameInfoBuilder::INVALID_VSYNC_ID, Loading libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp +3 −9 Original line number Diff line number Diff line Loading @@ -69,16 +69,10 @@ MakeCurrentResult SkiaOpenGLPipeline::makeCurrent() { } Frame SkiaOpenGLPipeline::getFrame() { if (mHardwareBuffer) { AHardwareBuffer_Desc description; AHardwareBuffer_describe(mHardwareBuffer, &description); return Frame(description.width, description.height, 0); } else { LOG_ALWAYS_FATAL_IF(mEglSurface == EGL_NO_SURFACE, "drawRenderNode called on a context with no surface!"); return mEglManager.beginFrame(mEglSurface); } } IRenderPipeline::DrawResult SkiaOpenGLPipeline::draw( const Frame& frame, const SkRect& screenDirty, const SkRect& dirty, Loading libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp +2 −9 Original line number Diff line number Diff line Loading @@ -66,16 +66,9 @@ MakeCurrentResult SkiaVulkanPipeline::makeCurrent() { } Frame SkiaVulkanPipeline::getFrame() { if (mHardwareBuffer) { AHardwareBuffer_Desc description; AHardwareBuffer_describe(mHardwareBuffer, &description); return Frame(description.width, description.height, 0); } else { LOG_ALWAYS_FATAL_IF(mVkSurface == nullptr, "getFrame() called on a context with no surface!"); LOG_ALWAYS_FATAL_IF(mVkSurface == nullptr, "getFrame() called on a context with no surface!"); return vulkanManager().dequeueNextBuffer(mVkSurface); } } IRenderPipeline::DrawResult SkiaVulkanPipeline::draw( const Frame& frame, const SkRect& screenDirty, const SkRect& dirty, Loading libs/hwui/renderthread/CanvasContext.cpp +10 −1 Original line number Diff line number Diff line Loading @@ -528,6 +528,14 @@ void CanvasContext::notifyFramePending() { sendLoadResetHint(); } Frame CanvasContext::getFrame() { if (mHardwareBuffer != nullptr) { return {mBufferParams.getLogicalWidth(), mBufferParams.getLogicalHeight(), 0}; } else { return mRenderPipeline->getFrame(); } } void CanvasContext::draw() { if (auto grContext = getGrContext()) { if (grContext->abandoned()) { Loading Loading @@ -569,7 +577,8 @@ void CanvasContext::draw() { mCurrentFrameInfo->markIssueDrawCommandsStart(); Frame frame = mRenderPipeline->getFrame(); Frame frame = getFrame(); SkRect windowDirty = computeDirtyRect(frame, &dirty); ATRACE_FORMAT("Drawing " RECT_STRING, SK_RECT_ARGS(dirty)); Loading Loading
graphics/java/android/graphics/HardwareBufferRenderer.java +13 −2 Original line number Diff line number Diff line Loading @@ -275,11 +275,22 @@ public class HardwareBufferRenderer implements AutoCloseable { Consumer<RenderResult> wrapped = consumable -> executor.execute( () -> renderCallback.accept(consumable)); if (!isClosed()) { int renderWidth; int renderHeight; if (mTransform == SurfaceControl.BUFFER_TRANSFORM_ROTATE_90 || mTransform == SurfaceControl.BUFFER_TRANSFORM_ROTATE_270) { renderWidth = mHardwareBuffer.getHeight(); renderHeight = mHardwareBuffer.getWidth(); } else { renderWidth = mHardwareBuffer.getWidth(); renderHeight = mHardwareBuffer.getHeight(); } nRender( mProxy, mTransform, mHardwareBuffer.getWidth(), mHardwareBuffer.getHeight(), renderWidth, renderHeight, mColorSpace.getNativeInstance(), wrapped); } else { Loading
libs/hwui/jni/android_graphics_HardwareBufferRenderer.cpp +6 −14 Original line number Diff line number Diff line Loading @@ -85,28 +85,20 @@ static void HardwareBufferRenderer_destroy(jlong renderProxy) { } static SkMatrix createMatrixFromBufferTransform(SkScalar width, SkScalar height, int transform) { auto matrix = SkMatrix(); switch (transform) { case ANATIVEWINDOW_TRANSFORM_ROTATE_90: matrix.setRotate(90); matrix.postTranslate(width, 0); break; return SkMatrix::MakeAll(0, -1, height, 1, 0, 0, 0, 0, 1); case ANATIVEWINDOW_TRANSFORM_ROTATE_180: matrix.setRotate(180); matrix.postTranslate(width, height); break; return SkMatrix::MakeAll(-1, 0, width, 0, -1, height, 0, 0, 1); case ANATIVEWINDOW_TRANSFORM_ROTATE_270: matrix.setRotate(270); matrix.postTranslate(0, width); break; return SkMatrix::MakeAll(0, 1, 0, -1, 0, width, 0, 0, 1); default: ALOGE("Invalid transform provided. Transform should be validated from" "the java side. Leveraging identity transform as a fallback"); [[fallthrough]]; case ANATIVEWINDOW_TRANSFORM_IDENTITY: break; return SkMatrix::I(); } return matrix; } static int android_graphics_HardwareBufferRenderer_render(JNIEnv* env, jobject, jlong renderProxy, Loading @@ -117,8 +109,8 @@ static int android_graphics_HardwareBufferRenderer_render(JNIEnv* env, jobject, auto skHeight = static_cast<SkScalar>(height); auto matrix = createMatrixFromBufferTransform(skWidth, skHeight, transform); auto colorSpace = GraphicsJNI::getNativeColorSpace(colorspacePtr); proxy->setHardwareBufferRenderParams( HardwareBufferRenderParams(matrix, colorSpace, createRenderCallback(env, consumer))); proxy->setHardwareBufferRenderParams(HardwareBufferRenderParams( width, height, matrix, colorSpace, createRenderCallback(env, consumer))); nsecs_t vsync = systemTime(SYSTEM_TIME_MONOTONIC); UiFrameInfoBuilder(proxy->frameInfo()) .setVsync(vsync, vsync, UiFrameInfoBuilder::INVALID_VSYNC_ID, Loading
libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp +3 −9 Original line number Diff line number Diff line Loading @@ -69,16 +69,10 @@ MakeCurrentResult SkiaOpenGLPipeline::makeCurrent() { } Frame SkiaOpenGLPipeline::getFrame() { if (mHardwareBuffer) { AHardwareBuffer_Desc description; AHardwareBuffer_describe(mHardwareBuffer, &description); return Frame(description.width, description.height, 0); } else { LOG_ALWAYS_FATAL_IF(mEglSurface == EGL_NO_SURFACE, "drawRenderNode called on a context with no surface!"); return mEglManager.beginFrame(mEglSurface); } } IRenderPipeline::DrawResult SkiaOpenGLPipeline::draw( const Frame& frame, const SkRect& screenDirty, const SkRect& dirty, Loading
libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp +2 −9 Original line number Diff line number Diff line Loading @@ -66,16 +66,9 @@ MakeCurrentResult SkiaVulkanPipeline::makeCurrent() { } Frame SkiaVulkanPipeline::getFrame() { if (mHardwareBuffer) { AHardwareBuffer_Desc description; AHardwareBuffer_describe(mHardwareBuffer, &description); return Frame(description.width, description.height, 0); } else { LOG_ALWAYS_FATAL_IF(mVkSurface == nullptr, "getFrame() called on a context with no surface!"); LOG_ALWAYS_FATAL_IF(mVkSurface == nullptr, "getFrame() called on a context with no surface!"); return vulkanManager().dequeueNextBuffer(mVkSurface); } } IRenderPipeline::DrawResult SkiaVulkanPipeline::draw( const Frame& frame, const SkRect& screenDirty, const SkRect& dirty, Loading
libs/hwui/renderthread/CanvasContext.cpp +10 −1 Original line number Diff line number Diff line Loading @@ -528,6 +528,14 @@ void CanvasContext::notifyFramePending() { sendLoadResetHint(); } Frame CanvasContext::getFrame() { if (mHardwareBuffer != nullptr) { return {mBufferParams.getLogicalWidth(), mBufferParams.getLogicalHeight(), 0}; } else { return mRenderPipeline->getFrame(); } } void CanvasContext::draw() { if (auto grContext = getGrContext()) { if (grContext->abandoned()) { Loading Loading @@ -569,7 +577,8 @@ void CanvasContext::draw() { mCurrentFrameInfo->markIssueDrawCommandsStart(); Frame frame = mRenderPipeline->getFrame(); Frame frame = getFrame(); SkRect windowDirty = computeDirtyRect(frame, &dirty); ATRACE_FORMAT("Drawing " RECT_STRING, SK_RECT_ARGS(dirty)); Loading