BakedOpRenderer.h revision 98787e6c9b2c10b1ab7820bdac168686025b924a
12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert/*
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert * Copyright (C) 2015 The Android Open Source Project
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Licensed under the Apache License, Version 2.0 (the "License");
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * you may not use this file except in compliance with the License.
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * You may obtain a copy of the License at
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *      http://www.apache.org/licenses/LICENSE-2.0
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Unless required by applicable law or agreed to in writing, software
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * distributed under the License is distributed on an "AS IS" BASIS,
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * See the License for the specific language governing permissions and
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * limitations under the License.
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#ifndef ANDROID_HWUI_BAKED_OP_RENDERER_H
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define ANDROID_HWUI_BAKED_OP_RENDERER_H
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#include "BakedOpState.h"
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#include "Matrix.h"
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertnamespace android {
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertnamespace uirenderer {
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertclass Caches;
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertstruct Glop;
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertclass Layer;
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertclass RenderState;
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Main rendering manager for a collection of work - one frame + any contained FBOs.
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Manages frame and FBO lifecycle, binding the GL framebuffer as appropriate. This is the only
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * place where FBOs are bound, created, and destroyed.
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * All rendering operations will be sent by the Dispatcher, a collection of static methods,
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * which has intentionally limited access to the renderer functionality.
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertclass BakedOpRenderer {
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic:
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Position agnostic shadow lighting info. Used with all shadow ops in scene.
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    struct LightInfo {
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        float lightRadius = 0;
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        uint8_t ambientShadowAlpha = 0;
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        uint8_t spotShadowAlpha = 0;
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    BakedOpRenderer(Caches& caches, RenderState& renderState, bool opaque, const LightInfo& lightInfo)
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            : mRenderState(renderState)
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            , mCaches(caches)
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            , mOpaque(opaque)
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            , mLightInfo(lightInfo) {
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    RenderState& renderState() { return mRenderState; }
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Caches& caches() { return mCaches; }
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect);
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    void endFrame();
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    OffscreenBuffer* startTemporaryLayer(uint32_t width, uint32_t height);
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    void startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect);
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    void endLayer();
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Texture* getTexture(const SkBitmap* bitmap);
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    const LightInfo& getLightInfo() { return mLightInfo; }
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    void renderGlop(const BakedOpState& state, const Glop& glop);
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    bool didDraw() { return mHasDrawn; }
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertprivate:
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    void setViewport(uint32_t width, uint32_t height);
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    void clearColorBuffer(const Rect& clearRect);
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    RenderState& mRenderState;
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Caches& mCaches;
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    bool mOpaque;
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    bool mHasDrawn = false;
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // render target state - setup by start/end layer/frame
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // only valid to use in between start/end pairs.
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    struct {
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        GLuint frameBufferId = 0;
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        OffscreenBuffer* offscreenBuffer = nullptr;
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        uint32_t viewportWidth = 0;
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        uint32_t viewportHeight = 0;
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Matrix4 orthoMatrix;
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    } mRenderTarget;
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    const LightInfo mLightInfo;
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert};
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Provides all "onBitmapOp(...)" style static methods for every op type, which convert the
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * RecordedOps and their state to Glops, and renders them with the provided BakedOpRenderer.
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This dispatcher is separate from the renderer so that the dispatcher / renderer interaction is
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * minimal through public BakedOpRenderer APIs.
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertclass BakedOpDispatcher {
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic:
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Declares all "onBitmapOp(...)" style methods for every op type
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#define DISPATCH_METHOD(Type) \
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        static void on##Type(BakedOpRenderer& renderer, const Type& op, const BakedOpState& state);
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    MAP_OPS(DISPATCH_METHOD);
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert};
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}; // namespace uirenderer
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}; // namespace android
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert#endif // ANDROID_HWUI_BAKED_OP_RENDERER_H
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert