Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c681475f authored by Nader Jawad's avatar Nader Jawad Committed by Android (Google) Code Review
Browse files

Merge "Fix for HardwareBufferRenderer pre-rotation" into udc-dev

parents 773177ad 24617223
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -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 {
+6 −14
Original line number Diff line number Diff line
@@ -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,
@@ -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,
+3 −9
Original line number Diff line number Diff line
@@ -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,
+2 −9
Original line number Diff line number Diff line
@@ -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,
+10 −1
Original line number Diff line number Diff line
@@ -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()) {
@@ -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