diff options
author | 2015-10-22 17:07:45 -0700 | |
---|---|---|
committer | 2015-10-22 17:13:07 -0700 | |
commit | 82f5e0c5cd0fcbacd8094b7963a50a2e30e0846f (patch) | |
tree | 3cefab7166b2b9bf3029490fb29ba1d9cd71431e | |
parent | 3b7acbb86207df78eccfeb40aabcc8543703a58f (diff) |
Add ShadowBench
Drop -O3 & -ffast-math as they don't
help on clang and just hit SIGBUS issues
Change-Id: I8e9a8f4cd9ddf136103a6b7f69902e9f3a730c57
-rw-r--r-- | libs/hwui/Android.mk | 6 | ||||
-rw-r--r-- | libs/hwui/TessellationCache.cpp | 2 | ||||
-rw-r--r-- | libs/hwui/TessellationCache.h | 21 | ||||
-rw-r--r-- | libs/hwui/Vector.h | 4 | ||||
-rw-r--r-- | libs/hwui/microbench/ShadowBench.cpp | 117 |
5 files changed, 140 insertions, 10 deletions
diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk index 842f575553a5..4c1386cb7a64 100644 --- a/libs/hwui/Android.mk +++ b/libs/hwui/Android.mk @@ -84,8 +84,7 @@ hwui_src_files := \ hwui_cflags := \ -DEGL_EGLEXT_PROTOTYPES -DGL_GLEXT_PROTOTYPES \ -DATRACE_TAG=ATRACE_TAG_VIEW -DLOG_TAG=\"OpenGLRenderer\" \ - -Wall -Wno-unused-parameter -Wunreachable-code \ - -ffast-math -O3 -Werror + -Wall -Wno-unused-parameter -Wunreachable-code -Werror ifeq (true, $(HWUI_NEW_OPS)) hwui_src_files += \ @@ -261,7 +260,8 @@ LOCAL_STATIC_LIBRARIES := libbenchmark libbase LOCAL_SRC_FILES += \ microbench/DisplayListCanvasBench.cpp \ - microbench/LinearAllocatorBench.cpp + microbench/LinearAllocatorBench.cpp \ + microbench/ShadowBench.cpp ifeq (true, $(HWUI_NEW_OPS)) LOCAL_SRC_FILES += \ diff --git a/libs/hwui/TessellationCache.cpp b/libs/hwui/TessellationCache.cpp index 12a3e76c9387..0835c29aee97 100644 --- a/libs/hwui/TessellationCache.cpp +++ b/libs/hwui/TessellationCache.cpp @@ -217,7 +217,7 @@ static void reverseVertexArray(Vertex* polygon, int len) { } } -static void tessellateShadows( +void tessellateShadows( const Matrix4* drawTransform, const Rect* localClip, bool isCasterOpaque, const SkPath* casterPerimeter, const Matrix4* casterTransformXY, const Matrix4* casterTransformZ, diff --git a/libs/hwui/TessellationCache.h b/libs/hwui/TessellationCache.h index b54666b7d595..06e567e114e2 100644 --- a/libs/hwui/TessellationCache.h +++ b/libs/hwui/TessellationCache.h @@ -17,16 +17,22 @@ #ifndef ANDROID_HWUI_TESSELLATION_CACHE_H #define ANDROID_HWUI_TESSELLATION_CACHE_H -#include <utils/LruCache.h> -#include <utils/Mutex.h> - #include "Debug.h" +#include "Matrix.h" +#include "Rect.h" +#include "Vector.h" +#include "thread/TaskProcessor.h" #include "utils/Macros.h" #include "utils/Pair.h" +#include <SkPaint.h> + +#include <utils/LruCache.h> +#include <utils/Mutex.h> +#include <utils/StrongPointer.h> + class SkBitmap; class SkCanvas; -class SkPaint; class SkPath; struct SkRect; @@ -185,6 +191,13 @@ private: }; // class TessellationCache +void tessellateShadows( + const Matrix4* drawTransform, const Rect* localClip, + bool isCasterOpaque, const SkPath* casterPerimeter, + const Matrix4* casterTransformXY, const Matrix4* casterTransformZ, + const Vector3& lightCenter, float lightRadius, + VertexBuffer& ambientBuffer, VertexBuffer& spotBuffer); + }; // namespace uirenderer }; // namespace android diff --git a/libs/hwui/Vector.h b/libs/hwui/Vector.h index 7c3f2fd379e4..6367dbd7b660 100644 --- a/libs/hwui/Vector.h +++ b/libs/hwui/Vector.h @@ -135,8 +135,8 @@ public: } - void dump() { - ALOGD("Vector3[%.2f, %.2f, %.2f]", x, y, z); + void dump(const char* label = "Vector3") const { + ALOGD("%s[%.2f, %.2f, %.2f]", label, x, y, z); } }; diff --git a/libs/hwui/microbench/ShadowBench.cpp b/libs/hwui/microbench/ShadowBench.cpp new file mode 100644 index 000000000000..bd5169391e3d --- /dev/null +++ b/libs/hwui/microbench/ShadowBench.cpp @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2015 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 <benchmark/Benchmark.h> + +#include "Matrix.h" +#include "Rect.h" +#include "Vector.h" +#include "VertexBuffer.h" +#include "TessellationCache.h" +#include "microbench/MicroBench.h" + +#include <SkPath.h> + +#include <memory> + +using namespace android; +using namespace android::uirenderer; + +struct ShadowTestData { + Matrix4 drawTransform; + Rect localClip; + Matrix4 casterTransformXY; + Matrix4 casterTransformZ; + Vector3 lightCenter; + float lightRadius; +}; + +void createShadowTestData(ShadowTestData* out) { + static float SAMPLE_DRAW_TRANSFORM[] = { + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1, + }; + static float SAMPLE_CASTERXY[] = { + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 32, 32, 0, 1, + }; + static float SAMPLE_CASTERZ[] = { + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 32, 32, 32, 1, + }; + static Rect SAMPLE_CLIP(0, 0, 1536, 2048); + static Vector3 SAMPLE_LIGHT_CENTER{768, -400, 1600}; + static float SAMPLE_LIGHT_RADIUS = 1600; + + out->drawTransform.load(SAMPLE_DRAW_TRANSFORM); + out->localClip = SAMPLE_CLIP; + out->casterTransformXY.load(SAMPLE_CASTERXY); + out->casterTransformZ.load(SAMPLE_CASTERZ); + out->lightCenter = SAMPLE_LIGHT_CENTER; + out->lightRadius = SAMPLE_LIGHT_RADIUS; +} + +static inline void tessellateShadows(ShadowTestData& testData, bool opaque, + const SkPath& shape, VertexBuffer* ambient, VertexBuffer* spot) { + tessellateShadows(&testData.drawTransform, &testData.localClip, + opaque, &shape, &testData.casterTransformXY, + &testData.casterTransformZ, testData.lightCenter, + testData.lightRadius, *ambient, *spot); +} + +BENCHMARK_NO_ARG(BM_TessellateShadows_roundrect_opaque); +void BM_TessellateShadows_roundrect_opaque::Run(int iters) { + ShadowTestData shadowData; + createShadowTestData(&shadowData); + SkPath path; + path.reset(); + path.addRoundRect(SkRect::MakeLTRB(0, 0, 100, 100), 5, 5); + + StartBenchmarkTiming(); + for (int i = 0; i < iters; i++) { + std::unique_ptr<VertexBuffer> ambient(new VertexBuffer); + std::unique_ptr<VertexBuffer> spot(new VertexBuffer); + tessellateShadows(shadowData, true, path, ambient.get(), spot.get()); + MicroBench::DoNotOptimize(ambient.get()); + MicroBench::DoNotOptimize(spot.get()); + } + StopBenchmarkTiming(); +} + +BENCHMARK_NO_ARG(BM_TessellateShadows_roundrect_translucent); +void BM_TessellateShadows_roundrect_translucent::Run(int iters) { + ShadowTestData shadowData; + createShadowTestData(&shadowData); + SkPath path; + path.reset(); + path.addRoundRect(SkRect::MakeLTRB(0, 0, 100, 100), 5, 5); + + StartBenchmarkTiming(); + for (int i = 0; i < iters; i++) { + std::unique_ptr<VertexBuffer> ambient(new VertexBuffer); + std::unique_ptr<VertexBuffer> spot(new VertexBuffer); + tessellateShadows(shadowData, false, path, ambient.get(), spot.get()); + MicroBench::DoNotOptimize(ambient.get()); + MicroBench::DoNotOptimize(spot.get()); + } + StopBenchmarkTiming(); +} |