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

Commit 6acbc8a9 authored by Nathaniel Nifong's avatar Nathaniel Nifong Committed by Android (Google) Code Review
Browse files

Merge "Trigger external shader sampling wihout AHardwareBuffer" into sc-dev

parents ee08c6ae f436240c
Loading
Loading
Loading
Loading
+10 −45
Original line number Diff line number Diff line
@@ -25,8 +25,6 @@
#include "ui/Rect.h"
#include "utils/Timers.h"

#include <android/hardware_buffer.h>

namespace android::renderengine::skia {

namespace {
@@ -183,41 +181,6 @@ static void drawBlurLayers(SkiaRenderEngine* renderengine, const DisplaySettings
    }
}

namespace {

struct AHardwareBuffer_deleter {
    void operator()(AHardwareBuffer* ahb) const { AHardwareBuffer_release(ahb); }
};

std::unique_ptr<AHardwareBuffer, AHardwareBuffer_deleter> makeAHardwareBuffer() {
    AHardwareBuffer* buffer = nullptr;

    int w = 32;
    int h = 32;

    AHardwareBuffer_Desc hwbDesc;
    hwbDesc.width = w;
    hwbDesc.height = h;
    hwbDesc.layers = 1;
    hwbDesc.usage = AHARDWAREBUFFER_USAGE_CPU_READ_NEVER | AHARDWAREBUFFER_USAGE_CPU_WRITE_NEVER |
            AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
    hwbDesc.format = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
    // The following three are not used in the allocate
    hwbDesc.stride = 0;
    hwbDesc.rfu0 = 0;
    hwbDesc.rfu1 = 0;

    if (int error = AHardwareBuffer_allocate(&hwbDesc, &buffer)) {
        ALOGE("Failed to allocated hardware buffer, error: %d", error);
        if (buffer) {
            AHardwareBuffer_release(buffer);
        }
        return nullptr;
    }
    return std::unique_ptr<AHardwareBuffer, AHardwareBuffer_deleter>(buffer);
}
} // namespace

//
// The collection of shaders cached here were found by using perfetto to record shader compiles
// during actions that involve RenderEngine, logging the layer settings, and the shader code
@@ -265,14 +228,16 @@ void Cache::primeShaderCache(SkiaRenderEngine* renderengine) {
    // The majority of shaders are related to sampling images.
    drawImageLayers(renderengine, display, dstBuffer, srcBuffer);

    // Draw image layers again sampling from an AHardwareBuffer if it is possible to create one.
    if (auto ahb = makeAHardwareBuffer()) {
        sp<GraphicBuffer> externalBuffer = GraphicBuffer::fromAHardwareBuffer(ahb.get());
    // should be the same as AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
    const int64_t usageExternal = GRALLOC_USAGE_HW_TEXTURE;

    sp<GraphicBuffer> externalBuffer =
            new GraphicBuffer(displayRect.width(), displayRect.height(), PIXEL_FORMAT_RGBA_8888, 1,
                              usageExternal, "primeShaderCache_external");
    // TODO(b/184665179) doubles number of image shader compilations, but only somewhere
    // between 6 and 8 will occur in real uses.
    drawImageLayers(renderengine, display, dstBuffer, externalBuffer);
    renderengine->unbindExternalTextureBuffer(externalBuffer->getId());
    }

    renderengine->unbindExternalTextureBuffer(srcBuffer->getId());