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