BakedOpRenderer.h revision 7435eb148e72382126e9073183e881357bb38a8b
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" 227435eb148e72382126e9073183e881357bb38a8bChris Craik#include "utils/Macros.h" 23b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 24b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android { 25b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer { 26b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 27b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass Caches; 28b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct Glop; 29818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craikclass Layer; 30b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass RenderState; 31e4db79de127cfe961195f52907af8451026eaa20Chris Craikstruct ClipBase; 32b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 335854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik/** 345854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * Main rendering manager for a collection of work - one frame + any contained FBOs. 355854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * 365854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * Manages frame and FBO lifecycle, binding the GL framebuffer as appropriate. This is the only 375854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * place where FBOs are bound, created, and destroyed. 385854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * 395854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * All rendering operations will be sent by the Dispatcher, a collection of static methods, 405854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * which has intentionally limited access to the renderer functionality. 415854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik */ 42b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass BakedOpRenderer { 43b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikpublic: 4498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik /** 4598787e6c9b2c10b1ab7820bdac168686025b924aChris Craik * Position agnostic shadow lighting info. Used with all shadow ops in scene. 4698787e6c9b2c10b1ab7820bdac168686025b924aChris Craik */ 4798787e6c9b2c10b1ab7820bdac168686025b924aChris Craik struct LightInfo { 4898787e6c9b2c10b1ab7820bdac168686025b924aChris Craik float lightRadius = 0; 4998787e6c9b2c10b1ab7820bdac168686025b924aChris Craik uint8_t ambientShadowAlpha = 0; 5098787e6c9b2c10b1ab7820bdac168686025b924aChris Craik uint8_t spotShadowAlpha = 0; 5198787e6c9b2c10b1ab7820bdac168686025b924aChris Craik }; 5298787e6c9b2c10b1ab7820bdac168686025b924aChris Craik 5398787e6c9b2c10b1ab7820bdac168686025b924aChris Craik BakedOpRenderer(Caches& caches, RenderState& renderState, bool opaque, const LightInfo& lightInfo) 545854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik : mRenderState(renderState) 555854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik , mCaches(caches) 5698787e6c9b2c10b1ab7820bdac168686025b924aChris Craik , mOpaque(opaque) 5798787e6c9b2c10b1ab7820bdac168686025b924aChris Craik , mLightInfo(lightInfo) { 585854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik } 59b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 605854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik RenderState& renderState() { return mRenderState; } 615854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik Caches& caches() { return mCaches; } 62818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 6398787e6c9b2c10b1ab7820bdac168686025b924aChris Craik void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect); 64e4db79de127cfe961195f52907af8451026eaa20Chris Craik void endFrame(const Rect& repaintRect); 657435eb148e72382126e9073183e881357bb38a8bChris Craik WARN_UNUSED_RESULT OffscreenBuffer* startTemporaryLayer(uint32_t width, uint32_t height); 6698787e6c9b2c10b1ab7820bdac168686025b924aChris Craik void startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect); 675854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik void endLayer(); 687435eb148e72382126e9073183e881357bb38a8bChris Craik WARN_UNUSED_RESULT OffscreenBuffer* copyToLayer(const Rect& area); 69b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 705854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik Texture* getTexture(const SkBitmap* bitmap); 71e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik const LightInfo& getLightInfo() const { return mLightInfo; } 72b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 7315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik void renderGlop(const BakedOpState& state, const Glop& glop) { 7415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik renderGlop(&state.computedState.clippedBounds, 75e4db79de127cfe961195f52907af8451026eaa20Chris Craik state.computedState.getClipIfNeeded(), 7615c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik glop); 7715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik } 78e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik void renderFunctor(const FunctorOp& op, const BakedOpState& state); 7915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 80e4db79de127cfe961195f52907af8451026eaa20Chris Craik void renderGlop(const Rect* dirtyBounds, const ClipBase* clip, const Glop& glop); 8115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik bool offscreenRenderTarget() { return mRenderTarget.offscreenBuffer != nullptr; } 8215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik void dirtyRenderTarget(const Rect& dirtyRect); 83e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik bool didDraw() const { return mHasDrawn; } 845854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikprivate: 855854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik void setViewport(uint32_t width, uint32_t height); 8698787e6c9b2c10b1ab7820bdac168686025b924aChris Craik void clearColorBuffer(const Rect& clearRect); 87e4db79de127cfe961195f52907af8451026eaa20Chris Craik void prepareRender(const Rect* dirtyBounds, const ClipBase* clip); 88e4db79de127cfe961195f52907af8451026eaa20Chris Craik void setupStencilRectList(const ClipBase* clip); 89e4db79de127cfe961195f52907af8451026eaa20Chris Craik void setupStencilRegion(const ClipBase* clip); 90e4db79de127cfe961195f52907af8451026eaa20Chris Craik void setupStencilQuads(std::vector<Vertex>& quadVertices, int incrementThreshold); 91b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 925854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik RenderState& mRenderState; 935854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik Caches& mCaches; 945854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik bool mOpaque; 955854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik bool mHasDrawn = false; 96b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 975854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik // render target state - setup by start/end layer/frame 985854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik // only valid to use in between start/end pairs. 995854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik struct { 100e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik // If not drawing to a layer: fbo = 0, offscreenBuffer = null, 101e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik // Otherwise these refer to currently painting layer's state 1025854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik GLuint frameBufferId = 0; 1035854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik OffscreenBuffer* offscreenBuffer = nullptr; 104e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik 105e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik // Used when drawing to a layer and using stencil clipping. otherwise null. 106e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik RenderBuffer* stencil = nullptr; 107e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik 108e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik // value representing the ClipRectList* or ClipRegion* currently stored in 109e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik // the stencil of the current render target 110e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik const ClipBase* lastStencilClip = nullptr; 111e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik 112e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik // Size of renderable region in current render target - for layers, may not match actual 113e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik // bounds of FBO texture. offscreenBuffer->texture has this information. 114818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik uint32_t viewportWidth = 0; 115818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik uint32_t viewportHeight = 0; 116e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik 117b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Matrix4 orthoMatrix; 1185854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik } mRenderTarget; 11998787e6c9b2c10b1ab7820bdac168686025b924aChris Craik 12098787e6c9b2c10b1ab7820bdac168686025b924aChris Craik const LightInfo mLightInfo; 1215854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik}; 1225854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik 123b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace uirenderer 124b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace android 125b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 126b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif // ANDROID_HWUI_BAKED_OP_RENDERER_H 127