blob: b524bcb096dab3bb62601eb79bd180d77348cec3 [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
Stan Iliev564ca3e2018-09-04 22:00:00 +000044void RenderState::onContextDestroyed() {
Derek Sollenberger7a4216b2017-10-25 09:52:23 -040045 destroyLayersInUpdater();
Greg Daniel45ec62b2017-01-04 14:27:00 -050046 GpuMemoryTracker::onGpuContextDestroyed();
47}
48
49GrContext* RenderState::getGrContext() const {
50 return mRenderThread.getGrContext();
Chris Craik1d477422014-08-26 17:30:15 -070051}
52
John Reck9a814872017-05-22 15:04:21 -070053void RenderState::onBitmapDestroyed(uint32_t pixelRefId) {
Mike Reed8cafcc62018-05-03 11:32:46 -040054 // DEAD CODE
John Reck9a814872017-05-22 15:04:21 -070055}
56
John Reck3b202512014-06-23 13:13:08 -070057void RenderState::setViewport(GLsizei width, GLsizei height) {
58 mViewportWidth = width;
59 mViewportHeight = height;
60 glViewport(0, 0, mViewportWidth, mViewportHeight);
61}
62
John Reck3b202512014-06-23 13:13:08 -070063void RenderState::getViewport(GLsizei* outWidth, GLsizei* outHeight) {
64 *outWidth = mViewportWidth;
65 *outHeight = mViewportHeight;
66}
67
68void RenderState::bindFramebuffer(GLuint fbo) {
69 if (mFramebuffer != fbo) {
70 mFramebuffer = fbo;
71 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
72 }
73}
74
John Reck0b8d0672016-01-29 14:18:22 -080075GLuint RenderState::createFramebuffer() {
Chris Craik818c9fb2015-10-23 14:33:42 -070076 GLuint ret;
77 glGenFramebuffers(1, &ret);
78 return ret;
79}
80
81void RenderState::deleteFramebuffer(GLuint fbo) {
82 if (mFramebuffer == fbo) {
83 // GL defines that deleting the currently bound FBO rebinds FBO 0.
84 // Reflect this in our cached value.
85 mFramebuffer = 0;
86 }
87 glDeleteFramebuffers(1, &fbo);
88}
89
John Reck3b202512014-06-23 13:13:08 -070090void RenderState::debugOverdraw(bool enable, bool clear) {
Mike Reede7f688b2018-05-04 15:21:43 -040091 // DEAD CODE
John Reck3b202512014-06-23 13:13:08 -070092}
93
sergeyv3e9999b2017-01-19 15:37:02 -080094static void destroyLayerInUpdater(DeferredLayerUpdater* layerUpdater) {
95 layerUpdater->destroyLayer();
96}
97
98void RenderState::destroyLayersInUpdater() {
99 std::for_each(mActiveLayerUpdaters.begin(), mActiveLayerUpdaters.end(), destroyLayerInUpdater);
100}
101
John Reck0e89e2b2014-10-31 14:49:06 -0700102void RenderState::postDecStrong(VirtualLightRefBase* object) {
John Recka55b5d62016-01-14 15:09:10 -0800103 if (pthread_equal(mThreadId, pthread_self())) {
104 object->decStrong(nullptr);
105 } else {
John Reckf8441e62017-10-23 13:10:41 -0700106 mRenderThread.queue().post([object]() { object->decStrong(nullptr); });
John Recka55b5d62016-01-14 15:09:10 -0800107 }
John Reck0e89e2b2014-10-31 14:49:06 -0700108}
109
Chris Craik6c15ffa2015-02-02 13:50:55 -0800110///////////////////////////////////////////////////////////////////////////////
111// Render
112///////////////////////////////////////////////////////////////////////////////
113
Chris Craik117bdbc2015-02-05 10:12:38 -0800114void RenderState::dump() {
Mike Reede7f688b2018-05-04 15:21:43 -0400115 // DEAD CODE
Chris Craik6c15ffa2015-02-02 13:50:55 -0800116}
117
Stan Iliev564ca3e2018-09-04 22:00:00 +0000118renderthread::RenderThread& RenderState::getRenderThread() {
119 return mRenderThread;
120}
121
John Reck3b202512014-06-23 13:13:08 -0700122} /* namespace uirenderer */
123} /* namespace android */