Chris Craik | b565df1 | 2015-10-05 13:00:52 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2015 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
Chris Craik | 419a1e7 | 2016-03-08 16:24:12 -0800 | [diff] [blame] | 17 | #pragma once |
Chris Craik | b565df1 | 2015-10-05 13:00:52 -0700 | [diff] [blame] | 18 | |
| 19 | #include "BakedOpState.h" |
| 20 | #include "Matrix.h" |
Chris Craik | 7435eb1 | 2016-01-07 17:41:40 -0800 | [diff] [blame] | 21 | #include "utils/Macros.h" |
Chris Craik | b565df1 | 2015-10-05 13:00:52 -0700 | [diff] [blame] | 22 | |
| 23 | namespace android { |
| 24 | namespace uirenderer { |
| 25 | |
| 26 | class Caches; |
| 27 | struct Glop; |
Chris Craik | 818c9fb | 2015-10-23 14:33:42 -0700 | [diff] [blame] | 28 | class Layer; |
Chris Craik | b565df1 | 2015-10-05 13:00:52 -0700 | [diff] [blame] | 29 | class RenderState; |
Chris Craik | e4db79d | 2015-12-22 16:32:23 -0800 | [diff] [blame] | 30 | struct ClipBase; |
Chris Craik | b565df1 | 2015-10-05 13:00:52 -0700 | [diff] [blame] | 31 | |
Chris Craik | 5854b34 | 2015-10-26 15:49:56 -0700 | [diff] [blame] | 32 | /** |
Chris Craik | 5854b34 | 2015-10-26 15:49:56 -0700 | [diff] [blame] | 33 | * Main rendering manager for a collection of work - one frame + any contained FBOs. |
| 34 | * |
| 35 | * Manages frame and FBO lifecycle, binding the GL framebuffer as appropriate. This is the only |
| 36 | * place where FBOs are bound, created, and destroyed. |
| 37 | * |
| 38 | * All rendering operations will be sent by the Dispatcher, a collection of static methods, |
| 39 | * which has intentionally limited access to the renderer functionality. |
| 40 | */ |
Chris Craik | b565df1 | 2015-10-05 13:00:52 -0700 | [diff] [blame] | 41 | class BakedOpRenderer { |
| 42 | public: |
Chris Craik | 419a1e7 | 2016-03-08 16:24:12 -0800 | [diff] [blame] | 43 | typedef void (*GlopReceiver)(BakedOpRenderer&, const Rect*, const ClipBase*, const Glop&); |
Chris Craik | 98787e6 | 2015-11-13 10:55:30 -0800 | [diff] [blame] | 44 | /** |
| 45 | * Position agnostic shadow lighting info. Used with all shadow ops in scene. |
| 46 | */ |
| 47 | struct LightInfo { |
Chris Craik | 6e068c01 | 2016-01-15 16:15:30 -0800 | [diff] [blame] | 48 | LightInfo() : LightInfo(0, 0) {} |
John Reck | 1bcacfd | 2017-11-03 10:12:19 -0700 | [diff] [blame] | 49 | LightInfo(uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha) |
| 50 | : ambientShadowAlpha(ambientShadowAlpha), spotShadowAlpha(spotShadowAlpha) {} |
John Reck | 7db5ffb | 2016-01-15 13:17:09 -0800 | [diff] [blame] | 51 | uint8_t ambientShadowAlpha; |
| 52 | uint8_t spotShadowAlpha; |
Chris Craik | 98787e6 | 2015-11-13 10:55:30 -0800 | [diff] [blame] | 53 | }; |
| 54 | |
Romain Guy | 07ae505 | 2017-06-13 18:25:32 -0700 | [diff] [blame] | 55 | BakedOpRenderer(Caches& caches, RenderState& renderState, bool opaque, bool wideColorGamut, |
John Reck | 1bcacfd | 2017-11-03 10:12:19 -0700 | [diff] [blame] | 56 | const LightInfo& lightInfo) |
Chris Craik | 419a1e7 | 2016-03-08 16:24:12 -0800 | [diff] [blame] | 57 | : mGlopReceiver(DefaultGlopReceiver) |
| 58 | , mRenderState(renderState) |
Chris Craik | 5854b34 | 2015-10-26 15:49:56 -0700 | [diff] [blame] | 59 | , mCaches(caches) |
Chris Craik | 98787e6 | 2015-11-13 10:55:30 -0800 | [diff] [blame] | 60 | , mOpaque(opaque) |
Romain Guy | 07ae505 | 2017-06-13 18:25:32 -0700 | [diff] [blame] | 61 | , mWideColorGamut(wideColorGamut) |
John Reck | 1bcacfd | 2017-11-03 10:12:19 -0700 | [diff] [blame] | 62 | , mLightInfo(lightInfo) {} |
Chris Craik | b565df1 | 2015-10-05 13:00:52 -0700 | [diff] [blame] | 63 | |
Chris Craik | 5854b34 | 2015-10-26 15:49:56 -0700 | [diff] [blame] | 64 | RenderState& renderState() { return mRenderState; } |
| 65 | Caches& caches() { return mCaches; } |
Chris Craik | 818c9fb | 2015-10-23 14:33:42 -0700 | [diff] [blame] | 66 | |
Chris Craik | 98787e6 | 2015-11-13 10:55:30 -0800 | [diff] [blame] | 67 | void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect); |
Chris Craik | e4db79d | 2015-12-22 16:32:23 -0800 | [diff] [blame] | 68 | void endFrame(const Rect& repaintRect); |
Chris Craik | 7435eb1 | 2016-01-07 17:41:40 -0800 | [diff] [blame] | 69 | WARN_UNUSED_RESULT OffscreenBuffer* startTemporaryLayer(uint32_t width, uint32_t height); |
Chris Craik | 74af6e2 | 2016-04-05 13:18:56 -0700 | [diff] [blame] | 70 | void recycleTemporaryLayer(OffscreenBuffer* offscreenBuffer); |
Chris Craik | 98787e6 | 2015-11-13 10:55:30 -0800 | [diff] [blame] | 71 | void startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect); |
Chris Craik | 5854b34 | 2015-10-26 15:49:56 -0700 | [diff] [blame] | 72 | void endLayer(); |
Chris Craik | 7435eb1 | 2016-01-07 17:41:40 -0800 | [diff] [blame] | 73 | WARN_UNUSED_RESULT OffscreenBuffer* copyToLayer(const Rect& area); |
Chris Craik | b565df1 | 2015-10-05 13:00:52 -0700 | [diff] [blame] | 74 | |
sergeyv | ec4a4b1 | 2016-10-20 18:39:04 -0700 | [diff] [blame] | 75 | Texture* getTexture(Bitmap* bitmap); |
Chris Craik | e29ce6f | 2015-12-10 16:25:13 -0800 | [diff] [blame] | 76 | const LightInfo& getLightInfo() const { return mLightInfo; } |
Chris Craik | b565df1 | 2015-10-05 13:00:52 -0700 | [diff] [blame] | 77 | |
Chris Craik | 15c3f19 | 2015-12-03 12:16:56 -0800 | [diff] [blame] | 78 | void renderGlop(const BakedOpState& state, const Glop& glop) { |
John Reck | 1bcacfd | 2017-11-03 10:12:19 -0700 | [diff] [blame] | 79 | renderGlop(&state.computedState.clippedBounds, state.computedState.getClipIfNeeded(), glop); |
Chris Craik | 15c3f19 | 2015-12-03 12:16:56 -0800 | [diff] [blame] | 80 | } |
Chris Craik | e29ce6f | 2015-12-10 16:25:13 -0800 | [diff] [blame] | 81 | void renderFunctor(const FunctorOp& op, const BakedOpState& state); |
Chris Craik | 15c3f19 | 2015-12-03 12:16:56 -0800 | [diff] [blame] | 82 | |
Chris Craik | 419a1e7 | 2016-03-08 16:24:12 -0800 | [diff] [blame] | 83 | void renderGlop(const Rect* dirtyBounds, const ClipBase* clip, const Glop& glop) { |
| 84 | mGlopReceiver(*this, dirtyBounds, clip, glop); |
| 85 | } |
Chris Craik | 15c3f19 | 2015-12-03 12:16:56 -0800 | [diff] [blame] | 86 | bool offscreenRenderTarget() { return mRenderTarget.offscreenBuffer != nullptr; } |
| 87 | void dirtyRenderTarget(const Rect& dirtyRect); |
Chris Craik | e29ce6f | 2015-12-10 16:25:13 -0800 | [diff] [blame] | 88 | bool didDraw() const { return mHasDrawn; } |
Chris Craik | 1dfa070 | 2016-03-04 15:59:24 -0800 | [diff] [blame] | 89 | |
| 90 | uint32_t getViewportWidth() const { return mRenderTarget.viewportWidth; } |
| 91 | uint32_t getViewportHeight() const { return mRenderTarget.viewportHeight; } |
| 92 | |
| 93 | // simple draw methods, to be used for end frame decoration |
| 94 | void drawRect(float left, float top, float right, float bottom, const SkPaint* paint) { |
John Reck | 1bcacfd | 2017-11-03 10:12:19 -0700 | [diff] [blame] | 95 | float ltrb[4] = {left, top, right, bottom}; |
Chris Craik | 1dfa070 | 2016-03-04 15:59:24 -0800 | [diff] [blame] | 96 | drawRects(ltrb, 4, paint); |
| 97 | } |
| 98 | void drawRects(const float* rects, int count, const SkPaint* paint); |
John Reck | 1bcacfd | 2017-11-03 10:12:19 -0700 | [diff] [blame] | 99 | |
Chris Craik | 419a1e7 | 2016-03-08 16:24:12 -0800 | [diff] [blame] | 100 | protected: |
| 101 | GlopReceiver mGlopReceiver; |
John Reck | 1bcacfd | 2017-11-03 10:12:19 -0700 | [diff] [blame] | 102 | |
Chris Craik | 5854b34 | 2015-10-26 15:49:56 -0700 | [diff] [blame] | 103 | private: |
Chris Craik | 419a1e7 | 2016-03-08 16:24:12 -0800 | [diff] [blame] | 104 | static void DefaultGlopReceiver(BakedOpRenderer& renderer, const Rect* dirtyBounds, |
John Reck | 1bcacfd | 2017-11-03 10:12:19 -0700 | [diff] [blame] | 105 | const ClipBase* clip, const Glop& glop) { |
Chris Craik | 419a1e7 | 2016-03-08 16:24:12 -0800 | [diff] [blame] | 106 | renderer.renderGlopImpl(dirtyBounds, clip, glop); |
| 107 | } |
| 108 | void renderGlopImpl(const Rect* dirtyBounds, const ClipBase* clip, const Glop& glop); |
Chris Craik | 5854b34 | 2015-10-26 15:49:56 -0700 | [diff] [blame] | 109 | void setViewport(uint32_t width, uint32_t height); |
Chris Craik | 98787e6 | 2015-11-13 10:55:30 -0800 | [diff] [blame] | 110 | void clearColorBuffer(const Rect& clearRect); |
Chris Craik | e4db79d | 2015-12-22 16:32:23 -0800 | [diff] [blame] | 111 | void prepareRender(const Rect* dirtyBounds, const ClipBase* clip); |
| 112 | void setupStencilRectList(const ClipBase* clip); |
| 113 | void setupStencilRegion(const ClipBase* clip); |
| 114 | void setupStencilQuads(std::vector<Vertex>& quadVertices, int incrementThreshold); |
Chris Craik | b565df1 | 2015-10-05 13:00:52 -0700 | [diff] [blame] | 115 | |
Chris Craik | 5854b34 | 2015-10-26 15:49:56 -0700 | [diff] [blame] | 116 | RenderState& mRenderState; |
| 117 | Caches& mCaches; |
| 118 | bool mOpaque; |
Romain Guy | 07ae505 | 2017-06-13 18:25:32 -0700 | [diff] [blame] | 119 | bool mWideColorGamut; |
Chris Craik | 5854b34 | 2015-10-26 15:49:56 -0700 | [diff] [blame] | 120 | bool mHasDrawn = false; |
Chris Craik | b565df1 | 2015-10-05 13:00:52 -0700 | [diff] [blame] | 121 | |
Chris Craik | 5854b34 | 2015-10-26 15:49:56 -0700 | [diff] [blame] | 122 | // render target state - setup by start/end layer/frame |
| 123 | // only valid to use in between start/end pairs. |
| 124 | struct { |
Chris Craik | e5b5019 | 2016-01-04 15:09:19 -0800 | [diff] [blame] | 125 | // If not drawing to a layer: fbo = 0, offscreenBuffer = null, |
| 126 | // Otherwise these refer to currently painting layer's state |
Chris Craik | 5854b34 | 2015-10-26 15:49:56 -0700 | [diff] [blame] | 127 | GLuint frameBufferId = 0; |
| 128 | OffscreenBuffer* offscreenBuffer = nullptr; |
Chris Craik | e5b5019 | 2016-01-04 15:09:19 -0800 | [diff] [blame] | 129 | |
| 130 | // Used when drawing to a layer and using stencil clipping. otherwise null. |
| 131 | RenderBuffer* stencil = nullptr; |
| 132 | |
| 133 | // value representing the ClipRectList* or ClipRegion* currently stored in |
| 134 | // the stencil of the current render target |
| 135 | const ClipBase* lastStencilClip = nullptr; |
| 136 | |
| 137 | // Size of renderable region in current render target - for layers, may not match actual |
| 138 | // bounds of FBO texture. offscreenBuffer->texture has this information. |
Chris Craik | 818c9fb | 2015-10-23 14:33:42 -0700 | [diff] [blame] | 139 | uint32_t viewportWidth = 0; |
| 140 | uint32_t viewportHeight = 0; |
Chris Craik | e5b5019 | 2016-01-04 15:09:19 -0800 | [diff] [blame] | 141 | |
Chris Craik | b565df1 | 2015-10-05 13:00:52 -0700 | [diff] [blame] | 142 | Matrix4 orthoMatrix; |
Chris Craik | 5854b34 | 2015-10-26 15:49:56 -0700 | [diff] [blame] | 143 | } mRenderTarget; |
Chris Craik | 98787e6 | 2015-11-13 10:55:30 -0800 | [diff] [blame] | 144 | |
| 145 | const LightInfo mLightInfo; |
Chris Craik | 5854b34 | 2015-10-26 15:49:56 -0700 | [diff] [blame] | 146 | }; |
Chris Craik | b565df1 | 2015-10-05 13:00:52 -0700 | [diff] [blame] | 147 | |
John Reck | 1bcacfd | 2017-11-03 10:12:19 -0700 | [diff] [blame] | 148 | }; // namespace uirenderer |
| 149 | }; // namespace android |