BakedOpRenderer.h revision 5854b34881b1a747ac80b5077869ef270a92b1f4
1b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/* 2b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Copyright (C) 2015 The Android Open Source Project 3b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 4b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 5b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * you may not use this file except in compliance with the License. 6b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * You may obtain a copy of the License at 7b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 8b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * http://www.apache.org/licenses/LICENSE-2.0 9b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 10b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Unless required by applicable law or agreed to in writing, software 11b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * distributed under the License is distributed on an "AS IS" BASIS, 12b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * See the License for the specific language governing permissions and 14b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * limitations under the License. 15b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */ 16b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 17b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#ifndef ANDROID_HWUI_BAKED_OP_RENDERER_H 18b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define ANDROID_HWUI_BAKED_OP_RENDERER_H 19b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 20b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "BakedOpState.h" 21b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "Matrix.h" 22b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 23b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android { 24b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer { 25b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 26b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass Caches; 27b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct Glop; 28818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craikclass Layer; 29b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass RenderState; 30b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 315854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik/** 325854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * Lightweight alternative to Layer. Owns the persistent state of an offscreen render target, and 335854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * encompasses enough information to draw it back on screen (minus paint properties, which are held 345854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * by LayerOp). 355854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik */ 365854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikclass OffscreenBuffer { 375854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikpublic: 385854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik OffscreenBuffer(Caches& caches, uint32_t textureWidth, uint32_t textureHeight, 395854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik uint32_t viewportWidth, uint32_t viewportHeight); 405854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik 415854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik Texture texture; 425854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik Rect texCoords; 435854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik Region region; 445854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik}; 455854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik 465854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik/** 475854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * Main rendering manager for a collection of work - one frame + any contained FBOs. 485854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * 495854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * Manages frame and FBO lifecycle, binding the GL framebuffer as appropriate. This is the only 505854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * place where FBOs are bound, created, and destroyed. 515854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * 525854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * All rendering operations will be sent by the Dispatcher, a collection of static methods, 535854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * which has intentionally limited access to the renderer functionality. 545854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik */ 55b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass BakedOpRenderer { 56b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikpublic: 575854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik BakedOpRenderer(Caches& caches, RenderState& renderState, bool opaque) 585854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik : mRenderState(renderState) 595854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik , mCaches(caches) 605854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik , mOpaque(opaque) { 615854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik } 62b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 635854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik RenderState& renderState() { return mRenderState; } 645854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik Caches& caches() { return mCaches; } 65818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 665854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik void startFrame(uint32_t width, uint32_t height); 675854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik void endFrame(); 685854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik OffscreenBuffer* startLayer(uint32_t width, uint32_t height); 695854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik void endLayer(); 70b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 715854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik Texture* getTexture(const SkBitmap* bitmap); 72b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 735854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik void renderGlop(const BakedOpState& state, const Glop& glop); 745854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik bool didDraw() { return mHasDrawn; } 755854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikprivate: 765854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik void setViewport(uint32_t width, uint32_t height); 77b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 785854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik RenderState& mRenderState; 795854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik Caches& mCaches; 805854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik bool mOpaque; 815854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik bool mHasDrawn = false; 82b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 835854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik // render target state - setup by start/end layer/frame 845854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik // only valid to use in between start/end pairs. 855854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik struct { 865854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik GLuint frameBufferId = 0; 875854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik OffscreenBuffer* offscreenBuffer = nullptr; 88818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik uint32_t viewportWidth = 0; 89818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik uint32_t viewportHeight = 0; 90b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Matrix4 orthoMatrix; 915854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik } mRenderTarget; 925854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik}; 935854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik 945854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik/** 955854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * Provides all "onBitmapOp(...)" style static methods for every op type, which convert the 965854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * RecordedOps and their state to Glops, and renders them with the provided BakedOpRenderer. 975854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * 985854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * This dispatcher is separate from the renderer so that the dispatcher / renderer interaction is 995854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * minimal through public BakedOpRenderer APIs. 1005854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik */ 1015854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikclass BakedOpDispatcher { 1025854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikpublic: 1035854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik // Declares all "onBitmapOp(...)" style methods for every op type 1045854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik#define DISPATCH_METHOD(Type) \ 1055854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik static void on##Type(BakedOpRenderer& renderer, const Type& op, const BakedOpState& state); 1065854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik MAP_OPS(DISPATCH_METHOD); 107b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 108b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 109b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace uirenderer 110b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace android 111b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 112b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif // ANDROID_HWUI_BAKED_OP_RENDERER_H 113