Merge "Support GPU profiling vis in new pipeline" into nyc-dev
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user