blob: 3be84f588a206aabeec5718d12a81b39f269ac36 [file] [log] [blame]
John Reck3b202512014-06-23 13:13:08 -07001/*
2 * Copyright (C) 2014 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 */
John Reck1bcacfd2017-11-03 10:12:19 -070016#include "renderstate/RenderState.h"
17#include <GpuMemoryTracker.h>
sergeyv3e9999b2017-01-19 15:37:02 -080018#include "DeferredLayerUpdater.h"
Greg Daniel8cd3edf2017-01-09 14:15:41 -050019#include "GlLayer.h"
Greg Daniel45ec62b2017-01-04 14:27:00 -050020#include "VkLayer.h"
John Reckd9d7f122018-05-03 14:40:56 -070021#include "Snapshot.h"
John Reck3b202512014-06-23 13:13:08 -070022
John Reck443a7142014-09-04 17:40:05 -070023#include "renderthread/CanvasContext.h"
John Reck0e89e2b2014-10-31 14:49:06 -070024#include "renderthread/EglManager.h"
Chris Craik117bdbc2015-02-05 10:12:38 -080025#include "utils/GLUtils.h"
Romain Guycaaaa662017-03-27 00:40:21 -070026
Chris Craik9db58c02015-08-19 15:19:18 -070027#include <algorithm>
28
Romain Guycaaaa662017-03-27 00:40:21 -070029#include <ui/ColorSpace.h>
30
John Reck3b202512014-06-23 13:13:08 -070031namespace android {
32namespace uirenderer {
33
John Reck0e89e2b2014-10-31 14:49:06 -070034RenderState::RenderState(renderthread::RenderThread& thread)
John Reck1bcacfd2017-11-03 10:12:19 -070035 : mRenderThread(thread), mViewportWidth(0), mViewportHeight(0), mFramebuffer(0) {
John Reck0e89e2b2014-10-31 14:49:06 -070036 mThreadId = pthread_self();
John Reck3b202512014-06-23 13:13:08 -070037}
38
39RenderState::~RenderState() {
40}
41
42void RenderState::onGLContextCreated() {
Greg Daniel45ec62b2017-01-04 14:27:00 -050043 GpuMemoryTracker::onGpuContextCreated();
John Reck38e0c322015-11-10 12:19:17 -080044
Chris Craik96a5c4c2015-01-27 15:46:35 -080045 // This is delayed because the first access of Caches makes GL calls
Chris Craikff5c8e82015-01-30 09:46:18 -080046 if (!mCaches) {
47 mCaches = &Caches::createInstance(*this);
48 }
Chris Craik96a5c4c2015-01-27 15:46:35 -080049 mCaches->init();
John Reck3b202512014-06-23 13:13:08 -070050}
51
John Reck49bc4ac2015-01-29 12:53:38 -080052static void layerLostGlContext(Layer* layer) {
Greg Daniel8cd3edf2017-01-09 14:15:41 -050053 LOG_ALWAYS_FATAL_IF(layer->getApi() != Layer::Api::OpenGL,
John Reck1bcacfd2017-11-03 10:12:19 -070054 "layerLostGlContext on non GL layer");
Greg Daniel8cd3edf2017-01-09 14:15:41 -050055 static_cast<GlLayer*>(layer)->onGlContextLost();
John Reck49bc4ac2015-01-29 12:53:38 -080056}
57
Chris Craik1d477422014-08-26 17:30:15 -070058void RenderState::onGLContextDestroyed() {
Chris Craik96a5c4c2015-01-27 15:46:35 -080059 // TODO: reset all cached state in state objects
John Reck49bc4ac2015-01-29 12:53:38 -080060 std::for_each(mActiveLayers.begin(), mActiveLayers.end(), layerLostGlContext);
Chris Craik96a5c4c2015-01-27 15:46:35 -080061
Chris Craik44eb2c02015-01-29 09:45:09 -080062 mCaches->terminate();
63
sergeyvc3f13162017-02-06 11:45:14 -080064 destroyLayersInUpdater();
Greg Daniel45ec62b2017-01-04 14:27:00 -050065 GpuMemoryTracker::onGpuContextDestroyed();
66}
67
68void RenderState::onVkContextCreated() {
Greg Daniel45ec62b2017-01-04 14:27:00 -050069 GpuMemoryTracker::onGpuContextCreated();
70}
71
72static void layerDestroyedVkContext(Layer* layer) {
73 LOG_ALWAYS_FATAL_IF(layer->getApi() != Layer::Api::Vulkan,
74 "layerLostVkContext on non Vulkan layer");
75 static_cast<VkLayer*>(layer)->onVkContextDestroyed();
76}
77
78void RenderState::onVkContextDestroyed() {
Greg Daniel45ec62b2017-01-04 14:27:00 -050079 std::for_each(mActiveLayers.begin(), mActiveLayers.end(), layerDestroyedVkContext);
Derek Sollenberger7a4216b2017-10-25 09:52:23 -040080 destroyLayersInUpdater();
Greg Daniel45ec62b2017-01-04 14:27:00 -050081 GpuMemoryTracker::onGpuContextDestroyed();
82}
83
84GrContext* RenderState::getGrContext() const {
85 return mRenderThread.getGrContext();
Chris Craik1d477422014-08-26 17:30:15 -070086}
87
Chris Craik9fded232015-11-11 16:42:34 -080088void RenderState::flush(Caches::FlushMode mode) {
John Reck642ebea2017-07-17 09:55:02 -070089 if (mCaches) mCaches->flush(mode);
Chris Craik9fded232015-11-11 16:42:34 -080090}
91
John Reck9a814872017-05-22 15:04:21 -070092void RenderState::onBitmapDestroyed(uint32_t pixelRefId) {
Mike Reed8cafcc62018-05-03 11:32:46 -040093 // DEAD CODE
John Reck9a814872017-05-22 15:04:21 -070094}
95
John Reck3b202512014-06-23 13:13:08 -070096void RenderState::setViewport(GLsizei width, GLsizei height) {
97 mViewportWidth = width;
98 mViewportHeight = height;
99 glViewport(0, 0, mViewportWidth, mViewportHeight);
100}
101
John Reck3b202512014-06-23 13:13:08 -0700102void RenderState::getViewport(GLsizei* outWidth, GLsizei* outHeight) {
103 *outWidth = mViewportWidth;
104 *outHeight = mViewportHeight;
105}
106
107void RenderState::bindFramebuffer(GLuint fbo) {
108 if (mFramebuffer != fbo) {
109 mFramebuffer = fbo;
110 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
111 }
112}
113
John Reck0b8d0672016-01-29 14:18:22 -0800114GLuint RenderState::createFramebuffer() {
Chris Craik818c9fb2015-10-23 14:33:42 -0700115 GLuint ret;
116 glGenFramebuffers(1, &ret);
117 return ret;
118}
119
120void RenderState::deleteFramebuffer(GLuint fbo) {
121 if (mFramebuffer == fbo) {
122 // GL defines that deleting the currently bound FBO rebinds FBO 0.
123 // Reflect this in our cached value.
124 mFramebuffer = 0;
125 }
126 glDeleteFramebuffers(1, &fbo);
127}
128
John Reck3b202512014-06-23 13:13:08 -0700129void RenderState::invokeFunctor(Functor* functor, DrawGlInfo::Mode mode, DrawGlInfo* info) {
John Reck95cd24b2015-08-04 11:17:39 -0700130 if (mode == DrawGlInfo::kModeProcessNoContext) {
131 // If there's no context we don't need to interrupt as there's
132 // no gl state to save/restore
133 (*functor)(mode, info);
134 } else {
135 interruptForFunctorInvoke();
136 (*functor)(mode, info);
137 resumeFromFunctorInvoke();
138 }
John Reck3b202512014-06-23 13:13:08 -0700139}
140
141void RenderState::interruptForFunctorInvoke() {
Chris Craik44eb2c02015-01-29 09:45:09 -0800142 mCaches->textureState().resetActiveTexture();
John Reck3b202512014-06-23 13:13:08 -0700143 debugOverdraw(false, false);
Romain Guy253f2c22016-09-28 17:34:42 -0700144 // TODO: We need a way to know whether the functor is sRGB aware (b/32072673)
John Reck1bcacfd2017-11-03 10:12:19 -0700145 if (mCaches->extensions().hasLinearBlending() && mCaches->extensions().hasSRGBWriteControl()) {
Romain Guy253f2c22016-09-28 17:34:42 -0700146 glDisable(GL_FRAMEBUFFER_SRGB_EXT);
147 }
John Reck3b202512014-06-23 13:13:08 -0700148}
149
150void RenderState::resumeFromFunctorInvoke() {
John Reck1bcacfd2017-11-03 10:12:19 -0700151 if (mCaches->extensions().hasLinearBlending() && mCaches->extensions().hasSRGBWriteControl()) {
Romain Guy253f2c22016-09-28 17:34:42 -0700152 glEnable(GL_FRAMEBUFFER_SRGB_EXT);
153 }
154
John Reck3b202512014-06-23 13:13:08 -0700155 glViewport(0, 0, mViewportWidth, mViewportHeight);
156 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
157 debugOverdraw(false, false);
158
159 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
160
Chris Craik44eb2c02015-01-29 09:45:09 -0800161 mCaches->textureState().activateTexture(0);
162 mCaches->textureState().resetBoundTextures();
John Reck3b202512014-06-23 13:13:08 -0700163}
164
165void RenderState::debugOverdraw(bool enable, bool clear) {
Mike Reede7f688b2018-05-04 15:21:43 -0400166 // DEAD CODE
John Reck3b202512014-06-23 13:13:08 -0700167}
168
sergeyv3e9999b2017-01-19 15:37:02 -0800169static void destroyLayerInUpdater(DeferredLayerUpdater* layerUpdater) {
170 layerUpdater->destroyLayer();
171}
172
173void RenderState::destroyLayersInUpdater() {
174 std::for_each(mActiveLayerUpdaters.begin(), mActiveLayerUpdaters.end(), destroyLayerInUpdater);
175}
176
John Reck0e89e2b2014-10-31 14:49:06 -0700177void RenderState::postDecStrong(VirtualLightRefBase* object) {
John Recka55b5d62016-01-14 15:09:10 -0800178 if (pthread_equal(mThreadId, pthread_self())) {
179 object->decStrong(nullptr);
180 } else {
John Reckf8441e62017-10-23 13:10:41 -0700181 mRenderThread.queue().post([object]() { object->decStrong(nullptr); });
John Recka55b5d62016-01-14 15:09:10 -0800182 }
John Reck0e89e2b2014-10-31 14:49:06 -0700183}
184
Chris Craik6c15ffa2015-02-02 13:50:55 -0800185///////////////////////////////////////////////////////////////////////////////
186// Render
187///////////////////////////////////////////////////////////////////////////////
188
Chris Craik117bdbc2015-02-05 10:12:38 -0800189void RenderState::dump() {
Mike Reede7f688b2018-05-04 15:21:43 -0400190 // DEAD CODE
Chris Craik6c15ffa2015-02-02 13:50:55 -0800191}
192
John Reck3b202512014-06-23 13:13:08 -0700193} /* namespace uirenderer */
194} /* namespace android */