Loading libs/hwui/BakedOpDispatcher.cpp +2 −0 Original line number Original line Diff line number Diff line Loading @@ -784,7 +784,9 @@ void BakedOpDispatcher::onCopyFromLayerOp(BakedOpRenderer& renderer, const CopyF .build(); .build(); renderer.renderGlop(state, glop); renderer.renderGlop(state, glop); } } GL_CHECKPOINT(); renderer.renderState().layerPool().putOrDelete(*op.layerHandle); renderer.renderState().layerPool().putOrDelete(*op.layerHandle); GL_CHECKPOINT(); } } } // namespace uirenderer } // namespace uirenderer Loading libs/hwui/BakedOpRenderer.cpp +2 −1 Original line number Original line Diff line number Diff line Loading @@ -74,7 +74,8 @@ void BakedOpRenderer::endLayer() { // Detach the texture from the FBO // Detach the texture from the FBO glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); LOG_ALWAYS_FATAL_IF(GLUtils::dumpGLErrors(), "endLayer FAILED"); LOG_ALWAYS_FATAL_IF(GLUtils::dumpGLErrors(), "endLayer FAILED, bound fbo = %u", mRenderState.getFramebuffer()); mRenderState.deleteFramebuffer(mRenderTarget.frameBufferId); mRenderState.deleteFramebuffer(mRenderTarget.frameBufferId); mRenderTarget.frameBufferId = 0; mRenderTarget.frameBufferId = 0; } } Loading libs/hwui/FrameBuilder.h +9 −0 Original line number Original line Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include "DisplayList.h" #include "DisplayList.h" #include "LayerBuilder.h" #include "LayerBuilder.h" #include "RecordedOp.h" #include "RecordedOp.h" #include "utils/GLUtils.h" #include <vector> #include <vector> #include <unordered_map> #include <unordered_map> Loading Loading @@ -99,22 +100,30 @@ public: // Relay through layers in reverse order, since layers // Relay through layers in reverse order, since layers // later in the list will be drawn by earlier ones // later in the list will be drawn by earlier ones for (int i = mLayerBuilders.size() - 1; i >= 1; i--) { for (int i = mLayerBuilders.size() - 1; i >= 1; i--) { GL_CHECKPOINT(); LayerBuilder& layer = *(mLayerBuilders[i]); LayerBuilder& layer = *(mLayerBuilders[i]); if (layer.renderNode) { if (layer.renderNode) { // cached HW layer - can't skip layer if empty // cached HW layer - can't skip layer if empty renderer.startRepaintLayer(layer.offscreenBuffer, layer.repaintRect); renderer.startRepaintLayer(layer.offscreenBuffer, layer.repaintRect); GL_CHECKPOINT(); layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers); layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers); GL_CHECKPOINT(); renderer.endLayer(); renderer.endLayer(); } else if (!layer.empty()) { // save layer - skip entire layer if empty } else if (!layer.empty()) { // save layer - skip entire layer if empty layer.offscreenBuffer = renderer.startTemporaryLayer(layer.width, layer.height); layer.offscreenBuffer = renderer.startTemporaryLayer(layer.width, layer.height); GL_CHECKPOINT(); layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers); layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers); GL_CHECKPOINT(); renderer.endLayer(); renderer.endLayer(); } } } } GL_CHECKPOINT(); const LayerBuilder& fbo0 = *(mLayerBuilders[0]); const LayerBuilder& fbo0 = *(mLayerBuilders[0]); renderer.startFrame(fbo0.width, fbo0.height, fbo0.repaintRect); renderer.startFrame(fbo0.width, fbo0.height, fbo0.repaintRect); GL_CHECKPOINT(); fbo0.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers); fbo0.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers); GL_CHECKPOINT(); renderer.endFrame(fbo0.repaintRect); renderer.endFrame(fbo0.repaintRect); } } Loading libs/hwui/GradientCache.cpp +2 −2 Original line number Original line Diff line number Diff line Loading @@ -277,9 +277,9 @@ void GradientCache::generateTexture(uint32_t* colors, float* positions, if (mUseFloatTexture) { if (mUseFloatTexture) { // We have to use GL_RGBA16F because GL_RGBA32F does not support filtering // We have to use GL_RGBA16F because GL_RGBA32F does not support filtering texture->upload(width, height, GL_RGBA16F, GL_RGBA, GL_FLOAT, pixels); texture->upload(GL_RGBA16F, width, height, GL_RGBA, GL_FLOAT, pixels); } else { } else { texture->upload(width, height, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, pixels); texture->upload(GL_RGBA, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); } } texture->setFilter(GL_LINEAR); texture->setFilter(GL_LINEAR); Loading libs/hwui/Texture.cpp +7 −0 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,7 @@ #include "Caches.h" #include "Caches.h" #include "Texture.h" #include "Texture.h" #include "utils/GLUtils.h" #include "utils/TraceUtils.h" #include "utils/TraceUtils.h" #include <utils/Log.h> #include <utils/Log.h> Loading Loading @@ -93,22 +94,28 @@ bool Texture::updateSize(uint32_t width, uint32_t height, GLint format) { void Texture::upload(GLint internalformat, uint32_t width, uint32_t height, void Texture::upload(GLint internalformat, uint32_t width, uint32_t height, GLenum format, GLenum type, const void* pixels) { GLenum format, GLenum type, const void* pixels) { GL_CHECKPOINT(); bool needsAlloc = updateSize(width, height, internalformat); bool needsAlloc = updateSize(width, height, internalformat); if (!needsAlloc && !pixels) { if (!needsAlloc && !pixels) { return; return; } } mCaches.textureState().activateTexture(0); mCaches.textureState().activateTexture(0); GL_CHECKPOINT(); if (!mId) { if (!mId) { glGenTextures(1, &mId); glGenTextures(1, &mId); needsAlloc = true; needsAlloc = true; } } GL_CHECKPOINT(); mCaches.textureState().bindTexture(GL_TEXTURE_2D, mId); mCaches.textureState().bindTexture(GL_TEXTURE_2D, mId); GL_CHECKPOINT(); if (needsAlloc) { if (needsAlloc) { glTexImage2D(GL_TEXTURE_2D, 0, mFormat, mWidth, mHeight, 0, glTexImage2D(GL_TEXTURE_2D, 0, mFormat, mWidth, mHeight, 0, format, type, pixels); format, type, pixels); GL_CHECKPOINT(); } else { } else { glTexSubImage2D(GL_TEXTURE_2D, 0, mFormat, mWidth, mHeight, 0, glTexSubImage2D(GL_TEXTURE_2D, 0, mFormat, mWidth, mHeight, 0, format, type, pixels); format, type, pixels); GL_CHECKPOINT(); } } } } Loading Loading
libs/hwui/BakedOpDispatcher.cpp +2 −0 Original line number Original line Diff line number Diff line Loading @@ -784,7 +784,9 @@ void BakedOpDispatcher::onCopyFromLayerOp(BakedOpRenderer& renderer, const CopyF .build(); .build(); renderer.renderGlop(state, glop); renderer.renderGlop(state, glop); } } GL_CHECKPOINT(); renderer.renderState().layerPool().putOrDelete(*op.layerHandle); renderer.renderState().layerPool().putOrDelete(*op.layerHandle); GL_CHECKPOINT(); } } } // namespace uirenderer } // namespace uirenderer Loading
libs/hwui/BakedOpRenderer.cpp +2 −1 Original line number Original line Diff line number Diff line Loading @@ -74,7 +74,8 @@ void BakedOpRenderer::endLayer() { // Detach the texture from the FBO // Detach the texture from the FBO glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); LOG_ALWAYS_FATAL_IF(GLUtils::dumpGLErrors(), "endLayer FAILED"); LOG_ALWAYS_FATAL_IF(GLUtils::dumpGLErrors(), "endLayer FAILED, bound fbo = %u", mRenderState.getFramebuffer()); mRenderState.deleteFramebuffer(mRenderTarget.frameBufferId); mRenderState.deleteFramebuffer(mRenderTarget.frameBufferId); mRenderTarget.frameBufferId = 0; mRenderTarget.frameBufferId = 0; } } Loading
libs/hwui/FrameBuilder.h +9 −0 Original line number Original line Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include "DisplayList.h" #include "DisplayList.h" #include "LayerBuilder.h" #include "LayerBuilder.h" #include "RecordedOp.h" #include "RecordedOp.h" #include "utils/GLUtils.h" #include <vector> #include <vector> #include <unordered_map> #include <unordered_map> Loading Loading @@ -99,22 +100,30 @@ public: // Relay through layers in reverse order, since layers // Relay through layers in reverse order, since layers // later in the list will be drawn by earlier ones // later in the list will be drawn by earlier ones for (int i = mLayerBuilders.size() - 1; i >= 1; i--) { for (int i = mLayerBuilders.size() - 1; i >= 1; i--) { GL_CHECKPOINT(); LayerBuilder& layer = *(mLayerBuilders[i]); LayerBuilder& layer = *(mLayerBuilders[i]); if (layer.renderNode) { if (layer.renderNode) { // cached HW layer - can't skip layer if empty // cached HW layer - can't skip layer if empty renderer.startRepaintLayer(layer.offscreenBuffer, layer.repaintRect); renderer.startRepaintLayer(layer.offscreenBuffer, layer.repaintRect); GL_CHECKPOINT(); layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers); layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers); GL_CHECKPOINT(); renderer.endLayer(); renderer.endLayer(); } else if (!layer.empty()) { // save layer - skip entire layer if empty } else if (!layer.empty()) { // save layer - skip entire layer if empty layer.offscreenBuffer = renderer.startTemporaryLayer(layer.width, layer.height); layer.offscreenBuffer = renderer.startTemporaryLayer(layer.width, layer.height); GL_CHECKPOINT(); layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers); layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers); GL_CHECKPOINT(); renderer.endLayer(); renderer.endLayer(); } } } } GL_CHECKPOINT(); const LayerBuilder& fbo0 = *(mLayerBuilders[0]); const LayerBuilder& fbo0 = *(mLayerBuilders[0]); renderer.startFrame(fbo0.width, fbo0.height, fbo0.repaintRect); renderer.startFrame(fbo0.width, fbo0.height, fbo0.repaintRect); GL_CHECKPOINT(); fbo0.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers); fbo0.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers); GL_CHECKPOINT(); renderer.endFrame(fbo0.repaintRect); renderer.endFrame(fbo0.repaintRect); } } Loading
libs/hwui/GradientCache.cpp +2 −2 Original line number Original line Diff line number Diff line Loading @@ -277,9 +277,9 @@ void GradientCache::generateTexture(uint32_t* colors, float* positions, if (mUseFloatTexture) { if (mUseFloatTexture) { // We have to use GL_RGBA16F because GL_RGBA32F does not support filtering // We have to use GL_RGBA16F because GL_RGBA32F does not support filtering texture->upload(width, height, GL_RGBA16F, GL_RGBA, GL_FLOAT, pixels); texture->upload(GL_RGBA16F, width, height, GL_RGBA, GL_FLOAT, pixels); } else { } else { texture->upload(width, height, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, pixels); texture->upload(GL_RGBA, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); } } texture->setFilter(GL_LINEAR); texture->setFilter(GL_LINEAR); Loading
libs/hwui/Texture.cpp +7 −0 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,7 @@ #include "Caches.h" #include "Caches.h" #include "Texture.h" #include "Texture.h" #include "utils/GLUtils.h" #include "utils/TraceUtils.h" #include "utils/TraceUtils.h" #include <utils/Log.h> #include <utils/Log.h> Loading Loading @@ -93,22 +94,28 @@ bool Texture::updateSize(uint32_t width, uint32_t height, GLint format) { void Texture::upload(GLint internalformat, uint32_t width, uint32_t height, void Texture::upload(GLint internalformat, uint32_t width, uint32_t height, GLenum format, GLenum type, const void* pixels) { GLenum format, GLenum type, const void* pixels) { GL_CHECKPOINT(); bool needsAlloc = updateSize(width, height, internalformat); bool needsAlloc = updateSize(width, height, internalformat); if (!needsAlloc && !pixels) { if (!needsAlloc && !pixels) { return; return; } } mCaches.textureState().activateTexture(0); mCaches.textureState().activateTexture(0); GL_CHECKPOINT(); if (!mId) { if (!mId) { glGenTextures(1, &mId); glGenTextures(1, &mId); needsAlloc = true; needsAlloc = true; } } GL_CHECKPOINT(); mCaches.textureState().bindTexture(GL_TEXTURE_2D, mId); mCaches.textureState().bindTexture(GL_TEXTURE_2D, mId); GL_CHECKPOINT(); if (needsAlloc) { if (needsAlloc) { glTexImage2D(GL_TEXTURE_2D, 0, mFormat, mWidth, mHeight, 0, glTexImage2D(GL_TEXTURE_2D, 0, mFormat, mWidth, mHeight, 0, format, type, pixels); format, type, pixels); GL_CHECKPOINT(); } else { } else { glTexSubImage2D(GL_TEXTURE_2D, 0, mFormat, mWidth, mHeight, 0, glTexSubImage2D(GL_TEXTURE_2D, 0, mFormat, mWidth, mHeight, 0, format, type, pixels); format, type, pixels); GL_CHECKPOINT(); } } } } Loading