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 193b20251a355c88193c439f928a84ae69483fb488John Reck#include "Caches.h" 206c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#include "Glop.h" 215854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik#include "renderstate/Blend.h" 2296a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "renderstate/MeshState.h" 239fded232a9548a304e0145011df8849fba0dcda7Chris Craik#include "renderstate/OffscreenBufferPool.h" 2496a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "renderstate/PixelBufferState.h" 2596a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "renderstate/Scissor.h" 2696a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "renderstate/Stencil.h" 273b20251a355c88193c439f928a84ae69483fb488John Reck#include "utils/Macros.h" 283b20251a355c88193c439f928a84ae69483fb488John Reck 295854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik#include <set> 305854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik#include <GLES2/gl2.h> 315854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik#include <GLES2/gl2ext.h> 325854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik#include <ui/Region.h> 335854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik#include <utils/Mutex.h> 345854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik#include <utils/Functor.h> 355854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik#include <utils/RefBase.h> 365854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik#include <private/hwui/DrawGlInfo.h> 375854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik 3845ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Danielclass GrContext; 3945ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel 403b20251a355c88193c439f928a84ae69483fb488John Recknamespace android { 413b20251a355c88193c439f928a84ae69483fb488John Recknamespace uirenderer { 423b20251a355c88193c439f928a84ae69483fb488John Reck 432dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudsonclass Caches; 442dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudsonclass Layer; 453e9999bd866fac71c72e6b484a9836c87c328a08sergeyvclass DeferredLayerUpdater; 462dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson 473b20251a355c88193c439f928a84ae69483fb488John Recknamespace renderthread { 48443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reckclass CanvasContext; 493b20251a355c88193c439f928a84ae69483fb488John Reckclass RenderThread; 503b20251a355c88193c439f928a84ae69483fb488John Reck} 513b20251a355c88193c439f928a84ae69483fb488John Reck 523b20251a355c88193c439f928a84ae69483fb488John Reck// TODO: Replace Cache's GL state tracking with this. For now it's more a thin 533b20251a355c88193c439f928a84ae69483fb488John Reck// wrapper of Caches for users to migrate to. 543b20251a355c88193c439f928a84ae69483fb488John Reckclass RenderState { 553b20251a355c88193c439f928a84ae69483fb488John Reck PREVENT_COPY_AND_ASSIGN(RenderState); 565854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik friend class renderthread::RenderThread; 575854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik friend class Caches; 583b20251a355c88193c439f928a84ae69483fb488John Reckpublic: 593b20251a355c88193c439f928a84ae69483fb488John Reck void onGLContextCreated(); 601d4774233304c484673e2af2c1de2ab41021c979Chris Craik void onGLContextDestroyed(); 613b20251a355c88193c439f928a84ae69483fb488John Reck 6245ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel void onVkContextCreated(); 6345ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel void onVkContextDestroyed(); 6445ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel 659fded232a9548a304e0145011df8849fba0dcda7Chris Craik void flush(Caches::FlushMode flushMode); 669a814875c4e3a98fea99dae623f22268a9afa38aJohn Reck void onBitmapDestroyed(uint32_t pixelRefId); 679fded232a9548a304e0145011df8849fba0dcda7Chris Craik 683b20251a355c88193c439f928a84ae69483fb488John Reck void setViewport(GLsizei width, GLsizei height); 693b20251a355c88193c439f928a84ae69483fb488John Reck void getViewport(GLsizei* outWidth, GLsizei* outHeight); 703b20251a355c88193c439f928a84ae69483fb488John Reck 713b20251a355c88193c439f928a84ae69483fb488John Reck void bindFramebuffer(GLuint fbo); 72818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik GLuint getFramebuffer() { return mFramebuffer; } 730b8d0677be2289bbc9e0b48c0878fb67d1cc0ebdJohn Reck GLuint createFramebuffer(); 74818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik void deleteFramebuffer(GLuint fbo); 75818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 763b20251a355c88193c439f928a84ae69483fb488John Reck void invokeFunctor(Functor* functor, DrawGlInfo::Mode mode, DrawGlInfo* info); 773b20251a355c88193c439f928a84ae69483fb488John Reck 783b20251a355c88193c439f928a84ae69483fb488John Reck void debugOverdraw(bool enable, bool clear); 793b20251a355c88193c439f928a84ae69483fb488John Reck 8057998017ff137f7d4ec33df21b6596141f8c4547John Reck void registerLayer(Layer* layer) { 811d4774233304c484673e2af2c1de2ab41021c979Chris Craik mActiveLayers.insert(layer); 821d4774233304c484673e2af2c1de2ab41021c979Chris Craik } 8357998017ff137f7d4ec33df21b6596141f8c4547John Reck void unregisterLayer(Layer* layer) { 841d4774233304c484673e2af2c1de2ab41021c979Chris Craik mActiveLayers.erase(layer); 851d4774233304c484673e2af2c1de2ab41021c979Chris Craik } 861d4774233304c484673e2af2c1de2ab41021c979Chris Craik 87443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck void registerCanvasContext(renderthread::CanvasContext* context) { 88443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck mRegisteredContexts.insert(context); 89443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck } 90443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck 91443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck void unregisterCanvasContext(renderthread::CanvasContext* context) { 92443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck mRegisteredContexts.erase(context); 93443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck } 94443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck 953e9999bd866fac71c72e6b484a9836c87c328a08sergeyv void registerDeferredLayerUpdater(DeferredLayerUpdater* layerUpdater) { 963e9999bd866fac71c72e6b484a9836c87c328a08sergeyv mActiveLayerUpdaters.insert(layerUpdater); 973e9999bd866fac71c72e6b484a9836c87c328a08sergeyv } 983e9999bd866fac71c72e6b484a9836c87c328a08sergeyv 993e9999bd866fac71c72e6b484a9836c87c328a08sergeyv void unregisterDeferredLayerUpdater(DeferredLayerUpdater* layerUpdater) { 1003e9999bd866fac71c72e6b484a9836c87c328a08sergeyv mActiveLayerUpdaters.erase(layerUpdater); 1013e9999bd866fac71c72e6b484a9836c87c328a08sergeyv } 1023e9999bd866fac71c72e6b484a9836c87c328a08sergeyv 1030e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck // TODO: This system is a little clunky feeling, this could use some 1040e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck // more thinking... 1050e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck void postDecStrong(VirtualLightRefBase* object); 1060e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck 10712efe649d3f5df8e81f4b78179939c1d488673a0Chris Craik void render(const Glop& glop, const Matrix4& orthoMatrix); 1086c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik 10944eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik Blend& blend() { return *mBlend; } 11096a5c4c7bab6718524de7253da8309143ab48befChris Craik MeshState& meshState() { return *mMeshState; } 11196a5c4c7bab6718524de7253da8309143ab48befChris Craik Scissor& scissor() { return *mScissor; } 11296a5c4c7bab6718524de7253da8309143ab48befChris Craik Stencil& stencil() { return *mStencil; } 113117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik 1149fded232a9548a304e0145011df8849fba0dcda7Chris Craik OffscreenBufferPool& layerPool() { return mLayerPool; } 1159fded232a9548a304e0145011df8849fba0dcda7Chris Craik 11645ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel GrContext* getGrContext() const; 11745ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel 118117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik void dump(); 1193b20251a355c88193c439f928a84ae69483fb488John Reck 1205854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikprivate: 1213b20251a355c88193c439f928a84ae69483fb488John Reck void interruptForFunctorInvoke(); 1223b20251a355c88193c439f928a84ae69483fb488John Reck void resumeFromFunctorInvoke(); 123c3f131696111a066d9efd9c7c3e37566a2a9fb89sergeyv void destroyLayersInUpdater(); 1243b20251a355c88193c439f928a84ae69483fb488John Reck 12549796451cb9d1dae580618eb320ef3c5e6d90cd4Chih-Hung Hsieh explicit RenderState(renderthread::RenderThread& thread); 1263b20251a355c88193c439f928a84ae69483fb488John Reck ~RenderState(); 1273b20251a355c88193c439f928a84ae69483fb488John Reck 12865fe5eeb19e2e15c8b1ee91e8a2dcf0c25e48ca6Chris Craik 1290e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck renderthread::RenderThread& mRenderThread; 13044eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik Caches* mCaches = nullptr; 13196a5c4c7bab6718524de7253da8309143ab48befChris Craik 13244eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik Blend* mBlend = nullptr; 13344eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik MeshState* mMeshState = nullptr; 13444eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik Scissor* mScissor = nullptr; 13544eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik Stencil* mStencil = nullptr; 13696a5c4c7bab6718524de7253da8309143ab48befChris Craik 1379fded232a9548a304e0145011df8849fba0dcda7Chris Craik OffscreenBufferPool mLayerPool; 1389fded232a9548a304e0145011df8849fba0dcda7Chris Craik 13957998017ff137f7d4ec33df21b6596141f8c4547John Reck std::set<Layer*> mActiveLayers; 1403e9999bd866fac71c72e6b484a9836c87c328a08sergeyv std::set<DeferredLayerUpdater*> mActiveLayerUpdaters; 141443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck std::set<renderthread::CanvasContext*> mRegisteredContexts; 1423b20251a355c88193c439f928a84ae69483fb488John Reck 1433b20251a355c88193c439f928a84ae69483fb488John Reck GLsizei mViewportWidth; 1443b20251a355c88193c439f928a84ae69483fb488John Reck GLsizei mViewportHeight; 1453b20251a355c88193c439f928a84ae69483fb488John Reck GLuint mFramebuffer; 1460e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck 1470e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck pthread_t mThreadId; 1483b20251a355c88193c439f928a84ae69483fb488John Reck}; 1493b20251a355c88193c439f928a84ae69483fb488John Reck 1503b20251a355c88193c439f928a84ae69483fb488John Reck} /* namespace uirenderer */ 1513b20251a355c88193c439f928a84ae69483fb488John Reck} /* namespace android */ 1523b20251a355c88193c439f928a84ae69483fb488John Reck 1533b20251a355c88193c439f928a84ae69483fb488John Reck#endif /* RENDERSTATE_H */ 154