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

Commit 45ec62ba authored by Greg Daniel's avatar Greg Daniel
Browse files

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

Test: manual testing
Change-Id: Iaec8c3a34367673c281665ff6c6e97d1ce532265
parent 8cd3edfa
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
@@ -43,8 +43,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