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

Commit 1dfa0704 authored by Chris Craik's avatar Chris Craik
Browse files

Support GPU profiling vis in new pipeline

bug:27353099

Change-Id: I905c1a998d9a9e2097c047dab9de87a70d7a370e
parent 8316fac9
Loading
Loading
Loading
Loading
+33 −11
Original line number Diff line number Diff line
@@ -135,17 +135,7 @@ void BakedOpRenderer::endFrame(const Rect& repaintRect) {
        mRenderState.stencil().disable();
    }

    mCaches.clearGarbage();
    mCaches.pathCache.trim();
    mCaches.tessellationCache.trim();

#if DEBUG_MEMORY_USAGE
    mCaches.dumpMemoryUsage();
#else
    if (Properties::debugLevel & kDebugMemory) {
        mCaches.dumpMemoryUsage();
    }
#endif
    // Note: we leave FBO 0 renderable here, for post-frame-content decoration
}

void BakedOpRenderer::setViewport(uint32_t width, uint32_t height) {
@@ -179,6 +169,38 @@ Texture* BakedOpRenderer::getTexture(const SkBitmap* bitmap) {
    return texture;
}

void BakedOpRenderer::drawRects(const float* rects, int count, const SkPaint* paint) {
    std::vector<Vertex> vertices;
    vertices.reserve(count);
    Vertex* vertex = vertices.data();

    for (int index = 0; index < count; index += 4) {
        float l = rects[index + 0];
        float t = rects[index + 1];
        float r = rects[index + 2];
        float b = rects[index + 3];

        Vertex::set(vertex++, l, t);
        Vertex::set(vertex++, r, t);
        Vertex::set(vertex++, l, b);
        Vertex::set(vertex++, r, b);
    }

    LOG_ALWAYS_FATAL_IF(mRenderTarget.frameBufferId != 0, "decoration only supported for FBO 0");
    // TODO: Currently assume full FBO damage, due to FrameInfoVisualizer::unionDirty.
    // Should should scissor safely.
    mRenderState.scissor().setEnabled(false);
    Glop glop;
    GlopBuilder(mRenderState, mCaches, &glop)
            .setRoundRectClipState(nullptr)
            .setMeshIndexedQuads(vertices.data(), count / 4)
            .setFillPaint(*paint, 1.0f)
            .setTransform(Matrix4::identity(), TransformFlags::None)
            .setModelViewIdentityEmptyBounds()
            .build();
    mRenderState.render(glop, mRenderTarget.orthoMatrix);
}

// clears and re-fills stencil with provided rendertarget space quads,
// and then put stencil into test mode
void BakedOpRenderer::setupStencilQuads(std::vector<Vertex>& quadVertices,
+10 −0
Original line number Diff line number Diff line
@@ -85,6 +85,16 @@ public:
    bool offscreenRenderTarget() { return mRenderTarget.offscreenBuffer != nullptr; }
    void dirtyRenderTarget(const Rect& dirtyRect);
    bool didDraw() const { return mHasDrawn; }

    uint32_t getViewportWidth() const { return mRenderTarget.viewportWidth; }
    uint32_t getViewportHeight() const { return mRenderTarget.viewportHeight; }

    // simple draw methods, to be used for end frame decoration
    void drawRect(float left, float top, float right, float bottom, const SkPaint* paint) {
        float ltrb[4] = { left, top, right, bottom };
        drawRects(ltrb, 4, paint);
    }
    void drawRects(const float* rects, int count, const SkPaint* paint);
private:
    void setViewport(uint32_t width, uint32_t height);
    void clearColorBuffer(const Rect& clearRect);
+19 −16
Original line number Diff line number Diff line
@@ -15,7 +15,11 @@
 */
#include "FrameInfoVisualizer.h"

#if HWUI_NEW_OPS
#include "BakedOpRenderer.h"
#else
#include "OpenGLRenderer.h"
#endif
#include "utils/Color.h"

#include <cutils/compiler.h>
@@ -88,7 +92,7 @@ void FrameInfoVisualizer::unionDirty(SkRect* dirty) {
    }
}

void FrameInfoVisualizer::draw(OpenGLRenderer* canvas) {
void FrameInfoVisualizer::draw(ContentRenderer* renderer) {
    RETURN_IF_DISABLED();

    if (mShowDirtyRegions) {
@@ -96,7 +100,7 @@ void FrameInfoVisualizer::draw(OpenGLRenderer* canvas) {
        if (mFlashToggle) {
            SkPaint paint;
            paint.setColor(0x7fff0000);
            canvas->drawRect(mDirtyRegion.fLeft, mDirtyRegion.fTop,
            renderer->drawRect(mDirtyRegion.fLeft, mDirtyRegion.fTop,
                    mDirtyRegion.fRight, mDirtyRegion.fBottom, &paint);
        }
    }
@@ -111,9 +115,9 @@ void FrameInfoVisualizer::draw(OpenGLRenderer* canvas) {
        info.markSwapBuffers();
        info.markFrameCompleted();

        initializeRects(canvas->getViewportHeight(), canvas->getViewportWidth());
        drawGraph(canvas);
        drawThreshold(canvas);
        initializeRects(renderer->getViewportHeight(), renderer->getViewportWidth());
        drawGraph(renderer);
        drawThreshold(renderer);
    }
}

@@ -194,27 +198,26 @@ void FrameInfoVisualizer::nextBarSegment(FrameInfoIndex start, FrameInfoIndex en
    }
}

void FrameInfoVisualizer::drawGraph(OpenGLRenderer* canvas) {
void FrameInfoVisualizer::drawGraph(ContentRenderer* renderer) {
    SkPaint paint;
    for (size_t i = 0; i < Bar.size(); i++) {
        nextBarSegment(Bar[i].start, Bar[i].end);
        paint.setColor(Bar[i].color & BAR_FAST_MASK);
        canvas->drawRects(mFastRects.get(), mNumFastRects * 4, &paint);
        renderer->drawRects(mFastRects.get(), mNumFastRects * 4, &paint);
        paint.setColor(Bar[i].color & BAR_JANKY_MASK);
        canvas->drawRects(mJankyRects.get(), mNumJankyRects * 4, &paint);
        renderer->drawRects(mJankyRects.get(), mNumJankyRects * 4, &paint);
    }
}

void FrameInfoVisualizer::drawThreshold(OpenGLRenderer* canvas) {
void FrameInfoVisualizer::drawThreshold(ContentRenderer* renderer) {
    SkPaint paint;
    paint.setColor(THRESHOLD_COLOR);
    paint.setStrokeWidth(mThresholdStroke);

    float pts[4];
    pts[0] = 0.0f;
    pts[1] = pts[3] = canvas->getViewportHeight() - (FRAME_THRESHOLD * mVerticalUnit);
    pts[2] = canvas->getViewportWidth();
    canvas->drawLines(pts, 4, &paint);
    float yLocation = renderer->getViewportHeight() - (FRAME_THRESHOLD * mVerticalUnit);
    renderer->drawRect(0.0f,
            yLocation - mThresholdStroke/2,
            renderer->getViewportWidth(),
            yLocation + mThresholdStroke/2,
            &paint);
}

bool FrameInfoVisualizer::consumeProperties() {
+9 −3
Original line number Diff line number Diff line
@@ -28,7 +28,13 @@
namespace android {
namespace uirenderer {

#if HWUI_NEW_OPS
class BakedOpRenderer;
typedef BakedOpRenderer ContentRenderer;
#else
class OpenGLRenderer;
typedef OpenGLRenderer ContentRenderer;
#endif

// TODO: This is a bit awkward as it needs to match the thing in CanvasContext
// A better abstraction here would be nice but iterators are painful
@@ -46,7 +52,7 @@ public:
    void setDensity(float density);

    void unionDirty(SkRect* dirty);
    void draw(OpenGLRenderer* canvas);
    void draw(ContentRenderer* renderer);

    void dumpData(int fd);

@@ -56,8 +62,8 @@ private:

    void initializeRects(const int baseline, const int width);
    void nextBarSegment(FrameInfoIndex start, FrameInfoIndex end);
    void drawGraph(OpenGLRenderer* canvas);
    void drawThreshold(OpenGLRenderer* canvas);
    void drawGraph(ContentRenderer* renderer);
    void drawThreshold(ContentRenderer* renderer);

    inline float durationMS(size_t index, FrameInfoIndex start, FrameInfoIndex end) {
        float duration = mFrameSource[index].duration(start, end) * 0.000001f;
+16 −2
Original line number Diff line number Diff line
@@ -348,12 +348,26 @@ void CanvasContext::draw() {
    FrameBuilder frameBuilder(mLayerUpdateQueue, dirty, frame.width(), frame.height(),
            mRenderNodes, mLightGeometry, mContentDrawBounds, &Caches::getInstance());
    mLayerUpdateQueue.clear();
    BakedOpRenderer renderer(Caches::getInstance(), mRenderThread.renderState(),
    auto&& caches = Caches::getInstance();
    BakedOpRenderer renderer(caches, mRenderThread.renderState(),
            mOpaque, mLightInfo);
    // TODO: profiler().draw(mCanvas);
    frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer);
    profiler().draw(&renderer);
    bool drew = renderer.didDraw();

    // post frame cleanup
    caches.clearGarbage();
    caches.pathCache.trim();
    caches.tessellationCache.trim();

#if DEBUG_MEMORY_USAGE
    mCaches.dumpMemoryUsage();
#else
    if (CC_UNLIKELY(Properties::debugLevel & kDebugMemory)) {
        caches.dumpMemoryUsage();
    }
#endif

#else
    mCanvas->prepareDirty(frame.width(), frame.height(),
            dirty.fLeft, dirty.fTop, dirty.fRight, dirty.fBottom, mOpaque);