18cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel/*
28cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel * Copyright (C) 2017 The Android Open Source Project
38cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel *
48cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel * Licensed under the Apache License, Version 2.0 (the "License");
58cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel * you may not use this file except in compliance with the License.
68cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel * You may obtain a copy of the License at
78cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel *
88cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel *      http://www.apache.org/licenses/LICENSE-2.0
98cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel *
108cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel * Unless required by applicable law or agreed to in writing, software
118cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel * distributed under the License is distributed on an "AS IS" BASIS,
128cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel * See the License for the specific language governing permissions and
148cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel * limitations under the License.
158cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel */
168cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
178cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel#include "GlLayer.h"
188cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
198cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel#include "Caches.h"
208cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel#include "RenderNode.h"
218cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel#include "renderstate/RenderState.h"
228cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel#include "utils/TraceUtils.h"
238cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
248cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel#include <utils/Log.h>
258cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
268cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel#define ATRACE_LAYER_WORK(label) \
278cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    ATRACE_FORMAT("%s HW Layer DisplayList %s %ux%u", \
288cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel            label, \
298cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel            (renderNode.get() != NULL) ? renderNode->getName() : "", \
308cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel            getWidth(), getHeight())
318cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
328cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Danielnamespace android {
338cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Danielnamespace uirenderer {
348cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
353e9999bd866fac71c72e6b484a9836c87c328a08sergeyvGlLayer::GlLayer(RenderState& renderState, uint32_t layerWidth, uint32_t layerHeight,
363e9999bd866fac71c72e6b484a9836c87c328a08sergeyv        SkColorFilter* colorFilter, int alpha, SkBlendMode mode, bool blend)
373e9999bd866fac71c72e6b484a9836c87c328a08sergeyv        : Layer(renderState, Api::OpenGL, colorFilter, alpha, mode)
388cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel        , caches(Caches::getInstance())
398cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel        , texture(caches) {
408cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    texture.mWidth = layerWidth;
418cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    texture.mHeight = layerHeight;
423e9999bd866fac71c72e6b484a9836c87c328a08sergeyv    texture.blend = blend;
438cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel}
448cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
458cd3edfa15cc9cdbffa935d19ab894426b08d174Greg DanielGlLayer::~GlLayer() {
4600eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv    // There's a rare possibility that Caches could have been destroyed already
4700eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv    // since this method is queued up as a task.
4800eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv    // Since this is a reset method, treat this as non-fatal.
4900eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv    if (caches.isInitialized() && texture.mId) {
508cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel        texture.deleteTexture();
518cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    }
528cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel}
538cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
548cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Danielvoid GlLayer::onGlContextLost() {
558cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    texture.deleteTexture();
568cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel}
578cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
5809df887c9078a34f2bda32c83734b7f75c0a60ffChris Craikvoid GlLayer::setRenderTarget(GLenum renderTarget) {
5909df887c9078a34f2bda32c83734b7f75c0a60ffChris Craik    if (renderTarget != getRenderTarget()) {
6009df887c9078a34f2bda32c83734b7f75c0a60ffChris Craik        // new render target: bind with new target, and update filter/wrap
6109df887c9078a34f2bda32c83734b7f75c0a60ffChris Craik        texture.mTarget = renderTarget;
6209df887c9078a34f2bda32c83734b7f75c0a60ffChris Craik        if (texture.mId) {
6309df887c9078a34f2bda32c83734b7f75c0a60ffChris Craik            caches.textureState().bindTexture(texture.target(), texture.mId);
6409df887c9078a34f2bda32c83734b7f75c0a60ffChris Craik        }
6509df887c9078a34f2bda32c83734b7f75c0a60ffChris Craik        texture.setFilter(GL_NEAREST, false, true);
6609df887c9078a34f2bda32c83734b7f75c0a60ffChris Craik        texture.setWrap(GL_CLAMP_TO_EDGE, false, true);
678cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    }
688cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel}
698cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
708cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Danielvoid GlLayer::generateTexture() {
718cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    if (!texture.mId) {
728cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel        glGenTextures(1, &texture.mId);
738cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    }
748cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel}
758cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
768cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel}; // namespace uirenderer
778cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel}; // namespace android
78