13b20251a355c88193c439f928a84ae69483fb488John Reck/*
23b20251a355c88193c439f928a84ae69483fb488John Reck * Copyright (C) 2014 The Android Open Source Project
33b20251a355c88193c439f928a84ae69483fb488John Reck *
43b20251a355c88193c439f928a84ae69483fb488John Reck * Licensed under the Apache License, Version 2.0 (the "License");
53b20251a355c88193c439f928a84ae69483fb488John Reck * you may not use this file except in compliance with the License.
63b20251a355c88193c439f928a84ae69483fb488John Reck * You may obtain a copy of the License at
73b20251a355c88193c439f928a84ae69483fb488John Reck *
83b20251a355c88193c439f928a84ae69483fb488John Reck *      http://www.apache.org/licenses/LICENSE-2.0
93b20251a355c88193c439f928a84ae69483fb488John Reck *
103b20251a355c88193c439f928a84ae69483fb488John Reck * Unless required by applicable law or agreed to in writing, software
113b20251a355c88193c439f928a84ae69483fb488John Reck * distributed under the License is distributed on an "AS IS" BASIS,
123b20251a355c88193c439f928a84ae69483fb488John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133b20251a355c88193c439f928a84ae69483fb488John Reck * See the License for the specific language governing permissions and
143b20251a355c88193c439f928a84ae69483fb488John Reck * limitations under the License.
153b20251a355c88193c439f928a84ae69483fb488John Reck */
163b20251a355c88193c439f928a84ae69483fb488John Reck#ifndef RENDERSTATE_H
173b20251a355c88193c439f928a84ae69483fb488John Reck#define RENDERSTATE_H
183b20251a355c88193c439f928a84ae69483fb488John Reck
191d4774233304c484673e2af2c1de2ab41021c979Chris Craik#include <set>
203b20251a355c88193c439f928a84ae69483fb488John Reck#include <GLES2/gl2.h>
213b20251a355c88193c439f928a84ae69483fb488John Reck#include <GLES2/gl2ext.h>
22599e254ea33231b1809466ae765dbee53dc4685cChris Craik#include <utils/Mutex.h>
233b20251a355c88193c439f928a84ae69483fb488John Reck
243b20251a355c88193c439f928a84ae69483fb488John Reck#include <private/hwui/DrawGlInfo.h>
253b20251a355c88193c439f928a84ae69483fb488John Reck
263b20251a355c88193c439f928a84ae69483fb488John Reck#include "Caches.h"
273b20251a355c88193c439f928a84ae69483fb488John Reck#include "utils/Macros.h"
283b20251a355c88193c439f928a84ae69483fb488John Reck
293b20251a355c88193c439f928a84ae69483fb488John Recknamespace android {
303b20251a355c88193c439f928a84ae69483fb488John Recknamespace uirenderer {
313b20251a355c88193c439f928a84ae69483fb488John Reck
323b20251a355c88193c439f928a84ae69483fb488John Recknamespace renderthread {
33443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reckclass CanvasContext;
343b20251a355c88193c439f928a84ae69483fb488John Reckclass RenderThread;
353b20251a355c88193c439f928a84ae69483fb488John Reck}
363b20251a355c88193c439f928a84ae69483fb488John Reck
373b20251a355c88193c439f928a84ae69483fb488John Reck// TODO: Replace Cache's GL state tracking with this. For now it's more a thin
383b20251a355c88193c439f928a84ae69483fb488John Reck// wrapper of Caches for users to migrate to.
393b20251a355c88193c439f928a84ae69483fb488John Reckclass RenderState {
403b20251a355c88193c439f928a84ae69483fb488John Reck    PREVENT_COPY_AND_ASSIGN(RenderState);
413b20251a355c88193c439f928a84ae69483fb488John Reckpublic:
423b20251a355c88193c439f928a84ae69483fb488John Reck    void onGLContextCreated();
431d4774233304c484673e2af2c1de2ab41021c979Chris Craik    void onGLContextDestroyed();
443b20251a355c88193c439f928a84ae69483fb488John Reck
453b20251a355c88193c439f928a84ae69483fb488John Reck    void setViewport(GLsizei width, GLsizei height);
463b20251a355c88193c439f928a84ae69483fb488John Reck    void getViewport(GLsizei* outWidth, GLsizei* outHeight);
473b20251a355c88193c439f928a84ae69483fb488John Reck
483b20251a355c88193c439f928a84ae69483fb488John Reck    void bindFramebuffer(GLuint fbo);
493b20251a355c88193c439f928a84ae69483fb488John Reck    GLint getFramebuffer() { return mFramebuffer; }
503b20251a355c88193c439f928a84ae69483fb488John Reck
513b20251a355c88193c439f928a84ae69483fb488John Reck    void invokeFunctor(Functor* functor, DrawGlInfo::Mode mode, DrawGlInfo* info);
523b20251a355c88193c439f928a84ae69483fb488John Reck
533b20251a355c88193c439f928a84ae69483fb488John Reck    void debugOverdraw(bool enable, bool clear);
543b20251a355c88193c439f928a84ae69483fb488John Reck
551d4774233304c484673e2af2c1de2ab41021c979Chris Craik    void registerLayer(const Layer* layer) {
5621029ef131d6a98862ae6faf3305bee2872e9c5fChris Craik        /*
57599e254ea33231b1809466ae765dbee53dc4685cChris Craik        AutoMutex _lock(mLayerLock);
581d4774233304c484673e2af2c1de2ab41021c979Chris Craik        mActiveLayers.insert(layer);
5921029ef131d6a98862ae6faf3305bee2872e9c5fChris Craik        */
601d4774233304c484673e2af2c1de2ab41021c979Chris Craik    }
611d4774233304c484673e2af2c1de2ab41021c979Chris Craik    void unregisterLayer(const Layer* layer) {
6221029ef131d6a98862ae6faf3305bee2872e9c5fChris Craik        /*
63599e254ea33231b1809466ae765dbee53dc4685cChris Craik        AutoMutex _lock(mLayerLock);
641d4774233304c484673e2af2c1de2ab41021c979Chris Craik        mActiveLayers.erase(layer);
6521029ef131d6a98862ae6faf3305bee2872e9c5fChris Craik        */
661d4774233304c484673e2af2c1de2ab41021c979Chris Craik    }
671d4774233304c484673e2af2c1de2ab41021c979Chris Craik
68443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck    void registerCanvasContext(renderthread::CanvasContext* context) {
69443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck        mRegisteredContexts.insert(context);
70443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck    }
71443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck
72443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck    void unregisterCanvasContext(renderthread::CanvasContext* context) {
73443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck        mRegisteredContexts.erase(context);
74443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck    }
75443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck
763b20251a355c88193c439f928a84ae69483fb488John Reckprivate:
773b20251a355c88193c439f928a84ae69483fb488John Reck    friend class renderthread::RenderThread;
7817035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck    friend class Caches;
793b20251a355c88193c439f928a84ae69483fb488John Reck
803b20251a355c88193c439f928a84ae69483fb488John Reck    void interruptForFunctorInvoke();
813b20251a355c88193c439f928a84ae69483fb488John Reck    void resumeFromFunctorInvoke();
823b20251a355c88193c439f928a84ae69483fb488John Reck
833b20251a355c88193c439f928a84ae69483fb488John Reck    RenderState();
843b20251a355c88193c439f928a84ae69483fb488John Reck    ~RenderState();
853b20251a355c88193c439f928a84ae69483fb488John Reck
863b20251a355c88193c439f928a84ae69483fb488John Reck    Caches* mCaches;
871d4774233304c484673e2af2c1de2ab41021c979Chris Craik    std::set<const Layer*> mActiveLayers;
88443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck    std::set<renderthread::CanvasContext*> mRegisteredContexts;
893b20251a355c88193c439f928a84ae69483fb488John Reck
903b20251a355c88193c439f928a84ae69483fb488John Reck    GLsizei mViewportWidth;
913b20251a355c88193c439f928a84ae69483fb488John Reck    GLsizei mViewportHeight;
923b20251a355c88193c439f928a84ae69483fb488John Reck    GLuint mFramebuffer;
93599e254ea33231b1809466ae765dbee53dc4685cChris Craik    Mutex mLayerLock;
943b20251a355c88193c439f928a84ae69483fb488John Reck};
953b20251a355c88193c439f928a84ae69483fb488John Reck
963b20251a355c88193c439f928a84ae69483fb488John Reck} /* namespace uirenderer */
973b20251a355c88193c439f928a84ae69483fb488John Reck} /* namespace android */
983b20251a355c88193c439f928a84ae69483fb488John Reck
993b20251a355c88193c439f928a84ae69483fb488John Reck#endif /* RENDERSTATE_H */
100