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

Commit 501a72a3 authored by Patrick Williams's avatar Patrick Williams Committed by Android (Google) Code Review
Browse files

Merge "Replace RenderEngineResult with FenceResult"

parents 5b9a2716 2e9748ff
Loading
Loading
Loading
Loading
+7 −6
Original line number Original line Diff line number Diff line
@@ -63,12 +63,13 @@ void RenderEngine::validateOutputBufferUsage(const sp<GraphicBuffer>& buffer) {
                        "output buffer not gpu writeable");
                        "output buffer not gpu writeable");
}
}


std::future<RenderEngineResult> RenderEngine::drawLayers(
ftl::Future<FenceResult> RenderEngine::drawLayers(const DisplaySettings& display,
        const DisplaySettings& display, const std::vector<LayerSettings>& layers,
                                                  const std::vector<LayerSettings>& layers,
        const std::shared_ptr<ExternalTexture>& buffer, const bool useFramebufferCache,
                                                  const std::shared_ptr<ExternalTexture>& buffer,
                                                  const bool useFramebufferCache,
                                                  base::unique_fd&& bufferFence) {
                                                  base::unique_fd&& bufferFence) {
    const auto resultPromise = std::make_shared<std::promise<RenderEngineResult>>();
    const auto resultPromise = std::make_shared<std::promise<FenceResult>>();
    std::future<RenderEngineResult> resultFuture = resultPromise->get_future();
    std::future<FenceResult> resultFuture = resultPromise->get_future();
    drawLayersInternal(std::move(resultPromise), display, layers, buffer, useFramebufferCache,
    drawLayersInternal(std::move(resultPromise), display, layers, buffer, useFramebufferCache,
                       std::move(bufferFence));
                       std::move(bufferFence));
    return resultFuture;
    return resultFuture;
+8 −7
Original line number Original line Diff line number Diff line
@@ -159,9 +159,10 @@ static std::shared_ptr<ExternalTexture> copyBuffer(RenderEngine& re,
    };
    };
    auto layers = std::vector<LayerSettings>{layer};
    auto layers = std::vector<LayerSettings>{layer};


    auto [status, drawFence] =
    sp<Fence> waitFence =
            re.drawLayers(display, layers, texture, kUseFrameBufferCache, base::unique_fd()).get();
            re.drawLayers(display, layers, texture, kUseFrameBufferCache, base::unique_fd())
    sp<Fence> waitFence = sp<Fence>::make(std::move(drawFence));
                    .get()
                    .value();
    waitFence->waitForever(LOG_TAG);
    waitFence->waitForever(LOG_TAG);
    return texture;
    return texture;
}
}
@@ -190,10 +191,10 @@ static void benchDrawLayers(RenderEngine& re, const std::vector<LayerSettings>&


    // This loop starts and stops the timer.
    // This loop starts and stops the timer.
    for (auto _ : benchState) {
    for (auto _ : benchState) {
        auto [status, drawFence] = re.drawLayers(display, layers, outputBuffer,
        sp<Fence> waitFence = re.drawLayers(display, layers, outputBuffer, kUseFrameBufferCache,
                                                 kUseFrameBufferCache, base::unique_fd())
                                            base::unique_fd())
                                           .get();
                                      .get()
        sp<Fence> waitFence = sp<Fence>::make(std::move(drawFence));
                                      .value();
        waitFence->waitForever(LOG_TAG);
        waitFence->waitForever(LOG_TAG);
    }
    }


+10 −11
Original line number Original line Diff line number Diff line
@@ -1081,14 +1081,14 @@ EGLImageKHR GLESRenderEngine::createFramebufferImageIfNeeded(ANativeWindowBuffer
}
}


void GLESRenderEngine::drawLayersInternal(
void GLESRenderEngine::drawLayersInternal(
        const std::shared_ptr<std::promise<RenderEngineResult>>&& resultPromise,
        const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
        const DisplaySettings& display, const std::vector<LayerSettings>& layers,
        const DisplaySettings& display, const std::vector<LayerSettings>& layers,
        const std::shared_ptr<ExternalTexture>& buffer, const bool useFramebufferCache,
        const std::shared_ptr<ExternalTexture>& buffer, const bool useFramebufferCache,
        base::unique_fd&& bufferFence) {
        base::unique_fd&& bufferFence) {
    ATRACE_CALL();
    ATRACE_CALL();
    if (layers.empty()) {
    if (layers.empty()) {
        ALOGV("Drawing empty layer stack");
        ALOGV("Drawing empty layer stack");
        resultPromise->set_value({NO_ERROR, base::unique_fd()});
        resultPromise->set_value(Fence::NO_FENCE);
        return;
        return;
    }
    }


@@ -1103,7 +1103,7 @@ void GLESRenderEngine::drawLayersInternal(


    if (buffer == nullptr) {
    if (buffer == nullptr) {
        ALOGE("No output buffer provided. Aborting GPU composition.");
        ALOGE("No output buffer provided. Aborting GPU composition.");
        resultPromise->set_value({BAD_VALUE, base::unique_fd()});
        resultPromise->set_value(base::unexpected(BAD_VALUE));
        return;
        return;
    }
    }


@@ -1132,7 +1132,7 @@ void GLESRenderEngine::drawLayersInternal(
            ALOGE("Failed to bind framebuffer! Aborting GPU composition for buffer (%p).",
            ALOGE("Failed to bind framebuffer! Aborting GPU composition for buffer (%p).",
                  buffer->getBuffer()->handle);
                  buffer->getBuffer()->handle);
            checkErrors();
            checkErrors();
            resultPromise->set_value({fbo->getStatus(), base::unique_fd()});
            resultPromise->set_value(base::unexpected(fbo->getStatus()));
            return;
            return;
        }
        }
        setViewportAndProjection(display.physicalDisplay, display.clip);
        setViewportAndProjection(display.physicalDisplay, display.clip);
@@ -1144,7 +1144,7 @@ void GLESRenderEngine::drawLayersInternal(
            ALOGE("Failed to prepare blur filter! Aborting GPU composition for buffer (%p).",
            ALOGE("Failed to prepare blur filter! Aborting GPU composition for buffer (%p).",
                  buffer->getBuffer()->handle);
                  buffer->getBuffer()->handle);
            checkErrors();
            checkErrors();
            resultPromise->set_value({status, base::unique_fd()});
            resultPromise->set_value(base::unexpected(status));
            return;
            return;
        }
        }
    }
    }
@@ -1178,7 +1178,7 @@ void GLESRenderEngine::drawLayersInternal(
                ALOGE("Failed to render blur effect! Aborting GPU composition for buffer (%p).",
                ALOGE("Failed to render blur effect! Aborting GPU composition for buffer (%p).",
                      buffer->getBuffer()->handle);
                      buffer->getBuffer()->handle);
                checkErrors("Can't render first blur pass");
                checkErrors("Can't render first blur pass");
                resultPromise->set_value({status, base::unique_fd()});
                resultPromise->set_value(base::unexpected(status));
                return;
                return;
            }
            }


@@ -1201,7 +1201,7 @@ void GLESRenderEngine::drawLayersInternal(
                ALOGE("Failed to bind framebuffer! Aborting GPU composition for buffer (%p).",
                ALOGE("Failed to bind framebuffer! Aborting GPU composition for buffer (%p).",
                      buffer->getBuffer()->handle);
                      buffer->getBuffer()->handle);
                checkErrors("Can't bind native framebuffer");
                checkErrors("Can't bind native framebuffer");
                resultPromise->set_value({status, base::unique_fd()});
                resultPromise->set_value(base::unexpected(status));
                return;
                return;
            }
            }


@@ -1210,7 +1210,7 @@ void GLESRenderEngine::drawLayersInternal(
                ALOGE("Failed to render blur effect! Aborting GPU composition for buffer (%p).",
                ALOGE("Failed to render blur effect! Aborting GPU composition for buffer (%p).",
                      buffer->getBuffer()->handle);
                      buffer->getBuffer()->handle);
                checkErrors("Can't render blur filter");
                checkErrors("Can't render blur filter");
                resultPromise->set_value({status, base::unique_fd()});
                resultPromise->set_value(base::unexpected(status));
                return;
                return;
            }
            }
        }
        }
@@ -1310,7 +1310,7 @@ void GLESRenderEngine::drawLayersInternal(
            checkErrors();
            checkErrors();
            // Chances are, something illegal happened (either the caller passed
            // Chances are, something illegal happened (either the caller passed
            // us bad parameters, or we messed up our shader generation).
            // us bad parameters, or we messed up our shader generation).
            resultPromise->set_value({INVALID_OPERATION, std::move(drawFence)});
            resultPromise->set_value(base::unexpected(INVALID_OPERATION));
            return;
            return;
        }
        }
        mLastDrawFence = nullptr;
        mLastDrawFence = nullptr;
@@ -1322,8 +1322,7 @@ void GLESRenderEngine::drawLayersInternal(
    mPriorResourcesCleaned = false;
    mPriorResourcesCleaned = false;


    checkErrors();
    checkErrors();
    resultPromise->set_value({NO_ERROR, std::move(drawFence)});
    resultPromise->set_value(sp<Fence>::make(std::move(drawFence)));
    return;
}
}


void GLESRenderEngine::setViewportAndProjection(Rect viewport, Rect clip) {
void GLESRenderEngine::setViewportAndProjection(Rect viewport, Rect clip) {
+2 −1
Original line number Original line Diff line number Diff line
@@ -31,6 +31,7 @@
#include <renderengine/RenderEngine.h>
#include <renderengine/RenderEngine.h>
#include <renderengine/private/Description.h>
#include <renderengine/private/Description.h>
#include <sys/types.h>
#include <sys/types.h>
#include <ui/FenceResult.h>
#include "GLShadowTexture.h"
#include "GLShadowTexture.h"
#include "ImageManager.h"
#include "ImageManager.h"


@@ -102,7 +103,7 @@ protected:
            EXCLUDES(mRenderingMutex);
            EXCLUDES(mRenderingMutex);
    void unmapExternalTextureBuffer(const sp<GraphicBuffer>& buffer) EXCLUDES(mRenderingMutex);
    void unmapExternalTextureBuffer(const sp<GraphicBuffer>& buffer) EXCLUDES(mRenderingMutex);
    bool canSkipPostRenderCleanup() const override;
    bool canSkipPostRenderCleanup() const override;
    void drawLayersInternal(const std::shared_ptr<std::promise<RenderEngineResult>>&& resultPromise,
    void drawLayersInternal(const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
                            const DisplaySettings& display,
                            const DisplaySettings& display,
                            const std::vector<LayerSettings>& layers,
                            const std::vector<LayerSettings>& layers,
                            const std::shared_ptr<ExternalTexture>& buffer,
                            const std::shared_ptr<ExternalTexture>& buffer,
+10 −15
Original line number Original line Diff line number Diff line
@@ -18,6 +18,7 @@
#define SF_RENDERENGINE_H_
#define SF_RENDERENGINE_H_


#include <android-base/unique_fd.h>
#include <android-base/unique_fd.h>
#include <ftl/future.h>
#include <math/mat4.h>
#include <math/mat4.h>
#include <renderengine/DisplaySettings.h>
#include <renderengine/DisplaySettings.h>
#include <renderengine/ExternalTexture.h>
#include <renderengine/ExternalTexture.h>
@@ -26,6 +27,7 @@
#include <renderengine/LayerSettings.h>
#include <renderengine/LayerSettings.h>
#include <stdint.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/types.h>
#include <ui/FenceResult.h>
#include <ui/GraphicTypes.h>
#include <ui/GraphicTypes.h>
#include <ui/Transform.h>
#include <ui/Transform.h>


@@ -68,7 +70,6 @@ class Image;
class Mesh;
class Mesh;
class Texture;
class Texture;
struct RenderEngineCreationArgs;
struct RenderEngineCreationArgs;
struct RenderEngineResult;


namespace threaded {
namespace threaded {
class RenderEngineThreaded;
class RenderEngineThreaded;
@@ -158,11 +159,12 @@ public:
    // parameter does nothing.
    // parameter does nothing.
    // @param bufferFence Fence signalling that the buffer is ready to be drawn
    // @param bufferFence Fence signalling that the buffer is ready to be drawn
    // to.
    // to.
    // @return A future object of RenderEngineResult struct indicating whether
    // @return A future object of FenceResult indicating whether drawing was
    // drawing was successful in async mode.
    // successful in async mode.
    virtual std::future<RenderEngineResult> drawLayers(
    virtual ftl::Future<FenceResult> drawLayers(const DisplaySettings& display,
            const DisplaySettings& display, const std::vector<LayerSettings>& layers,
                                                const std::vector<LayerSettings>& layers,
            const std::shared_ptr<ExternalTexture>& buffer, const bool useFramebufferCache,
                                                const std::shared_ptr<ExternalTexture>& buffer,
                                                const bool useFramebufferCache,
                                                base::unique_fd&& bufferFence);
                                                base::unique_fd&& bufferFence);


    // Clean-up method that should be called on the main thread after the
    // Clean-up method that should be called on the main thread after the
@@ -237,7 +239,7 @@ protected:
    const RenderEngineType mRenderEngineType;
    const RenderEngineType mRenderEngineType;


    virtual void drawLayersInternal(
    virtual void drawLayersInternal(
            const std::shared_ptr<std::promise<RenderEngineResult>>&& resultPromise,
            const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
            const DisplaySettings& display, const std::vector<LayerSettings>& layers,
            const DisplaySettings& display, const std::vector<LayerSettings>& layers,
            const std::shared_ptr<ExternalTexture>& buffer, const bool useFramebufferCache,
            const std::shared_ptr<ExternalTexture>& buffer, const bool useFramebufferCache,
            base::unique_fd&& bufferFence) = 0;
            base::unique_fd&& bufferFence) = 0;
@@ -327,13 +329,6 @@ private:
            RenderEngine::RenderEngineType::SKIA_GL_THREADED;
            RenderEngine::RenderEngineType::SKIA_GL_THREADED;
};
};


struct RenderEngineResult {
    // status indicates if drawing is successful
    status_t status;
    // drawFence will fire when the buffer has been drawn to and is ready to be examined.
    base::unique_fd drawFence;
};

} // namespace renderengine
} // namespace renderengine
} // namespace android
} // namespace android


Loading