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

Commit bf01d199 authored by Jerome Gaillard's avatar Jerome Gaillard Committed by Android (Google) Code Review
Browse files

Merge changes I356da56c,I95c9e7c7,I509519e6,Icb5178ba into main

* changes:
  Do not mix pid_t and int32_t in Hwui
  Remove unnecessary #ifdefs
  Add RenderProxy to host builds of hwui
  Use CPU rendering for host builds
parents a61ac5aa 9da39e77
Loading
Loading
Loading
Loading
+106 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <system/window.h>

static int32_t query(ANativeWindow* window, int what) {
    int value;
    int res = window->query(window, what, &value);
    return res < 0 ? res : value;
}

static int64_t query64(ANativeWindow* window, int what) {
    int64_t value;
    int res = window->perform(window, what, &value);
    return res < 0 ? res : value;
}

int ANativeWindow_setCancelBufferInterceptor(ANativeWindow* window,
                                             ANativeWindow_cancelBufferInterceptor interceptor,
                                             void* data) {
    return window->perform(window, NATIVE_WINDOW_SET_CANCEL_INTERCEPTOR, interceptor, data);
}

int ANativeWindow_setDequeueBufferInterceptor(ANativeWindow* window,
                                              ANativeWindow_dequeueBufferInterceptor interceptor,
                                              void* data) {
    return window->perform(window, NATIVE_WINDOW_SET_DEQUEUE_INTERCEPTOR, interceptor, data);
}

int ANativeWindow_setQueueBufferInterceptor(ANativeWindow* window,
                                            ANativeWindow_queueBufferInterceptor interceptor,
                                            void* data) {
    return window->perform(window, NATIVE_WINDOW_SET_QUEUE_INTERCEPTOR, interceptor, data);
}

int ANativeWindow_setPerformInterceptor(ANativeWindow* window,
                                        ANativeWindow_performInterceptor interceptor, void* data) {
    return window->perform(window, NATIVE_WINDOW_SET_PERFORM_INTERCEPTOR, interceptor, data);
}

int ANativeWindow_dequeueBuffer(ANativeWindow* window, ANativeWindowBuffer** buffer, int* fenceFd) {
    return window->dequeueBuffer(window, buffer, fenceFd);
}

int ANativeWindow_cancelBuffer(ANativeWindow* window, ANativeWindowBuffer* buffer, int fenceFd) {
    return window->cancelBuffer(window, buffer, fenceFd);
}

int ANativeWindow_setDequeueTimeout(ANativeWindow* window, int64_t timeout) {
    return window->perform(window, NATIVE_WINDOW_SET_DEQUEUE_TIMEOUT, timeout);
}

// extern "C", so that it can be used outside libhostgraphics (in host hwui/.../CanvasContext.cpp)
extern "C" void ANativeWindow_tryAllocateBuffers(ANativeWindow* window) {
    if (!window || !query(window, NATIVE_WINDOW_IS_VALID)) {
        return;
    }
    window->perform(window, NATIVE_WINDOW_ALLOCATE_BUFFERS);
}

int64_t ANativeWindow_getLastDequeueStartTime(ANativeWindow* window) {
    return query64(window, NATIVE_WINDOW_GET_LAST_DEQUEUE_START);
}

int64_t ANativeWindow_getLastDequeueDuration(ANativeWindow* window) {
    return query64(window, NATIVE_WINDOW_GET_LAST_DEQUEUE_DURATION);
}

int64_t ANativeWindow_getLastQueueDuration(ANativeWindow* window) {
    return query64(window, NATIVE_WINDOW_GET_LAST_QUEUE_DURATION);
}

int32_t ANativeWindow_getWidth(ANativeWindow* window) {
    return query(window, NATIVE_WINDOW_WIDTH);
}

int32_t ANativeWindow_getHeight(ANativeWindow* window) {
    return query(window, NATIVE_WINDOW_HEIGHT);
}

int32_t ANativeWindow_getFormat(ANativeWindow* window) {
    return query(window, NATIVE_WINDOW_FORMAT);
}

void ANativeWindow_acquire(ANativeWindow* window) {
    // incStrong/decStrong token must be the same, doesn't matter what it is
    window->incStrong((void*)ANativeWindow_acquire);
}

void ANativeWindow_release(ANativeWindow* window) {
    // incStrong/decStrong token must be the same, doesn't matter what it is
    window->decStrong((void*)ANativeWindow_acquire);
}
+1 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ cc_library_host_static {
    srcs: [
        ":libui_host_common",
        "ADisplay.cpp",
        "ANativeWindow.cpp",
        "Fence.cpp",
        "HostBufferQueue.cpp",
        "PublicFormat.cpp",
+7 −4
Original line number Diff line number Diff line
@@ -96,6 +96,7 @@ cc_defaults {
            ],
            cflags: [
                "-Wno-unused-variable",
                "-D__INTRODUCED_IN(n)=",
            ],
        },
    },
@@ -539,7 +540,10 @@ cc_defaults {
        "pipeline/skia/ReorderBarrierDrawables.cpp",
        "pipeline/skia/TransformCanvas.cpp",
        "renderstate/RenderState.cpp",
        "renderthread/CanvasContext.cpp",
        "renderthread/DrawFrameTask.cpp",
        "renderthread/Frame.cpp",
        "renderthread/RenderProxy.cpp",
        "renderthread/RenderTask.cpp",
        "renderthread/TimeLord.cpp",
        "hwui/AnimatedImageDrawable.cpp",
@@ -589,6 +593,7 @@ cc_defaults {
        "SkiaCanvas.cpp",
        "SkiaInterpolator.cpp",
        "Tonemapper.cpp",
        "TreeInfo.cpp",
        "VectorDrawable.cpp",
    ],

@@ -617,14 +622,11 @@ cc_defaults {
                "pipeline/skia/VkFunctorDrawable.cpp",
                "pipeline/skia/VkInteropFunctorDrawable.cpp",
                "renderthread/CacheManager.cpp",
                "renderthread/CanvasContext.cpp",
                "renderthread/DrawFrameTask.cpp",
                "renderthread/EglManager.cpp",
                "renderthread/ReliableSurface.cpp",
                "renderthread/RenderEffectCapabilityQuery.cpp",
                "renderthread/VulkanManager.cpp",
                "renderthread/VulkanSurface.cpp",
                "renderthread/RenderProxy.cpp",
                "renderthread/RenderThread.cpp",
                "renderthread/HintSessionWrapper.cpp",
                "service/GraphicsStatsService.cpp",
@@ -636,7 +638,6 @@ cc_defaults {
                "Layer.cpp",
                "ProfileDataContainer.cpp",
                "Readback.cpp",
                "TreeInfo.cpp",
                "WebViewFunctorManager.cpp",
                "protos/graphicsstats.proto",
            ],
@@ -654,6 +655,8 @@ cc_defaults {

            srcs: [
                "platform/host/renderthread/CacheManager.cpp",
                "platform/host/renderthread/HintSessionWrapper.cpp",
                "platform/host/renderthread/ReliableSurface.cpp",
                "platform/host/renderthread/RenderThread.cpp",
                "platform/host/ProfileDataContainer.cpp",
                "platform/host/Readback.cpp",
+8 −14
Original line number Diff line number Diff line
@@ -16,18 +16,6 @@

#include "RenderNode.h"

#include "DamageAccumulator.h"
#include "Debug.h"
#include "Properties.h"
#include "TreeInfo.h"
#include "VectorDrawable.h"
#include "private/hwui/WebViewFunctor.h"
#ifdef __ANDROID__
#include "renderthread/CanvasContext.h"
#else
#include "DamageAccumulator.h"
#include "pipeline/skia/SkiaDisplayList.h"
#endif
#include <SkPathOps.h>
#include <gui/TraceUtils.h>
#include <ui/FatVector.h>
@@ -37,6 +25,14 @@
#include <sstream>
#include <string>

#include "DamageAccumulator.h"
#include "Debug.h"
#include "Properties.h"
#include "TreeInfo.h"
#include "VectorDrawable.h"
#include "private/hwui/WebViewFunctor.h"
#include "renderthread/CanvasContext.h"

#ifdef __ANDROID__
#include "include/gpu/ganesh/SkImageGanesh.h"
#endif
@@ -186,7 +182,6 @@ void RenderNode::prepareLayer(TreeInfo& info, uint32_t dirtyMask) {
}

void RenderNode::pushLayerUpdate(TreeInfo& info) {
#ifdef __ANDROID__ // Layoutlib does not support CanvasContext and Layers
    LayerType layerType = properties().effectiveLayerType();
    // If we are not a layer OR we cannot be rendered (eg, view was detached)
    // we need to destroy any Layers we may have had previously
@@ -218,7 +213,6 @@ void RenderNode::pushLayerUpdate(TreeInfo& info) {
    // That might be us, so tell CanvasContext that this layer is in the
    // tree and should not be destroyed.
    info.canvasContext.markLayerInUse(this);
#endif
}

/**
+6 −18
Original line number Diff line number Diff line
@@ -18,11 +18,12 @@

#ifdef __ANDROID__ // Layoutlib does not support Looper (windows)
#include <utils/Looper.h>
#else
#include "utils/MessageHandler.h"
#endif

namespace android::uirenderer {

#ifdef __ANDROID__ // Layoutlib does not support Looper
class FinishAndInvokeListener : public MessageHandler {
public:
    explicit FinishAndInvokeListener(PropertyValuesAnimatorSet* anim) : mAnimator(anim) {
@@ -237,9 +238,13 @@ void RootRenderNode::detachVectorDrawableAnimator(PropertyValuesAnimatorSet* ani
        // user events, in which case the already posted listener's id will become stale, and
        // the onFinished callback will then be ignored.
        sp<FinishAndInvokeListener> message = new FinishAndInvokeListener(anim);
#ifdef __ANDROID__  // Layoutlib does not support Looper
        auto looper = Looper::getForThread();
        LOG_ALWAYS_FATAL_IF(looper == nullptr, "Not on a looper thread?");
        looper->sendMessageDelayed(ms2ns(remainingTimeInMs), message, 0);
#else
        message->handleMessage(0);
#endif
        anim->clearOneShotListener();
    }
}
@@ -285,22 +290,5 @@ private:
AnimationContext* ContextFactoryImpl::createAnimationContext(renderthread::TimeLord& clock) {
    return new AnimationContextBridge(clock, mRootNode);
}
#else

void RootRenderNode::prepareTree(TreeInfo& info) {
    info.errorHandler = mErrorHandler.get();
    info.updateWindowPositions = true;
    RenderNode::prepareTree(info);
    info.updateWindowPositions = false;
    info.errorHandler = nullptr;
}

void RootRenderNode::attachAnimatingNode(RenderNode* animatingNode) { }

void RootRenderNode::destroy() { }

void RootRenderNode::addVectorDrawableAnimator(PropertyValuesAnimatorSet* anim) { }

#endif

}  // namespace android::uirenderer
Loading