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