diff options
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/androidfw/ResourceTypes.cpp | 7 | ||||
| -rw-r--r-- | libs/androidfw/include/androidfw/ResourceTypes.h | 1 | ||||
| -rw-r--r-- | libs/hwui/Properties.cpp | 2 | ||||
| -rw-r--r-- | libs/hwui/pipeline/skia/SkiaPipeline.cpp | 18 | ||||
| -rw-r--r-- | libs/hwui/renderstate/Blend.h | 8 | ||||
| -rw-r--r-- | libs/hwui/tests/unit/BakedOpRendererTests.cpp | 51 |
6 files changed, 80 insertions, 7 deletions
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp index 0782269d7de1..7a0ef2b770ce 100644 --- a/libs/androidfw/ResourceTypes.cpp +++ b/libs/androidfw/ResourceTypes.cpp @@ -59,7 +59,6 @@ namespace android { #endif #define IDMAP_MAGIC 0x504D4449 -#define IDMAP_CURRENT_VERSION 0x00000001 #define APP_PACKAGE_ID 0x7f #define SYS_PACKAGE_ID 0x01 @@ -246,11 +245,11 @@ static bool assertIdmapHeader(const void* idmap, size_t size) { } const uint32_t version = htodl(*(reinterpret_cast<const uint32_t*>(idmap) + 1)); - if (version != IDMAP_CURRENT_VERSION) { + if (version != ResTable::IDMAP_CURRENT_VERSION) { // We are strict about versions because files with this format are // auto-generated and don't need backwards compatibility. ALOGW("idmap: version mismatch in header (is 0x%08x, expected 0x%08x)", - version, IDMAP_CURRENT_VERSION); + version, ResTable::IDMAP_CURRENT_VERSION); return false; } return true; @@ -6855,7 +6854,7 @@ status_t ResTable::createIdmap(const ResTable& overlay, uint32_t* data = (uint32_t*)*outData; *data++ = htodl(IDMAP_MAGIC); - *data++ = htodl(IDMAP_CURRENT_VERSION); + *data++ = htodl(ResTable::IDMAP_CURRENT_VERSION); *data++ = htodl(targetCrc); *data++ = htodl(overlayCrc); const char* paths[] = { targetPath, overlayPath }; diff --git a/libs/androidfw/include/androidfw/ResourceTypes.h b/libs/androidfw/include/androidfw/ResourceTypes.h index 7a6e37d41b7c..66c66c251d9b 100644 --- a/libs/androidfw/include/androidfw/ResourceTypes.h +++ b/libs/androidfw/include/androidfw/ResourceTypes.h @@ -1933,6 +1933,7 @@ public: void** outData, size_t* outSize) const; static const size_t IDMAP_HEADER_SIZE_BYTES = 4 * sizeof(uint32_t) + 2 * 256; + static const uint32_t IDMAP_CURRENT_VERSION = 0x00000001; // Retrieve idmap meta-data. // diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp index fe291d2a4bfe..3b59bb1a8f02 100644 --- a/libs/hwui/Properties.cpp +++ b/libs/hwui/Properties.cpp @@ -177,7 +177,7 @@ RenderPipelineType Properties::getRenderPipelineType() { return sRenderPipelineType; } char prop[PROPERTY_VALUE_MAX]; - property_get(PROPERTY_RENDERER, prop, "opengl"); + property_get(PROPERTY_RENDERER, prop, "skiagl"); if (!strcmp(prop, "skiagl") ) { ALOGD("Skia GL Pipeline"); sRenderPipelineType = RenderPipelineType::SkiaGL; diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp index 742f14d04db4..a967d2a10b58 100644 --- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp @@ -83,7 +83,8 @@ void SkiaPipeline::renderLayers(const FrameBuilder::LightGeometry& lightGeometry void SkiaPipeline::renderLayersImpl(const LayerUpdateQueue& layers, bool opaque, bool wideColorGamut) { - // TODO: Handle wide color gamut + sk_sp<GrContext> cachedContext; + // Render all layers that need to be updated, in order. for (size_t i = 0; i < layers.entries().size(); i++) { RenderNode* layerNode = layers.entries()[i].renderNode.get(); @@ -126,10 +127,23 @@ void SkiaPipeline::renderLayersImpl(const LayerUpdateQueue& layers, RenderNodeDrawable root(layerNode, layerCanvas, false); root.forceDraw(layerCanvas); layerCanvas->restoreToCount(saveCount); - layerCanvas->flush(); mLightCenter = savedLightCenter; + + // cache the current context so that we can defer flushing it until + // either all the layers have been rendered or the context changes + GrContext* currentContext = layerCanvas->getGrContext(); + if (cachedContext.get() != currentContext) { + if (cachedContext.get()) { + cachedContext->flush(); + } + cachedContext.reset(SkSafeRef(currentContext)); + } } } + + if (cachedContext.get()) { + cachedContext->flush(); + } } bool SkiaPipeline::createOrUpdateLayer(RenderNode* node, diff --git a/libs/hwui/renderstate/Blend.h b/libs/hwui/renderstate/Blend.h index ec0e114c998f..a9de24631340 100644 --- a/libs/hwui/renderstate/Blend.h +++ b/libs/hwui/renderstate/Blend.h @@ -40,6 +40,14 @@ public: GLenum* outSrc, GLenum* outDst); void setFactors(GLenum src, GLenum dst); + bool getEnabled() { + return mEnabled; + } + void getFactors(GLenum* src, GLenum* dst) { + *src = mSrcMode; + *dst = mDstMode; + } + void dump(); private: Blend(); diff --git a/libs/hwui/tests/unit/BakedOpRendererTests.cpp b/libs/hwui/tests/unit/BakedOpRendererTests.cpp index 603599ceb88a..38e106a8ab77 100644 --- a/libs/hwui/tests/unit/BakedOpRendererTests.cpp +++ b/libs/hwui/tests/unit/BakedOpRendererTests.cpp @@ -17,6 +17,7 @@ #include <gtest/gtest.h> #include <BakedOpRenderer.h> +#include <GlopBuilder.h> #include <tests/common/TestUtils.h> using namespace android::uirenderer; @@ -53,3 +54,53 @@ RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpRenderer, startRepaintLayer_clear) { renderer.endLayer(); } } + +static void drawFirstOp(RenderState& renderState, int color, SkBlendMode mode) { + BakedOpRenderer renderer(Caches::getInstance(), renderState, true, false, sLightInfo); + + renderer.startFrame(100, 100, Rect(100, 100)); + SkPaint paint; + paint.setColor(color); + paint.setBlendMode(mode); + + Rect dest(0, 0, 100, 100); + Glop glop; + GlopBuilder(renderState, Caches::getInstance(), &glop) + .setRoundRectClipState(nullptr) + .setMeshUnitQuad() + .setFillPaint(paint, 1.0f) + .setTransform(Matrix4::identity(), TransformFlags::None) + .setModelViewMapUnitToRectSnap(dest) + .build(); + renderer.renderGlop(nullptr, nullptr, glop); + renderer.endFrame(Rect(100, 100)); +} + +static void verifyBlend(RenderState& renderState, GLenum expectedSrc, GLenum expectedDst) { + EXPECT_TRUE(renderState.blend().getEnabled()); + GLenum src; + GLenum dst; + renderState.blend().getFactors(&src, &dst); + EXPECT_EQ(expectedSrc, src); + EXPECT_EQ(expectedDst, dst); +} + +static void verifyBlendDisabled(RenderState& renderState) { + EXPECT_FALSE(renderState.blend().getEnabled()); +} + +RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpRenderer, firstDrawBlend_clear) { + // initialize blend state to nonsense value + renderThread.renderState().blend().setFactors(GL_ONE, GL_ONE); + + drawFirstOp(renderThread.renderState(), 0xfeff0000, SkBlendMode::kClear); + verifyBlend(renderThread.renderState(), GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); +} + +RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpRenderer, firstDrawBlend_srcover) { + // initialize blend state to nonsense value + renderThread.renderState().blend().setFactors(GL_ONE, GL_ONE); + + drawFirstOp(renderThread.renderState(), 0xfeff0000, SkBlendMode::kSrcOver); + verifyBlendDisabled(renderThread.renderState()); +} |