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

Commit 6efc30e1 authored by Greg Daniel's avatar Greg Daniel Committed by Android (Google) Code Review
Browse files

Merge "Add support for dummy draws for Vulkan webview and texture views."

parents fe0c0e05 45ec62ba
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -116,6 +116,7 @@ hwui_src_files := \
    Texture.cpp \
    TextureCache.cpp \
    VectorDrawable.cpp \
    VkLayer.cpp \
    protos/hwui.proto

hwui_test_common_src_files := \
+45 −22
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
#include "DeferredLayerUpdater.h"

#include "GlLayer.h"
#include "VkLayer.h"
#include "renderthread/EglManager.h"
#include "renderthread/RenderTask.h"
#include "utils/PaintUtils.h"
@@ -56,6 +57,12 @@ void DeferredLayerUpdater::apply() {
    mLayer->setAlpha(mAlpha, mMode);

    if (mSurfaceTexture.get()) {
        if (mLayer->getApi() == Layer::Api::Vulkan) {
            if (mUpdateTexImage) {
                mUpdateTexImage = false;
                doUpdateVkTexImage();
            }
        } else {
            LOG_ALWAYS_FATAL_IF(mLayer->getApi() != Layer::Api::OpenGL,
                                "apply surfaceTexture with non GL backend %x, GL %x, VK %x",
                                mLayer->getApi(), Layer::Api::OpenGL, Layer::Api::Vulkan);
@@ -67,6 +74,7 @@ void DeferredLayerUpdater::apply() {
                mUpdateTexImage = false;
                doUpdateTexImage();
            }
        }
        if (mTransform) {
            mLayer->getTransform().load(*mTransform);
            setTransform(nullptr);
@@ -117,16 +125,25 @@ void DeferredLayerUpdater::doUpdateTexImage() {
    }
}

void DeferredLayerUpdater::doUpdateVkTexImage() {
    LOG_ALWAYS_FATAL_IF(mLayer->getApi() != Layer::Api::Vulkan,
                        "updateLayer non Vulkan backend %x, GL %x, VK %x",
                        mLayer->getApi(), Layer::Api::OpenGL, Layer::Api::Vulkan);

    static const mat4 identityMatrix;
    updateLayer(false, identityMatrix.data);

    VkLayer* vkLayer = static_cast<VkLayer*>(mLayer);
    vkLayer->updateTexture();
}

void DeferredLayerUpdater::updateLayer(bool forceFilter, GLenum renderTarget,
        const float* textureTransform) {
    LOG_ALWAYS_FATAL_IF(mLayer->getApi() != Layer::Api::OpenGL,
                        "updateLayer non GL backend %x, GL %x, VK %x",
                        mLayer->getApi(), Layer::Api::OpenGL, Layer::Api::Vulkan);

    mLayer->setBlend(mBlend);
    mLayer->setForceFilter(forceFilter);
    mLayer->setSize(mWidth, mHeight);
    mLayer->getTexTransform().load(textureTransform);
    updateLayer(forceFilter, textureTransform);

    GlLayer* glLayer = static_cast<GlLayer*>(mLayer);
    if (renderTarget != glLayer->getRenderTarget()) {
@@ -137,19 +154,25 @@ void DeferredLayerUpdater::updateLayer(bool forceFilter, GLenum renderTarget,
    }
}

void DeferredLayerUpdater::updateLayer(bool forceFilter, const float* textureTransform) {
    mLayer->setBlend(mBlend);
    mLayer->setForceFilter(forceFilter);
    mLayer->setSize(mWidth, mHeight);
    mLayer->getTexTransform().load(textureTransform);
}

void DeferredLayerUpdater::detachSurfaceTexture() {
    if (mSurfaceTexture.get()) {
        LOG_ALWAYS_FATAL_IF(mLayer->getApi() != Layer::Api::OpenGL,
                            "detachSurfaceTexture with non GL backend %x, GL %x, VK %x",
                            mLayer->getApi(), Layer::Api::OpenGL, Layer::Api::Vulkan);
        if (mLayer->getApi() == Layer::Api::OpenGL) {
            status_t err = mSurfaceTexture->detachFromContext();
            if (err != 0) {
                // TODO: Elevate to fatal exception
                ALOGE("Failed to detach SurfaceTexture from context %d", err);
            }
        mSurfaceTexture = nullptr;
            static_cast<GlLayer*>(mLayer)->clearTexture();
        }
        mSurfaceTexture = nullptr;
    }
}

} /* namespace uirenderer */
+3 −1
Original line number Diff line number Diff line
@@ -63,8 +63,8 @@ public:

    ANDROID_API void setSurfaceTexture(const sp<GLConsumer>& texture, bool needsAttach) {
        if (texture.get() != mSurfaceTexture.get()) {
            mSurfaceTexture = texture;
            mNeedsGLContextAttach = needsAttach;
            mSurfaceTexture = texture;

            GLenum target = texture->getCurrentTextureTarget();
            LOG_ALWAYS_FATAL_IF(target != GL_TEXTURE_2D && target != GL_TEXTURE_EXTERNAL_OES,
@@ -113,6 +113,8 @@ private:
    Layer* mLayer;

    void doUpdateTexImage();
    void doUpdateVkTexImage();
    void updateLayer(bool forceFilter, const float* textureTransform);
};

} /* namespace uirenderer */
+4 −4
Original line number Diff line number Diff line
@@ -67,13 +67,13 @@ void GpuMemoryTracker::stopTrackingObject() {
    gObjectStats[static_cast<int>(mType)].count--;
}

void GpuMemoryTracker::onGLContextCreated() {
    LOG_ALWAYS_FATAL_IF(gGpuThread != 0, "We already have a GL thread? "
            "current = %lu, gl thread = %lu", pthread_self(), gGpuThread);
void GpuMemoryTracker::onGpuContextCreated() {
    LOG_ALWAYS_FATAL_IF(gGpuThread != 0, "We already have a gpu thread? "
            "current = %lu, gpu thread = %lu", pthread_self(), gGpuThread);
    gGpuThread = pthread_self();
}

void GpuMemoryTracker::onGLContextDestroyed() {
void GpuMemoryTracker::onGpuContextDestroyed() {
    gGpuThread = 0;
    if (CC_UNLIKELY(gObjectSet.size() > 0)) {
        std::stringstream os;
+2 −2
Original line number Diff line number Diff line
@@ -44,8 +44,8 @@ public:
    GpuObjectType objectType() { return mType; }
    int objectSize() { return mSize; }

    static void onGLContextCreated();
    static void onGLContextDestroyed();
    static void onGpuContextCreated();
    static void onGpuContextDestroyed();
    static void dump();
    static void dump(std::ostream& stream);
    static int getInstanceCount(GpuObjectType type);
Loading