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/GraphicBufferAlloc.h>
189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <gui/GLConsumer.h>
19e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h>
20b7daa0dadebdb043d63e585975a128c5fc087168Mathias Agopian#include <gui/SurfaceControl.h>
219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <EGL/egl.h>
239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <GLES2/gl2.h>
249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisnamespace android {
269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisclass SurfaceComposerClient;
289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisclass SurfaceControl;
299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisenum { MAX_SHADER_LINES = 128 };
319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstruct ShaderDesc {
339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    const char* name;
349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    const char* vertexShader[MAX_SHADER_LINES];
359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    const char* fragmentShader[MAX_SHADER_LINES];
369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis};
379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisclass GLHelper {
399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennispublic:
419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    enum { DITHER_KERNEL_SIZE = 4 };
439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    GLHelper();
459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    ~GLHelper();
479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool setUp(const ShaderDesc* shaderDescs, size_t numShaders);
499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    void tearDown();
519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool makeCurrent(EGLSurface surface);
539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool createSurfaceTexture(uint32_t w, uint32_t h,
559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            sp<GLConsumer>* surfaceTexture, EGLSurface* surface,
569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            GLuint* name);
579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool createWindowSurface(uint32_t w, uint32_t h,
599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            sp<SurfaceControl>* surfaceControl, EGLSurface* surface);
609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    void destroySurface(EGLSurface* surface);
629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool swapBuffers(EGLSurface surface);
649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool getShaderProgram(const char* name, GLuint* outPgm);
669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool getDitherTexture(GLuint* outTexName);
689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisprivate:
709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool createNamedSurfaceTexture(GLuint name, uint32_t w, uint32_t h,
729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            sp<GLConsumer>* surfaceTexture, EGLSurface* surface);
739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool computeWindowScale(uint32_t w, uint32_t h, float* scale);
759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool setUpShaders(const ShaderDesc* shaderDescs, size_t numShaders);
779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    sp<GraphicBufferAlloc> mGraphicBufferAlloc;
799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    EGLDisplay mDisplay;
819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    EGLContext mContext;
829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    EGLSurface mDummySurface;
839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    sp<GLConsumer> mDummyGLConsumer;
849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    EGLConfig mConfig;
859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    sp<SurfaceComposerClient> mSurfaceComposerClient;
879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    GLuint* mShaderPrograms;
899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    const ShaderDesc* mShaderDescs;
909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    size_t mNumShaders;
919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    GLuint mDitherTexture;
939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis};
949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} // namespace android
96