Merge "Support GPU profiling vis in new pipeline" into nyc-dev

This commit is contained in:
Chris Craik
2016-03-05 00:19:09 +00:00
committed by Android (Google) Code Review
5 changed files with 87 additions and 32 deletions

View File

@@ -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,

View File

@@ -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);

View File

@@ -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() {

View File

@@ -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;

View File

@@ -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);