diff options
Diffstat (limited to 'libs/hwui/BakedOpRenderer.cpp')
-rw-r--r-- | libs/hwui/BakedOpRenderer.cpp | 88 |
1 files changed, 6 insertions, 82 deletions
diff --git a/libs/hwui/BakedOpRenderer.cpp b/libs/hwui/BakedOpRenderer.cpp index 938099209148..1aa291f23a1e 100644 --- a/libs/hwui/BakedOpRenderer.cpp +++ b/libs/hwui/BakedOpRenderer.cpp @@ -19,98 +19,22 @@ #include "Caches.h" #include "Glop.h" #include "GlopBuilder.h" -#include "VertexBuffer.h" +#include "renderstate/OffscreenBufferPool.h" #include "renderstate/RenderState.h" -#include "utils/FatVector.h" #include "utils/GLUtils.h" +#include "VertexBuffer.h" namespace android { namespace uirenderer { //////////////////////////////////////////////////////////////////////////////// -// OffscreenBuffer -//////////////////////////////////////////////////////////////////////////////// - -OffscreenBuffer::OffscreenBuffer(RenderState& renderState, Caches& caches, - uint32_t textureWidth, uint32_t textureHeight, - uint32_t viewportWidth, uint32_t viewportHeight) - : renderState(renderState) - , viewportWidth(viewportWidth) - , viewportHeight(viewportHeight) - , texture(caches) { - texture.width = textureWidth; - texture.height = textureHeight; - - caches.textureState().activateTexture(0); - glGenTextures(1, &texture.id); - caches.textureState().bindTexture(GL_TEXTURE_2D, texture.id); - - texture.setWrap(GL_CLAMP_TO_EDGE, false, false, GL_TEXTURE_2D); - // not setting filter on texture, since it's set when rendering, based on transform - - glPixelStorei(GL_UNPACK_ALIGNMENT, 4); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture.width, texture.height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, nullptr); -} - -void OffscreenBuffer::updateMeshFromRegion() { - // avoid T-junctions as they cause artifacts in between the resultant - // geometry when complex transforms occur. - // TODO: generate the safeRegion only if necessary based on rendering transform - Region safeRegion = Region::createTJunctionFreeRegion(region); - - size_t count; - const android::Rect* rects = safeRegion.getArray(&count); - - const float texX = 1.0f / float(viewportWidth); - const float texY = 1.0f / float(viewportHeight); - - FatVector<TextureVertex, 64> meshVector(count * 4); // uses heap if more than 64 vertices needed - TextureVertex* mesh = &meshVector[0]; - for (size_t i = 0; i < count; i++) { - const android::Rect* r = &rects[i]; - - const float u1 = r->left * texX; - const float v1 = (viewportHeight - r->top) * texY; - const float u2 = r->right * texX; - const float v2 = (viewportHeight - r->bottom) * texY; - - TextureVertex::set(mesh++, r->left, r->top, u1, v1); - TextureVertex::set(mesh++, r->right, r->top, u2, v1); - TextureVertex::set(mesh++, r->left, r->bottom, u1, v2); - TextureVertex::set(mesh++, r->right, r->bottom, u2, v2); - } - elementCount = count * 6; - renderState.meshState().genOrUpdateMeshBuffer(&vbo, - sizeof(TextureVertex) * count * 4, - &meshVector[0], - GL_DYNAMIC_DRAW); // TODO: GL_STATIC_DRAW if savelayer -} - -OffscreenBuffer::~OffscreenBuffer() { - texture.deleteTexture(); - renderState.meshState().deleteMeshBuffer(vbo); - elementCount = 0; - vbo = 0; -} - -//////////////////////////////////////////////////////////////////////////////// // BakedOpRenderer //////////////////////////////////////////////////////////////////////////////// -OffscreenBuffer* BakedOpRenderer::createOffscreenBuffer(RenderState& renderState, - uint32_t width, uint32_t height) { - // TODO: get from cache! - return new OffscreenBuffer(renderState, Caches::getInstance(), width, height, width, height); -} - -void BakedOpRenderer::destroyOffscreenBuffer(OffscreenBuffer* offscreenBuffer) { - // TODO: return texture/offscreenbuffer to cache! - delete offscreenBuffer; -} - OffscreenBuffer* BakedOpRenderer::startTemporaryLayer(uint32_t width, uint32_t height) { - OffscreenBuffer* buffer = createOffscreenBuffer(mRenderState, width, height); + LOG_ALWAYS_FATAL_IF(mRenderTarget.offscreenBuffer, "already has layer..."); + + OffscreenBuffer* buffer = mRenderState.layerPool().get(mRenderState, width, height); startRepaintLayer(buffer); return buffer; } @@ -357,7 +281,7 @@ void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op, renderer.renderGlop(state, glop); if (op.destroy) { - BakedOpRenderer::destroyOffscreenBuffer(buffer); + renderer.renderState().layerPool().putOrDelete(buffer); } } |