13f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian/*
23f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * Copyright 2013 The Android Open Source Project
33f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian *
43f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
53f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * you may not use this file except in compliance with the License.
63f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * You may obtain a copy of the License at
73f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian *
83f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
93f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian *
103f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * Unless required by applicable law or agreed to in writing, software
113f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
123f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * See the License for the specific language governing permissions and
143f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * limitations under the License.
153f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian */
163f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
173f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
183f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#ifndef SF_GLES20RENDERENGINE_H_
193f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#define SF_GLES20RENDERENGINE_H_
203f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
213f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include <stdint.h>
223f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include <sys/types.h>
233f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
243f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include <GLES2/gl2.h>
25c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews#include <Transform.h>
263f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
273f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include "RenderEngine.h"
283f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include "ProgramCache.h"
293f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include "Description.h"
303f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
313f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian// ---------------------------------------------------------------------------
323f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopiannamespace android {
333f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian// ---------------------------------------------------------------------------
343f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
353f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianclass String8;
363f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianclass Mesh;
3749457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopianclass Texture;
383f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
393f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianclass GLES20RenderEngine : public RenderEngine {
403f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    GLuint mProtectedTexName;
413f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    GLint mMaxViewportDims[2];
423f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    GLint mMaxTextureSize;
43ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    GLuint mVpWidth;
44ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    GLuint mVpHeight;
45ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian
46ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    struct Group {
47ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian        GLuint texture;
48ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian        GLuint fbo;
49ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian        GLuint width;
50ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian        GLuint height;
51ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian        mat4 colorTransform;
52ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    };
533f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
543f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    Description mState;
55ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    Vector<Group> mGroupStack;
563f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
57458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian    virtual void bindImageAsFramebuffer(EGLImageKHR image,
58458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian            uint32_t* texName, uint32_t* fbName, uint32_t* status);
59458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian    virtual void unbindFramebuffer(uint32_t texName, uint32_t fbName);
60458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian
613f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianpublic:
623f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    GLES20RenderEngine();
633f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
643f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianprotected:
653f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    virtual ~GLES20RenderEngine();
663f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
673f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    virtual void dump(String8& result);
68c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    virtual void setViewportAndProjection(size_t vpw, size_t vph,
699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            Rect sourceCrop, size_t hwh, bool yswap,
709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            Transform::orientation_flags rotation);
719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    virtual void setupLayerBlending(bool premultipliedAlpha, bool opaque,
739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            float alpha) override;
749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    virtual void setupDimLayerBlending(float alpha) override;
755d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter
765d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    // Color management related functions and state
775d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    void setColorMode(android_color_mode mode);
785d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    void setSourceDataSpace(android_dataspace source);
795d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    void setWideColor(bool hasWideColor);
805d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    bool usesWideColor();
815d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter
825d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    // Current color mode of display using the render engine
835d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    android_color_mode mColorMode = HAL_COLOR_MODE_NATIVE;
845d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter
855d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    // Current dataspace of layer being rendered
865d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    android_dataspace mDataSpace = HAL_DATASPACE_V0_SRGB;
875d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter
885d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    // Indicate if wide-color mode is needed or not
895d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    bool mPlatformHasWideColor = false;
905d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    bool mDisplayHasWideColor = false;
915d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    bool mUseWideColor = false;
925d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    uint64_t mWideColorFrameCount = 0;
935d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter
945d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    // Currently only supporting sRGB and DisplayP3 color spaces
955d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    mat4 mSrgbToDisplayP3;
969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    virtual void setupLayerBlending(bool premultipliedAlpha, bool opaque,
989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            int alpha);
999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    virtual void setupDimLayerBlending(int alpha);
1009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
10149457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    virtual void setupLayerTexturing(const Texture& texture);
1023f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    virtual void setupLayerBlackedOut();
10319733a32799f792125913e746e8644d16f8dc223Mathias Agopian    virtual void setupFillWithColor(float r, float g, float b, float a);
104f008799d3753e52c10849824ff8146985ea66284Dan Stoza    virtual mat4 setupColorTransform(const mat4& colorTransform);
1053f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    virtual void disableTexturing();
1063f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    virtual void disableBlending();
1073f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1083f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    virtual void drawMesh(const Mesh& mesh);
1093f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1103f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    virtual size_t getMaxTextureSize() const;
1113f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    virtual size_t getMaxViewportDims() const;
1123f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian};
1133f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1143f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian// ---------------------------------------------------------------------------
1153f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android
1163f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian// ---------------------------------------------------------------------------
1173f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1183f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif /* SF_GLES20RENDERENGINE_H_ */
119