diff options
| -rw-r--r-- | libs/hwui/DeferredLayerUpdater.cpp | 23 | ||||
| -rw-r--r-- | libs/hwui/DeferredLayerUpdater.h | 2 | ||||
| -rw-r--r-- | libs/hwui/GlLayer.cpp | 12 | ||||
| -rw-r--r-- | libs/hwui/GlLayer.h | 13 | ||||
| -rw-r--r-- | libs/hwui/tests/common/TestUtils.cpp | 6 | ||||
| -rw-r--r-- | libs/hwui/tests/unit/DeferredLayerUpdaterTests.cpp | 7 |
6 files changed, 27 insertions, 36 deletions
diff --git a/libs/hwui/DeferredLayerUpdater.cpp b/libs/hwui/DeferredLayerUpdater.cpp index 00e8c05c21c3..ff90160b8855 100644 --- a/libs/hwui/DeferredLayerUpdater.cpp +++ b/libs/hwui/DeferredLayerUpdater.cpp @@ -98,6 +98,8 @@ void DeferredLayerUpdater::apply() { mUpdateTexImage = false; doUpdateTexImage(); } + GLenum renderTarget = mSurfaceTexture->getCurrentTextureTarget(); + static_cast<GlLayer*>(mLayer)->setRenderTarget(renderTarget); } if (mTransform) { mLayer->getTransform().load(*mTransform); @@ -140,12 +142,8 @@ void DeferredLayerUpdater::doUpdateTexImage() { } #endif mSurfaceTexture->getTransformMatrix(transform); - GLenum renderTarget = mSurfaceTexture->getCurrentTextureTarget(); - LOG_ALWAYS_FATAL_IF(renderTarget != GL_TEXTURE_2D && renderTarget != GL_TEXTURE_EXTERNAL_OES, - "doUpdateTexImage target %x, 2d %x, EXT %x", - renderTarget, GL_TEXTURE_2D, GL_TEXTURE_EXTERNAL_OES); - updateLayer(forceFilter, renderTarget, transform); + updateLayer(forceFilter, transform); } } @@ -155,28 +153,17 @@ void DeferredLayerUpdater::doUpdateVkTexImage() { mLayer->getApi(), Layer::Api::OpenGL, Layer::Api::Vulkan); static const mat4 identityMatrix; - updateLayer(false, GL_NONE, identityMatrix.data); + updateLayer(false, identityMatrix.data); VkLayer* vkLayer = static_cast<VkLayer*>(mLayer); vkLayer->updateTexture(); } -void DeferredLayerUpdater::updateLayer(bool forceFilter, GLenum renderTarget, - const float* textureTransform) { +void DeferredLayerUpdater::updateLayer(bool forceFilter, const float* textureTransform) { mLayer->setBlend(mBlend); mLayer->setForceFilter(forceFilter); mLayer->setSize(mWidth, mHeight); mLayer->getTexTransform().load(textureTransform); - - if (mLayer->getApi() == Layer::Api::OpenGL) { - GlLayer* glLayer = static_cast<GlLayer*>(mLayer); - if (renderTarget != glLayer->getRenderTarget()) { - glLayer->setRenderTarget(renderTarget); - glLayer->bindTexture(); - glLayer->setFilter(GL_NEAREST, false, true); - glLayer->setWrap(GL_CLAMP_TO_EDGE, false, true); - } - } } void DeferredLayerUpdater::detachSurfaceTexture() { diff --git a/libs/hwui/DeferredLayerUpdater.h b/libs/hwui/DeferredLayerUpdater.h index 67173615d411..6164e4744da5 100644 --- a/libs/hwui/DeferredLayerUpdater.h +++ b/libs/hwui/DeferredLayerUpdater.h @@ -101,7 +101,7 @@ public: void detachSurfaceTexture(); - void updateLayer(bool forceFilter, GLenum renderTarget, const float* textureTransform); + void updateLayer(bool forceFilter, const float* textureTransform); void destroyLayer(); diff --git a/libs/hwui/GlLayer.cpp b/libs/hwui/GlLayer.cpp index aacad548c68b..070e95432a11 100644 --- a/libs/hwui/GlLayer.cpp +++ b/libs/hwui/GlLayer.cpp @@ -55,9 +55,15 @@ void GlLayer::onGlContextLost() { texture.deleteTexture(); } -void GlLayer::bindTexture() const { - if (texture.mId) { - caches.textureState().bindTexture(texture.target(), texture.mId); +void GlLayer::setRenderTarget(GLenum renderTarget) { + if (renderTarget != getRenderTarget()) { + // new render target: bind with new target, and update filter/wrap + texture.mTarget = renderTarget; + if (texture.mId) { + caches.textureState().bindTexture(texture.target(), texture.mId); + } + texture.setFilter(GL_NEAREST, false, true); + texture.setWrap(GL_CLAMP_TO_EDGE, false, true); } } diff --git a/libs/hwui/GlLayer.h b/libs/hwui/GlLayer.h index 85ddaff99503..20aaf4a35ac1 100644 --- a/libs/hwui/GlLayer.h +++ b/libs/hwui/GlLayer.h @@ -68,23 +68,12 @@ public: return texture.target(); } - inline void setRenderTarget(GLenum renderTarget) { - texture.mTarget = renderTarget; - } - inline bool isRenderable() const { return texture.target() != GL_NONE; } - void setWrap(GLenum wrap, bool bindTexture = false, bool force = false) { - texture.setWrap(wrap, bindTexture, force); - } - - void setFilter(GLenum filter, bool bindTexture = false, bool force = false) { - texture.setFilter(filter, bindTexture, force); - } + void setRenderTarget(GLenum renderTarget); - void bindTexture() const; void generateTexture(); /** diff --git a/libs/hwui/tests/common/TestUtils.cpp b/libs/hwui/tests/common/TestUtils.cpp index 3e52c39b5c1f..64ec58d0adab 100644 --- a/libs/hwui/tests/common/TestUtils.cpp +++ b/libs/hwui/tests/common/TestUtils.cpp @@ -74,7 +74,11 @@ sp<DeferredLayerUpdater> TestUtils::createTextureLayerUpdater( layerUpdater->setTransform(&transform); // updateLayer so it's ready to draw - layerUpdater->updateLayer(true, GL_TEXTURE_EXTERNAL_OES, Matrix4::identity().data); + layerUpdater->updateLayer(true, Matrix4::identity().data); + if (layerUpdater->backingLayer()->getApi() == Layer::Api::OpenGL) { + static_cast<GlLayer*>(layerUpdater->backingLayer())->setRenderTarget( + GL_TEXTURE_EXTERNAL_OES); + } return layerUpdater; } diff --git a/libs/hwui/tests/unit/DeferredLayerUpdaterTests.cpp b/libs/hwui/tests/unit/DeferredLayerUpdaterTests.cpp index 1ef9dba07c6a..87d897ee6a7b 100644 --- a/libs/hwui/tests/unit/DeferredLayerUpdaterTests.cpp +++ b/libs/hwui/tests/unit/DeferredLayerUpdaterTests.cpp @@ -44,7 +44,12 @@ RENDERTHREAD_TEST(DeferredLayerUpdater, updateLayer) { // push the deferred updates to the layer Matrix4 scaledMatrix; scaledMatrix.loadScale(0.5, 0.5, 0.0); - layerUpdater->updateLayer(true, GL_TEXTURE_EXTERNAL_OES, scaledMatrix.data); + layerUpdater->updateLayer(true, scaledMatrix.data); + if (layerUpdater->backingLayer()->getApi() == Layer::Api::OpenGL) { + GlLayer* glLayer = static_cast<GlLayer*>(layerUpdater->backingLayer()); + glLayer->setRenderTarget(GL_TEXTURE_EXTERNAL_OES); + } + // the backing layer should now have all the properties applied. if (layerUpdater->backingLayer()->getApi() == Layer::Api::OpenGL) { |