Loading libs/hwui/DisplayListRenderer.cpp +8 −14 Original line number Diff line number Diff line Loading @@ -128,10 +128,10 @@ DisplayList::~DisplayList() { } mBitmapResources.clear(); for (size_t i = 0; i < mShaderResources.size(); i++) { caches.resourceCache.decrementRefcount(mShaderResources.itemAt(i)); for (size_t i = 0; i < mShaders.size(); i++) { delete mShaders.itemAt(i); } mShaderResources.clear(); mShaders.clear(); for (size_t i = 0; i < mPaints.size(); i++) { delete mPaints.itemAt(i); Loading Loading @@ -179,11 +179,9 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde caches.resourceCache.incrementRefcount(resource); } const Vector<SkiaShader*> &shaderResources = recorder.getShaderResources(); for (size_t i = 0; i < shaderResources.size(); i++) { SkiaShader* resource = shaderResources.itemAt(i); mShaderResources.add(resource); caches.resourceCache.incrementRefcount(resource); const Vector<SkiaShader*> &shaders = recorder.getShaders(); for (size_t i = 0; i < shaders.size(); i++) { mShaders.add(shaders.itemAt(i)); } const Vector<SkPaint*> &paints = recorder.getPaints(); Loading Loading @@ -407,14 +405,10 @@ void DisplayListRenderer::reset() { } mBitmapResources.clear(); for (size_t i = 0; i < mShaderResources.size(); i++) { SkiaShader* resource = mShaderResources.itemAt(i); caches.resourceCache.decrementRefcount(resource); } mShaderResources.clear(); mPaints.clear(); mPaintMap.clear(); mShaders.clear(); mShaderMap.clear(); mMatrices.clear(); } Loading libs/hwui/DisplayListRenderer.h +23 −10 Original line number Diff line number Diff line Loading @@ -206,11 +206,11 @@ private: PathHeap* mPathHeap; Vector<SkBitmap*> mBitmapResources; Vector<SkiaShader*> mShaderResources; Vector<SkiaColorFilter*> mFilterResources; Vector<SkPaint*> mPaints; Vector<SkMatrix*> mMatrices; Vector<SkiaShader*> mShaders; mutable SkFlattenableReadBuffer mReader; Loading Loading @@ -291,8 +291,8 @@ public: return mBitmapResources; } const Vector<SkiaShader*>& getShaderResources() const { return mShaderResources; const Vector<SkiaShader*>& getShaders() const { return mShaders; } const Vector<SkPaint*>& getPaints() const { Loading Loading @@ -366,7 +366,7 @@ private: } inline void addPaint(SkPaint* paint) { if (paint == NULL) { if (!paint) { addInt((int) NULL); return; } Loading Loading @@ -406,10 +406,20 @@ private: } inline void addShader(SkiaShader* shader) { addInt((int) shader); mShaderResources.add(shader); Caches& caches = Caches::getInstance(); caches.resourceCache.incrementRefcount(shader); if (!shader) { addInt((int) NULL); return; } SkiaShader* shaderCopy = mShaderMap.valueFor(shader); // TODO: We also need to handle generation ID changes in compose shaders if (!shaderCopy || shaderCopy->getGenerationId() != shader->getGenerationId()) { shaderCopy = shader->copy(); mShaderMap.add(shader, shaderCopy); mShaders.add(shader); } addInt((int) shaderCopy); } inline void addColorFilter(SkiaColorFilter* colorFilter) { Loading @@ -422,11 +432,14 @@ private: SkChunkAlloc mHeap; Vector<SkBitmap*> mBitmapResources; Vector<SkiaShader*> mShaderResources; Vector<SkiaColorFilter*> mFilterResources; Vector<SkPaint*> mPaints; DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap; Vector<SkiaShader*> mShaders; DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap; Vector<SkMatrix*> mMatrices; PathHeap* mPathHeap; Loading libs/hwui/SkiaShader.cpp +56 −0 Original line number Diff line number Diff line Loading @@ -47,10 +47,22 @@ static const GLint gTileModes[] = { // Base shader /////////////////////////////////////////////////////////////////////////////// void SkiaShader::copyFrom(const SkiaShader& shader) { mType = shader.mType; mKey = shader.mKey; mTileX = shader.mTileX; mTileY = shader.mTileY; mBlend = shader.mBlend; mUnitMatrix = shader.mUnitMatrix; mShaderMatrix = shader.mShaderMatrix; mGenerationId = shader.mGenerationId; } SkiaShader::SkiaShader(Type type, SkShader* key, SkShader::TileMode tileX, SkShader::TileMode tileY, SkMatrix* matrix, bool blend): mType(type), mKey(key), mTileX(tileX), mTileY(tileY), mBlend(blend) { setMatrix(matrix); mGenerationId = 0; } SkiaShader::~SkiaShader() { Loading Loading @@ -90,6 +102,13 @@ SkiaBitmapShader::SkiaBitmapShader(SkBitmap* bitmap, SkShader* key, SkShader::Ti updateLocalMatrix(matrix); } SkiaShader* SkiaBitmapShader::copy() { SkiaBitmapShader* copy = new SkiaBitmapShader(); copy->copyFrom(*this); copy->mBitmap = mBitmap; return copy; } void SkiaBitmapShader::describe(ProgramDescription& description, const Extensions& extensions) { Texture* texture = mTextureCache->get(mBitmap); if (!texture) return; Loading Loading @@ -183,6 +202,16 @@ SkiaLinearGradientShader::~SkiaLinearGradientShader() { delete[] mPositions; } SkiaShader* SkiaLinearGradientShader::copy() { SkiaLinearGradientShader* copy = new SkiaLinearGradientShader(); copy->copyFrom(*this); copy->mBounds = mBounds; copy->mColors = mColors; copy->mPositions = mPositions; copy->mCount = mCount; return copy; } void SkiaLinearGradientShader::describe(ProgramDescription& description, const Extensions& extensions) { description.hasGradient = true; Loading Loading @@ -238,6 +267,15 @@ SkiaCircularGradientShader::SkiaCircularGradientShader(float x, float y, float r updateLocalMatrix(matrix); } SkiaShader* SkiaCircularGradientShader::copy() { SkiaCircularGradientShader* copy = new SkiaCircularGradientShader(); copy->copyFrom(*this); copy->mColors = mColors; copy->mPositions = mPositions; copy->mCount = mCount; return copy; } void SkiaCircularGradientShader::describe(ProgramDescription& description, const Extensions& extensions) { description.hasGradient = true; Loading Loading @@ -276,6 +314,15 @@ SkiaSweepGradientShader::~SkiaSweepGradientShader() { delete[] mPositions; } SkiaShader* SkiaSweepGradientShader::copy() { SkiaSweepGradientShader* copy = new SkiaSweepGradientShader(); copy->copyFrom(*this); copy->mColors = mColors; copy->mPositions = mPositions; copy->mCount = mCount; return copy; } void SkiaSweepGradientShader::describe(ProgramDescription& description, const Extensions& extensions) { description.hasGradient = true; Loading Loading @@ -318,6 +365,15 @@ SkiaComposeShader::SkiaComposeShader(SkiaShader* first, SkiaShader* second, NULL, first->blend() || second->blend()), mFirst(first), mSecond(second), mMode(mode) { } SkiaShader* SkiaComposeShader::copy() { SkiaComposeShader* copy = new SkiaComposeShader(); copy->copyFrom(*this); copy->mFirst = mFirst; copy->mSecond = mSecond; copy->mMode = mMode; return copy; } void SkiaComposeShader::set(TextureCache* textureCache, GradientCache* gradientCache) { SkiaShader::set(textureCache, gradientCache); mFirst->set(textureCache, gradientCache); Loading libs/hwui/SkiaShader.h +34 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,9 @@ struct SkiaShader { SkMatrix* matrix, bool blend); virtual ~SkiaShader(); virtual SkiaShader* copy() = 0; void copyFrom(const SkiaShader& shader); virtual void describe(ProgramDescription& description, const Extensions& extensions); virtual void setupProgram(Program* program, const mat4& modelView, const Snapshot& snapshot, GLuint* textureUnit); Loading @@ -81,8 +84,13 @@ struct SkiaShader { const Snapshot& snapshot) { } uint32_t getGenerationId() { return mGenerationId; } void setMatrix(SkMatrix* matrix) { updateLocalMatrix(matrix); mGenerationId++; } void updateLocalMatrix(const SkMatrix* matrix) { Loading @@ -97,6 +105,9 @@ struct SkiaShader { void computeScreenSpaceMatrix(mat4& screenSpace, const mat4& modelView); protected: SkiaShader() { } /** * The appropriate texture unit must have been activated prior to invoking * this method. Loading @@ -114,6 +125,9 @@ protected: mat4 mUnitMatrix; mat4 mShaderMatrix; private: uint32_t mGenerationId; }; // struct SkiaShader Loading @@ -127,6 +141,7 @@ protected: struct SkiaBitmapShader: public SkiaShader { SkiaBitmapShader(SkBitmap* bitmap, SkShader* key, SkShader::TileMode tileX, SkShader::TileMode tileY, SkMatrix* matrix, bool blend); SkiaShader* copy(); void describe(ProgramDescription& description, const Extensions& extensions); void setupProgram(Program* program, const mat4& modelView, const Snapshot& snapshot, Loading @@ -134,6 +149,9 @@ struct SkiaBitmapShader: public SkiaShader { void updateTransforms(Program* program, const mat4& modelView, const Snapshot& snapshot); private: SkiaBitmapShader() { } /** * This method does not work for n == 0. */ Loading @@ -154,6 +172,7 @@ struct SkiaLinearGradientShader: public SkiaShader { SkiaLinearGradientShader(float* bounds, uint32_t* colors, float* positions, int count, SkShader* key, SkShader::TileMode tileMode, SkMatrix* matrix, bool blend); ~SkiaLinearGradientShader(); SkiaShader* copy(); void describe(ProgramDescription& description, const Extensions& extensions); void setupProgram(Program* program, const mat4& modelView, const Snapshot& snapshot, Loading @@ -161,6 +180,9 @@ struct SkiaLinearGradientShader: public SkiaShader { void updateTransforms(Program* program, const mat4& modelView, const Snapshot& snapshot); private: SkiaLinearGradientShader() { } float* mBounds; uint32_t* mColors; float* mPositions; Loading @@ -174,6 +196,7 @@ struct SkiaSweepGradientShader: public SkiaShader { SkiaSweepGradientShader(float x, float y, uint32_t* colors, float* positions, int count, SkShader* key, SkMatrix* matrix, bool blend); ~SkiaSweepGradientShader(); SkiaShader* copy(); virtual void describe(ProgramDescription& description, const Extensions& extensions); void setupProgram(Program* program, const mat4& modelView, const Snapshot& snapshot, Loading @@ -183,6 +206,8 @@ struct SkiaSweepGradientShader: public SkiaShader { protected: SkiaSweepGradientShader(Type type, float x, float y, uint32_t* colors, float* positions, int count, SkShader* key, SkShader::TileMode tileMode, SkMatrix* matrix, bool blend); SkiaSweepGradientShader() { } uint32_t* mColors; float* mPositions; Loading @@ -195,8 +220,13 @@ protected: struct SkiaCircularGradientShader: public SkiaSweepGradientShader { SkiaCircularGradientShader(float x, float y, float radius, uint32_t* colors, float* positions, int count, SkShader* key,SkShader::TileMode tileMode, SkMatrix* matrix, bool blend); SkiaShader* copy(); void describe(ProgramDescription& description, const Extensions& extensions); private: SkiaCircularGradientShader() { } }; // struct SkiaCircularGradientShader /** Loading @@ -204,6 +234,7 @@ struct SkiaCircularGradientShader: public SkiaSweepGradientShader { */ struct SkiaComposeShader: public SkiaShader { SkiaComposeShader(SkiaShader* first, SkiaShader* second, SkXfermode::Mode mode, SkShader* key); SkiaShader* copy(); void set(TextureCache* textureCache, GradientCache* gradientCache); Loading @@ -212,6 +243,9 @@ struct SkiaComposeShader: public SkiaShader { GLuint* textureUnit); private: SkiaComposeShader() { } SkiaShader* mFirst; SkiaShader* mSecond; SkXfermode::Mode mMode; Loading Loading
libs/hwui/DisplayListRenderer.cpp +8 −14 Original line number Diff line number Diff line Loading @@ -128,10 +128,10 @@ DisplayList::~DisplayList() { } mBitmapResources.clear(); for (size_t i = 0; i < mShaderResources.size(); i++) { caches.resourceCache.decrementRefcount(mShaderResources.itemAt(i)); for (size_t i = 0; i < mShaders.size(); i++) { delete mShaders.itemAt(i); } mShaderResources.clear(); mShaders.clear(); for (size_t i = 0; i < mPaints.size(); i++) { delete mPaints.itemAt(i); Loading Loading @@ -179,11 +179,9 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde caches.resourceCache.incrementRefcount(resource); } const Vector<SkiaShader*> &shaderResources = recorder.getShaderResources(); for (size_t i = 0; i < shaderResources.size(); i++) { SkiaShader* resource = shaderResources.itemAt(i); mShaderResources.add(resource); caches.resourceCache.incrementRefcount(resource); const Vector<SkiaShader*> &shaders = recorder.getShaders(); for (size_t i = 0; i < shaders.size(); i++) { mShaders.add(shaders.itemAt(i)); } const Vector<SkPaint*> &paints = recorder.getPaints(); Loading Loading @@ -407,14 +405,10 @@ void DisplayListRenderer::reset() { } mBitmapResources.clear(); for (size_t i = 0; i < mShaderResources.size(); i++) { SkiaShader* resource = mShaderResources.itemAt(i); caches.resourceCache.decrementRefcount(resource); } mShaderResources.clear(); mPaints.clear(); mPaintMap.clear(); mShaders.clear(); mShaderMap.clear(); mMatrices.clear(); } Loading
libs/hwui/DisplayListRenderer.h +23 −10 Original line number Diff line number Diff line Loading @@ -206,11 +206,11 @@ private: PathHeap* mPathHeap; Vector<SkBitmap*> mBitmapResources; Vector<SkiaShader*> mShaderResources; Vector<SkiaColorFilter*> mFilterResources; Vector<SkPaint*> mPaints; Vector<SkMatrix*> mMatrices; Vector<SkiaShader*> mShaders; mutable SkFlattenableReadBuffer mReader; Loading Loading @@ -291,8 +291,8 @@ public: return mBitmapResources; } const Vector<SkiaShader*>& getShaderResources() const { return mShaderResources; const Vector<SkiaShader*>& getShaders() const { return mShaders; } const Vector<SkPaint*>& getPaints() const { Loading Loading @@ -366,7 +366,7 @@ private: } inline void addPaint(SkPaint* paint) { if (paint == NULL) { if (!paint) { addInt((int) NULL); return; } Loading Loading @@ -406,10 +406,20 @@ private: } inline void addShader(SkiaShader* shader) { addInt((int) shader); mShaderResources.add(shader); Caches& caches = Caches::getInstance(); caches.resourceCache.incrementRefcount(shader); if (!shader) { addInt((int) NULL); return; } SkiaShader* shaderCopy = mShaderMap.valueFor(shader); // TODO: We also need to handle generation ID changes in compose shaders if (!shaderCopy || shaderCopy->getGenerationId() != shader->getGenerationId()) { shaderCopy = shader->copy(); mShaderMap.add(shader, shaderCopy); mShaders.add(shader); } addInt((int) shaderCopy); } inline void addColorFilter(SkiaColorFilter* colorFilter) { Loading @@ -422,11 +432,14 @@ private: SkChunkAlloc mHeap; Vector<SkBitmap*> mBitmapResources; Vector<SkiaShader*> mShaderResources; Vector<SkiaColorFilter*> mFilterResources; Vector<SkPaint*> mPaints; DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap; Vector<SkiaShader*> mShaders; DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap; Vector<SkMatrix*> mMatrices; PathHeap* mPathHeap; Loading
libs/hwui/SkiaShader.cpp +56 −0 Original line number Diff line number Diff line Loading @@ -47,10 +47,22 @@ static const GLint gTileModes[] = { // Base shader /////////////////////////////////////////////////////////////////////////////// void SkiaShader::copyFrom(const SkiaShader& shader) { mType = shader.mType; mKey = shader.mKey; mTileX = shader.mTileX; mTileY = shader.mTileY; mBlend = shader.mBlend; mUnitMatrix = shader.mUnitMatrix; mShaderMatrix = shader.mShaderMatrix; mGenerationId = shader.mGenerationId; } SkiaShader::SkiaShader(Type type, SkShader* key, SkShader::TileMode tileX, SkShader::TileMode tileY, SkMatrix* matrix, bool blend): mType(type), mKey(key), mTileX(tileX), mTileY(tileY), mBlend(blend) { setMatrix(matrix); mGenerationId = 0; } SkiaShader::~SkiaShader() { Loading Loading @@ -90,6 +102,13 @@ SkiaBitmapShader::SkiaBitmapShader(SkBitmap* bitmap, SkShader* key, SkShader::Ti updateLocalMatrix(matrix); } SkiaShader* SkiaBitmapShader::copy() { SkiaBitmapShader* copy = new SkiaBitmapShader(); copy->copyFrom(*this); copy->mBitmap = mBitmap; return copy; } void SkiaBitmapShader::describe(ProgramDescription& description, const Extensions& extensions) { Texture* texture = mTextureCache->get(mBitmap); if (!texture) return; Loading Loading @@ -183,6 +202,16 @@ SkiaLinearGradientShader::~SkiaLinearGradientShader() { delete[] mPositions; } SkiaShader* SkiaLinearGradientShader::copy() { SkiaLinearGradientShader* copy = new SkiaLinearGradientShader(); copy->copyFrom(*this); copy->mBounds = mBounds; copy->mColors = mColors; copy->mPositions = mPositions; copy->mCount = mCount; return copy; } void SkiaLinearGradientShader::describe(ProgramDescription& description, const Extensions& extensions) { description.hasGradient = true; Loading Loading @@ -238,6 +267,15 @@ SkiaCircularGradientShader::SkiaCircularGradientShader(float x, float y, float r updateLocalMatrix(matrix); } SkiaShader* SkiaCircularGradientShader::copy() { SkiaCircularGradientShader* copy = new SkiaCircularGradientShader(); copy->copyFrom(*this); copy->mColors = mColors; copy->mPositions = mPositions; copy->mCount = mCount; return copy; } void SkiaCircularGradientShader::describe(ProgramDescription& description, const Extensions& extensions) { description.hasGradient = true; Loading Loading @@ -276,6 +314,15 @@ SkiaSweepGradientShader::~SkiaSweepGradientShader() { delete[] mPositions; } SkiaShader* SkiaSweepGradientShader::copy() { SkiaSweepGradientShader* copy = new SkiaSweepGradientShader(); copy->copyFrom(*this); copy->mColors = mColors; copy->mPositions = mPositions; copy->mCount = mCount; return copy; } void SkiaSweepGradientShader::describe(ProgramDescription& description, const Extensions& extensions) { description.hasGradient = true; Loading Loading @@ -318,6 +365,15 @@ SkiaComposeShader::SkiaComposeShader(SkiaShader* first, SkiaShader* second, NULL, first->blend() || second->blend()), mFirst(first), mSecond(second), mMode(mode) { } SkiaShader* SkiaComposeShader::copy() { SkiaComposeShader* copy = new SkiaComposeShader(); copy->copyFrom(*this); copy->mFirst = mFirst; copy->mSecond = mSecond; copy->mMode = mMode; return copy; } void SkiaComposeShader::set(TextureCache* textureCache, GradientCache* gradientCache) { SkiaShader::set(textureCache, gradientCache); mFirst->set(textureCache, gradientCache); Loading
libs/hwui/SkiaShader.h +34 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,9 @@ struct SkiaShader { SkMatrix* matrix, bool blend); virtual ~SkiaShader(); virtual SkiaShader* copy() = 0; void copyFrom(const SkiaShader& shader); virtual void describe(ProgramDescription& description, const Extensions& extensions); virtual void setupProgram(Program* program, const mat4& modelView, const Snapshot& snapshot, GLuint* textureUnit); Loading @@ -81,8 +84,13 @@ struct SkiaShader { const Snapshot& snapshot) { } uint32_t getGenerationId() { return mGenerationId; } void setMatrix(SkMatrix* matrix) { updateLocalMatrix(matrix); mGenerationId++; } void updateLocalMatrix(const SkMatrix* matrix) { Loading @@ -97,6 +105,9 @@ struct SkiaShader { void computeScreenSpaceMatrix(mat4& screenSpace, const mat4& modelView); protected: SkiaShader() { } /** * The appropriate texture unit must have been activated prior to invoking * this method. Loading @@ -114,6 +125,9 @@ protected: mat4 mUnitMatrix; mat4 mShaderMatrix; private: uint32_t mGenerationId; }; // struct SkiaShader Loading @@ -127,6 +141,7 @@ protected: struct SkiaBitmapShader: public SkiaShader { SkiaBitmapShader(SkBitmap* bitmap, SkShader* key, SkShader::TileMode tileX, SkShader::TileMode tileY, SkMatrix* matrix, bool blend); SkiaShader* copy(); void describe(ProgramDescription& description, const Extensions& extensions); void setupProgram(Program* program, const mat4& modelView, const Snapshot& snapshot, Loading @@ -134,6 +149,9 @@ struct SkiaBitmapShader: public SkiaShader { void updateTransforms(Program* program, const mat4& modelView, const Snapshot& snapshot); private: SkiaBitmapShader() { } /** * This method does not work for n == 0. */ Loading @@ -154,6 +172,7 @@ struct SkiaLinearGradientShader: public SkiaShader { SkiaLinearGradientShader(float* bounds, uint32_t* colors, float* positions, int count, SkShader* key, SkShader::TileMode tileMode, SkMatrix* matrix, bool blend); ~SkiaLinearGradientShader(); SkiaShader* copy(); void describe(ProgramDescription& description, const Extensions& extensions); void setupProgram(Program* program, const mat4& modelView, const Snapshot& snapshot, Loading @@ -161,6 +180,9 @@ struct SkiaLinearGradientShader: public SkiaShader { void updateTransforms(Program* program, const mat4& modelView, const Snapshot& snapshot); private: SkiaLinearGradientShader() { } float* mBounds; uint32_t* mColors; float* mPositions; Loading @@ -174,6 +196,7 @@ struct SkiaSweepGradientShader: public SkiaShader { SkiaSweepGradientShader(float x, float y, uint32_t* colors, float* positions, int count, SkShader* key, SkMatrix* matrix, bool blend); ~SkiaSweepGradientShader(); SkiaShader* copy(); virtual void describe(ProgramDescription& description, const Extensions& extensions); void setupProgram(Program* program, const mat4& modelView, const Snapshot& snapshot, Loading @@ -183,6 +206,8 @@ struct SkiaSweepGradientShader: public SkiaShader { protected: SkiaSweepGradientShader(Type type, float x, float y, uint32_t* colors, float* positions, int count, SkShader* key, SkShader::TileMode tileMode, SkMatrix* matrix, bool blend); SkiaSweepGradientShader() { } uint32_t* mColors; float* mPositions; Loading @@ -195,8 +220,13 @@ protected: struct SkiaCircularGradientShader: public SkiaSweepGradientShader { SkiaCircularGradientShader(float x, float y, float radius, uint32_t* colors, float* positions, int count, SkShader* key,SkShader::TileMode tileMode, SkMatrix* matrix, bool blend); SkiaShader* copy(); void describe(ProgramDescription& description, const Extensions& extensions); private: SkiaCircularGradientShader() { } }; // struct SkiaCircularGradientShader /** Loading @@ -204,6 +234,7 @@ struct SkiaCircularGradientShader: public SkiaSweepGradientShader { */ struct SkiaComposeShader: public SkiaShader { SkiaComposeShader(SkiaShader* first, SkiaShader* second, SkXfermode::Mode mode, SkShader* key); SkiaShader* copy(); void set(TextureCache* textureCache, GradientCache* gradientCache); Loading @@ -212,6 +243,9 @@ struct SkiaComposeShader: public SkiaShader { GLuint* textureUnit); private: SkiaComposeShader() { } SkiaShader* mFirst; SkiaShader* mSecond; SkXfermode::Mode mMode; Loading