diff options
| -rw-r--r-- | libs/hwui/Android.mk | 1 | ||||
| -rw-r--r-- | libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp | 12 | ||||
| -rw-r--r-- | libs/hwui/pipeline/skia/SkiaProfileRenderer.cpp | 45 | ||||
| -rw-r--r-- | libs/hwui/pipeline/skia/SkiaProfileRenderer.h | 42 | ||||
| -rw-r--r-- | libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp | 12 |
5 files changed, 112 insertions, 0 deletions
diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk index e1b7788801d4..8dc502ac13e4 100644 --- a/libs/hwui/Android.mk +++ b/libs/hwui/Android.mk @@ -25,6 +25,7 @@ hwui_src_files := \ pipeline/skia/SkiaDisplayList.cpp \ pipeline/skia/SkiaOpenGLPipeline.cpp \ pipeline/skia/SkiaPipeline.cpp \ + pipeline/skia/SkiaProfileRenderer.cpp \ pipeline/skia/SkiaRecordingCanvas.cpp \ pipeline/skia/SkiaVulkanPipeline.cpp \ renderstate/Blend.cpp \ diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp index 519de967794d..494f14d2a75b 100644 --- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp @@ -20,6 +20,8 @@ #include "renderthread/EglManager.h" #include "renderstate/RenderState.h" #include "Readback.h" +#include "SkiaPipeline.h" +#include "SkiaProfileRenderer.h" #include "utils/TraceUtils.h" #include <android/native_window.h> @@ -83,6 +85,16 @@ bool SkiaOpenGLPipeline::draw(const Frame& frame, const SkRect& screenDirty, SkiaPipeline::updateLighting(lightGeometry, lightInfo); renderFrame(*layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface); layerUpdateQueue->clear(); + + // Draw visual debugging features + if (CC_UNLIKELY(Properties::showDirtyRegions + || ProfileType::None == Properties::getProfileType())) { + SkCanvas* profileCanvas = surface->getCanvas(); + SkiaProfileRenderer profileRenderer(profileCanvas); + profiler->draw(profileRenderer); + profileCanvas->flush(); + } + return true; } diff --git a/libs/hwui/pipeline/skia/SkiaProfileRenderer.cpp b/libs/hwui/pipeline/skia/SkiaProfileRenderer.cpp new file mode 100644 index 000000000000..d97fb372fe0c --- /dev/null +++ b/libs/hwui/pipeline/skia/SkiaProfileRenderer.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SkiaProfileRenderer.h" + +namespace android { +namespace uirenderer { + +void SkiaProfileRenderer::drawRect(float left, float top, float right, float bottom, + const SkPaint& paint) { + SkRect rect = SkRect::MakeLTRB(left, top, right, bottom); + mCanvas->drawRect(rect, paint); +} + +void SkiaProfileRenderer::drawRects(const float* rects, int count, const SkPaint& paint) { + for (int index = 0; index + 4 <= count; index += 4) { + SkRect rect = SkRect::MakeLTRB(rects[index + 0], rects[index + 1], rects[index + 2], + rects[index + 3]); + mCanvas->drawRect(rect, paint); + } +} + +uint32_t SkiaProfileRenderer::getViewportWidth() { + return mCanvas->imageInfo().width(); +} + +uint32_t SkiaProfileRenderer::getViewportHeight() { + return mCanvas->imageInfo().height(); +} + +} /* namespace uirenderer */ +} /* namespace android */ diff --git a/libs/hwui/pipeline/skia/SkiaProfileRenderer.h b/libs/hwui/pipeline/skia/SkiaProfileRenderer.h new file mode 100644 index 000000000000..e6b7f8307379 --- /dev/null +++ b/libs/hwui/pipeline/skia/SkiaProfileRenderer.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "IProfileRenderer.h" + +#include "BakedOpRenderer.h" + +namespace android { +namespace uirenderer { + +class SkiaProfileRenderer : public IProfileRenderer { +public: + SkiaProfileRenderer(SkCanvas* canvas) + : mCanvas(canvas) {} + + void drawRect(float left, float top, float right, float bottom, const SkPaint& paint) override; + void drawRects(const float* rects, int count, const SkPaint& paint) override; + uint32_t getViewportWidth() override; + uint32_t getViewportHeight() override; + + virtual ~SkiaProfileRenderer() {} + +private: + // Does not have ownership. + SkCanvas* mCanvas; +}; + +} /* namespace uirenderer */ +} /* namespace android */ diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp index 520309a50f53..8fffe91cfe39 100644 --- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp @@ -20,6 +20,8 @@ #include "renderthread/EglManager.h" // needed for Frame #include "Readback.h" #include "renderstate/RenderState.h" +#include "SkiaPipeline.h" +#include "SkiaProfileRenderer.h" #include <SkTypes.h> #include <WindowContextFactory_android.h> @@ -69,6 +71,16 @@ bool SkiaVulkanPipeline::draw(const Frame& frame, const SkRect& screenDirty, } renderFrame(*layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, mBackbuffer); layerUpdateQueue->clear(); + + // Draw visual debugging features + if (CC_UNLIKELY(Properties::showDirtyRegions + || ProfileType::None == Properties::getProfileType())) { + SkCanvas* profileCanvas = mBackbuffer->getCanvas(); + SkiaProfileRenderer profileRenderer(profileCanvas); + profiler->draw(profileRenderer); + profileCanvas->flush(); + } + return true; } |