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