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#pragma once
188cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
198cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel#include "Layer.h"
208cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
218cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel#include "Texture.h"
228cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
238cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Danielnamespace android {
248cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Danielnamespace uirenderer {
258cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
268cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel// Forward declarations
278cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Danielclass Caches;
288cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
298cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel/**
308cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel * A layer has dimensions and is backed by an OpenGL texture or FBO.
318cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel */
328cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Danielclass GlLayer : public Layer {
338cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Danielpublic:
343e9999bd866fac71c72e6b484a9836c87c328a08sergeyv    GlLayer(RenderState& renderState, uint32_t layerWidth, uint32_t layerHeight,
353e9999bd866fac71c72e6b484a9836c87c328a08sergeyv            SkColorFilter* colorFilter, int alpha, SkBlendMode mode, bool blend);
368cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    virtual ~GlLayer();
378cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
388cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    uint32_t getWidth() const override {
398cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel        return texture.mWidth;
408cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    }
418cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
428cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    uint32_t getHeight() const override {
438cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel        return texture.mHeight;
448cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    }
458cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
468cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    void setSize(uint32_t width, uint32_t height) override {
47caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        texture.updateLayout(width, height, texture.internalFormat(), texture.format(),
488cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel                texture.target());
498cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    }
508cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
518cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    void setBlend(bool blend) override {
528cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel        texture.blend = blend;
538cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    }
548cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
558cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    bool isBlend() const override {
568cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel        return texture.blend;
578cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    }
588cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
598cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    inline GLuint getTextureId() const {
608cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel        return texture.id();
618cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    }
628cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
638cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    inline Texture& getTexture() {
648cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel        return texture;
658cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    }
668cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
678cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    inline GLenum getRenderTarget() const {
688cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel        return texture.target();
698cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    }
708cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
718cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    inline bool isRenderable() const {
728cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel        return texture.target() != GL_NONE;
738cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    }
748cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
7509df887c9078a34f2bda32c83734b7f75c0a60ffChris Craik    void setRenderTarget(GLenum renderTarget);
768cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
778cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    void generateTexture();
788cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
798cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    /**
808cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel     * Lost the GL context but the layer is still around, mark it invalid internally
818cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel     * so the dtor knows not to do any GL work
828cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel     */
838cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    void onGlContextLost();
848cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
858cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Danielprivate:
868cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    Caches& caches;
878cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
888cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    /**
898cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel     * The texture backing this layer.
908cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel     */
918cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel    Texture texture;
928cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel}; // struct GlLayer
938cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
948cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel}; // namespace uirenderer
958cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel}; // namespace android
96