BakedOpRenderer.h revision 15c3f19a445b8df575911a16e8a6dba755a084b5
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 * Main rendering manager for a collection of work - one frame + any contained FBOs.
335854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik *
345854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * Manages frame and FBO lifecycle, binding the GL framebuffer as appropriate. This is the only
355854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * place where FBOs are bound, created, and destroyed.
365854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik *
375854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * All rendering operations will be sent by the Dispatcher, a collection of static methods,
385854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik * which has intentionally limited access to the renderer functionality.
395854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik */
40b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass BakedOpRenderer {
41b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikpublic:
4298787e6c9b2c10b1ab7820bdac168686025b924aChris Craik    /**
4398787e6c9b2c10b1ab7820bdac168686025b924aChris Craik     * Position agnostic shadow lighting info. Used with all shadow ops in scene.
4498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik     */
4598787e6c9b2c10b1ab7820bdac168686025b924aChris Craik    struct LightInfo {
4698787e6c9b2c10b1ab7820bdac168686025b924aChris Craik        float lightRadius = 0;
4798787e6c9b2c10b1ab7820bdac168686025b924aChris Craik        uint8_t ambientShadowAlpha = 0;
4898787e6c9b2c10b1ab7820bdac168686025b924aChris Craik        uint8_t spotShadowAlpha = 0;
4998787e6c9b2c10b1ab7820bdac168686025b924aChris Craik    };
5098787e6c9b2c10b1ab7820bdac168686025b924aChris Craik
5198787e6c9b2c10b1ab7820bdac168686025b924aChris Craik    BakedOpRenderer(Caches& caches, RenderState& renderState, bool opaque, const LightInfo& lightInfo)
525854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik            : mRenderState(renderState)
535854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik            , mCaches(caches)
5498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik            , mOpaque(opaque)
5598787e6c9b2c10b1ab7820bdac168686025b924aChris Craik            , mLightInfo(lightInfo) {
565854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    }
57b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
585854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    RenderState& renderState() { return mRenderState; }
595854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    Caches& caches() { return mCaches; }
60818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik
6198787e6c9b2c10b1ab7820bdac168686025b924aChris Craik    void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect);
625854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    void endFrame();
63d3daa3198e2212c985c634821682d5819346b653Chris Craik    OffscreenBuffer* startTemporaryLayer(uint32_t width, uint32_t height);
6498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik    void startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect);
655854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    void endLayer();
66b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
675854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    Texture* getTexture(const SkBitmap* bitmap);
6898787e6c9b2c10b1ab7820bdac168686025b924aChris Craik    const LightInfo& getLightInfo() { return mLightInfo; }
69b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
7015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik    void renderGlop(const BakedOpState& state, const Glop& glop) {
7115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        bool useScissor = state.computedState.clipSideFlags != OpClipSideFlags::None;
7215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        renderGlop(&state.computedState.clippedBounds,
7315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik                useScissor ? &state.computedState.clipRect : nullptr,
7415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik                glop);
7515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik    }
7615c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik
7715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik    void renderGlop(const Rect* dirtyBounds, const Rect* clip, const Glop& glop);
7815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik    bool offscreenRenderTarget() { return mRenderTarget.offscreenBuffer != nullptr; }
7915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik    void dirtyRenderTarget(const Rect& dirtyRect);
805854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    bool didDraw() { return mHasDrawn; }
815854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikprivate:
825854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    void setViewport(uint32_t width, uint32_t height);
8398787e6c9b2c10b1ab7820bdac168686025b924aChris Craik    void clearColorBuffer(const Rect& clearRect);
84b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
855854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    RenderState& mRenderState;
865854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    Caches& mCaches;
875854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    bool mOpaque;
885854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    bool mHasDrawn = false;
89b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
905854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    // render target state - setup by start/end layer/frame
915854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    // only valid to use in between start/end pairs.
925854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    struct {
935854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik        GLuint frameBufferId = 0;
945854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik        OffscreenBuffer* offscreenBuffer = nullptr;
95818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik        uint32_t viewportWidth = 0;
96818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik        uint32_t viewportHeight = 0;
97b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        Matrix4 orthoMatrix;
985854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    } mRenderTarget;
9998787e6c9b2c10b1ab7820bdac168686025b924aChris Craik
10098787e6c9b2c10b1ab7820bdac168686025b924aChris Craik    const LightInfo mLightInfo;
1015854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik};
1025854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik
103b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace uirenderer
104b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace android
105b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
106b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif // ANDROID_HWUI_BAKED_OP_RENDERER_H
107