blob: b595ab859a61df520b6bfea4d3e0514ac163fb1f [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"
John Reckd9d7f122018-05-03 14:40:56 -070019#include "Snapshot.h"
John Reck3b202512014-06-23 13:13:08 -070020
John Reck443a7142014-09-04 17:40:05 -070021#include "renderthread/CanvasContext.h"
John Reck0e89e2b2014-10-31 14:49:06 -070022#include "renderthread/EglManager.h"
Chris Craik117bdbc2015-02-05 10:12:38 -080023#include "utils/GLUtils.h"
Romain Guycaaaa662017-03-27 00:40:21 -070024
Chris Craik9db58c02015-08-19 15:19:18 -070025#include <algorithm>
26
Romain Guycaaaa662017-03-27 00:40:21 -070027#include <ui/ColorSpace.h>
28
John Reck3b202512014-06-23 13:13:08 -070029namespace android {
30namespace uirenderer {
31
John Reck0e89e2b2014-10-31 14:49:06 -070032RenderState::RenderState(renderthread::RenderThread& thread)
John Reck1bcacfd2017-11-03 10:12:19 -070033 : mRenderThread(thread), mViewportWidth(0), mViewportHeight(0), mFramebuffer(0) {
John Reck0e89e2b2014-10-31 14:49:06 -070034 mThreadId = pthread_self();
John Reck3b202512014-06-23 13:13:08 -070035}
36
37RenderState::~RenderState() {
38}
39
Stan Iliev564ca3e2018-09-04 22:00:00 +000040void RenderState::onContextCreated() {
Greg Daniel45ec62b2017-01-04 14:27:00 -050041 GpuMemoryTracker::onGpuContextCreated();
42}
43
Derek Sollenberger5a5a6482018-09-19 13:52:13 -040044static void destroyLayerInUpdater(DeferredLayerUpdater* layerUpdater) {
45 layerUpdater->destroyLayer();
46}
47
Stan Iliev564ca3e2018-09-04 22:00:00 +000048void RenderState::onContextDestroyed() {
Derek Sollenberger5a5a6482018-09-19 13:52:13 -040049 std::for_each(mActiveLayerUpdaters.begin(), mActiveLayerUpdaters.end(), destroyLayerInUpdater);
50 for(auto callback : mContextCallbacks) {
51 callback->onContextDestroyed();
52 }
Greg Daniel45ec62b2017-01-04 14:27:00 -050053 GpuMemoryTracker::onGpuContextDestroyed();
54}
55
56GrContext* RenderState::getGrContext() const {
57 return mRenderThread.getGrContext();
Chris Craik1d477422014-08-26 17:30:15 -070058}
59
John Reck9a814872017-05-22 15:04:21 -070060void RenderState::onBitmapDestroyed(uint32_t pixelRefId) {
Mike Reed8cafcc62018-05-03 11:32:46 -040061 // DEAD CODE
John Reck9a814872017-05-22 15:04:21 -070062}
63
John Reck3b202512014-06-23 13:13:08 -070064void RenderState::setViewport(GLsizei width, GLsizei height) {
65 mViewportWidth = width;
66 mViewportHeight = height;
67 glViewport(0, 0, mViewportWidth, mViewportHeight);
68}
69
John Reck3b202512014-06-23 13:13:08 -070070void RenderState::getViewport(GLsizei* outWidth, GLsizei* outHeight) {
71 *outWidth = mViewportWidth;
72 *outHeight = mViewportHeight;
73}
74
75void RenderState::bindFramebuffer(GLuint fbo) {
76 if (mFramebuffer != fbo) {
77 mFramebuffer = fbo;
78 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
79 }
80}
81
John Reck0b8d0672016-01-29 14:18:22 -080082GLuint RenderState::createFramebuffer() {
Chris Craik818c9fb2015-10-23 14:33:42 -070083 GLuint ret;
84 glGenFramebuffers(1, &ret);
85 return ret;
86}
87
88void RenderState::deleteFramebuffer(GLuint fbo) {
89 if (mFramebuffer == fbo) {
90 // GL defines that deleting the currently bound FBO rebinds FBO 0.
91 // Reflect this in our cached value.
92 mFramebuffer = 0;
93 }
94 glDeleteFramebuffers(1, &fbo);
95}
96
John Reck3b202512014-06-23 13:13:08 -070097void RenderState::debugOverdraw(bool enable, bool clear) {
Mike Reede7f688b2018-05-04 15:21:43 -040098 // DEAD CODE
John Reck3b202512014-06-23 13:13:08 -070099}
100
John Reck0e89e2b2014-10-31 14:49:06 -0700101void RenderState::postDecStrong(VirtualLightRefBase* object) {
John Recka55b5d62016-01-14 15:09:10 -0800102 if (pthread_equal(mThreadId, pthread_self())) {
103 object->decStrong(nullptr);
104 } else {
John Reckf8441e62017-10-23 13:10:41 -0700105 mRenderThread.queue().post([object]() { object->decStrong(nullptr); });
John Recka55b5d62016-01-14 15:09:10 -0800106 }
John Reck0e89e2b2014-10-31 14:49:06 -0700107}
108
Chris Craik6c15ffa2015-02-02 13:50:55 -0800109///////////////////////////////////////////////////////////////////////////////
110// Render
111///////////////////////////////////////////////////////////////////////////////
112
Chris Craik117bdbc2015-02-05 10:12:38 -0800113void RenderState::dump() {
Mike Reede7f688b2018-05-04 15:21:43 -0400114 // DEAD CODE
Chris Craik6c15ffa2015-02-02 13:50:55 -0800115}
116
Stan Iliev564ca3e2018-09-04 22:00:00 +0000117renderthread::RenderThread& RenderState::getRenderThread() {
118 return mRenderThread;
119}
120
John Reck3b202512014-06-23 13:13:08 -0700121} /* namespace uirenderer */
122} /* namespace android */