16c319ca1275c8db892c39b48fc54864c949f9171Romain Guy/*
26c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Copyright (C) 2011 The Android Open Source Project
36c319ca1275c8db892c39b48fc54864c949f9171Romain Guy *
46c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
56c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * you may not use this file except in compliance with the License.
66c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * You may obtain a copy of the License at
76c319ca1275c8db892c39b48fc54864c949f9171Romain Guy *
86c319ca1275c8db892c39b48fc54864c949f9171Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
96c319ca1275c8db892c39b48fc54864c949f9171Romain Guy *
106c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Unless required by applicable law or agreed to in writing, software
116c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
126c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * See the License for the specific language governing permissions and
146c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * limitations under the License.
156c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */
166c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
176c319ca1275c8db892c39b48fc54864c949f9171Romain Guy#ifndef ANDROID_HWUI_LAYER_RENDERER_H
186c319ca1275c8db892c39b48fc54864c949f9171Romain Guy#define ANDROID_HWUI_LAYER_RENDERER_H
196c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
207953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h>
217953745dd565167113f8cbfc461bc0521d32d870Romain Guy
226c319ca1275c8db892c39b48fc54864c949f9171Romain Guy#include "OpenGLRenderer.h"
23ada830f639591b99c3e40de22b07296c7932a33fRomain Guy#include "Layer.h"
246c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
2577a811610f99e21da7f88dafef60d09f345d0506Romain Guy#include <SkBitmap.h>
2677a811610f99e21da7f88dafef60d09f345d0506Romain Guy
276c319ca1275c8db892c39b48fc54864c949f9171Romain Guynamespace android {
286c319ca1275c8db892c39b48fc54864c949f9171Romain Guynamespace uirenderer {
296c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
303b20251a355c88193c439f928a84ae69483fb488John Reckclass RenderState;
313b20251a355c88193c439f928a84ae69483fb488John Reck
326c319ca1275c8db892c39b48fc54864c949f9171Romain Guy///////////////////////////////////////////////////////////////////////////////
331fc883b271707c4206ae20cc9a935d7bd4a7485eRomain Guy// Defines
341fc883b271707c4206ae20cc9a935d7bd4a7485eRomain Guy///////////////////////////////////////////////////////////////////////////////
351fc883b271707c4206ae20cc9a935d7bd4a7485eRomain Guy
361fc883b271707c4206ae20cc9a935d7bd4a7485eRomain Guy// Debug
371fc883b271707c4206ae20cc9a935d7bd4a7485eRomain Guy#if DEBUG_LAYER_RENDERER
385baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    #define LAYER_RENDERER_LOGD(...) ALOGD(__VA_ARGS__)
391fc883b271707c4206ae20cc9a935d7bd4a7485eRomain Guy#else
401fc883b271707c4206ae20cc9a935d7bd4a7485eRomain Guy    #define LAYER_RENDERER_LOGD(...)
411fc883b271707c4206ae20cc9a935d7bd4a7485eRomain Guy#endif
421fc883b271707c4206ae20cc9a935d7bd4a7485eRomain Guy
431fc883b271707c4206ae20cc9a935d7bd4a7485eRomain Guy///////////////////////////////////////////////////////////////////////////////
446c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// Renderer
456c319ca1275c8db892c39b48fc54864c949f9171Romain Guy///////////////////////////////////////////////////////////////////////////////
466c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
476c319ca1275c8db892c39b48fc54864c949f9171Romain Guyclass LayerRenderer: public OpenGLRenderer {
486c319ca1275c8db892c39b48fc54864c949f9171Romain Guypublic:
493b20251a355c88193c439f928a84ae69483fb488John Reck    LayerRenderer(RenderState& renderState, Layer* layer);
507953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual ~LayerRenderer();
516c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
521aa5d2d7068147ff781cfe911a93f01593a68c79John Reck    virtual void onViewportInitialized() { /* do nothing */ }
537c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy    virtual status_t prepareDirty(float left, float top, float right, float bottom, bool opaque);
547c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy    virtual status_t clear(float left, float top, float right, float bottom, bool opaque);
557953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void finish();
566c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
573b20251a355c88193c439f928a84ae69483fb488John Reck    static Layer* createTextureLayer(RenderState& renderState);
583b20251a355c88193c439f928a84ae69483fb488John Reck    static Layer* createRenderLayer(RenderState& renderState, uint32_t width, uint32_t height);
593b20251a355c88193c439f928a84ae69483fb488John Reck    static bool resizeLayer(Layer* layer, uint32_t width, uint32_t height);
603b20251a355c88193c439f928a84ae69483fb488John Reck    static void updateTextureLayer(Layer* layer, uint32_t width, uint32_t height,
619757ac0b9d62f6aea5e47cfb375f445c78bb7897Chris Craik            bool isOpaque, bool forceFilter, GLenum renderTarget, float* textureTransform);
623b20251a355c88193c439f928a84ae69483fb488John Reck    static void destroyLayer(Layer* layer);
633b20251a355c88193c439f928a84ae69483fb488John Reck    static bool copyLayer(RenderState& renderState, Layer* layer, SkBitmap* bitmap);
646c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
653b20251a355c88193c439f928a84ae69483fb488John Reck    static void flushLayer(RenderState& renderState, Layer* layer);
6698d3a64ffa13596e3ea9125bbff40c51ec96bd8dChet Haase
6711cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guyprotected:
688ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    virtual void ensureStencilBuffer();
69624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy    virtual bool hasLayer() const;
70624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy    virtual Region* getRegion() const;
7114e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual GLuint getTargetFbo() const;
72624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy    virtual bool suppressErrorChecks() const;
7311cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy
746c319ca1275c8db892c39b48fc54864c949f9171Romain Guyprivate:
75f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy    void generateMesh();
76f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy
77ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    Layer* mLayer;
786c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}; // class LayerRenderer
796c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
806c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}; // namespace uirenderer
816c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}; // namespace android
826c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
836c319ca1275c8db892c39b48fc54864c949f9171Romain Guy#endif // ANDROID_HWUI_LAYER_RENDERER_H
84