19c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis/*
29c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * Copyright (C) 2012 The Android Open Source Project
39c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis *
49c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License");
59c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * you may not use this file except in compliance with the License.
69c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * You may obtain a copy of the License at
79c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis *
89c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis *      http://www.apache.org/licenses/LICENSE-2.0
99c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis *
109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * Unless required by applicable law or agreed to in writing, software
119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS,
129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * See the License for the specific language governing permissions and
149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * limitations under the License.
159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis */
169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <gui/GLConsumer.h>
18e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h>
19b7daa0dadebdb043d63e585975a128c5fc087168Mathias Agopian#include <gui/SurfaceControl.h>
209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <EGL/egl.h>
229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <GLES2/gl2.h>
239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisnamespace android {
259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisclass SurfaceComposerClient;
279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisclass SurfaceControl;
289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisenum { MAX_SHADER_LINES = 128 };
309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstruct ShaderDesc {
329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    const char* name;
339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    const char* vertexShader[MAX_SHADER_LINES];
349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    const char* fragmentShader[MAX_SHADER_LINES];
359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis};
369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisclass GLHelper {
389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennispublic:
409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    enum { DITHER_KERNEL_SIZE = 4 };
429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    GLHelper();
449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    ~GLHelper();
469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool setUp(const ShaderDesc* shaderDescs, size_t numShaders);
489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    void tearDown();
509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool makeCurrent(EGLSurface surface);
529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool createSurfaceTexture(uint32_t w, uint32_t h,
549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            sp<GLConsumer>* surfaceTexture, EGLSurface* surface,
559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            GLuint* name);
569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool createWindowSurface(uint32_t w, uint32_t h,
589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            sp<SurfaceControl>* surfaceControl, EGLSurface* surface);
599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    void destroySurface(EGLSurface* surface);
619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool swapBuffers(EGLSurface surface);
639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool getShaderProgram(const char* name, GLuint* outPgm);
659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool getDitherTexture(GLuint* outTexName);
679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisprivate:
699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool createNamedSurfaceTexture(GLuint name, uint32_t w, uint32_t h,
719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            sp<GLConsumer>* surfaceTexture, EGLSurface* surface);
729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool computeWindowScale(uint32_t w, uint32_t h, float* scale);
749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool setUpShaders(const ShaderDesc* shaderDescs, size_t numShaders);
769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    EGLDisplay mDisplay;
789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    EGLContext mContext;
799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    EGLSurface mDummySurface;
809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    sp<GLConsumer> mDummyGLConsumer;
819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    EGLConfig mConfig;
829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    sp<SurfaceComposerClient> mSurfaceComposerClient;
849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    GLuint* mShaderPrograms;
869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    const ShaderDesc* mShaderDescs;
879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    size_t mNumShaders;
889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    GLuint mDitherTexture;
909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis};
919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} // namespace android
93