GLHelper.h revision e3c697fb929c856b59fa56a8e05a2a7eba187c3d
17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2012 The Android Open Source Project
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License");
5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) * you may not use this file except in compliance with the License.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You may obtain a copy of the License at
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) *
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) *      http://www.apache.org/licenses/LICENSE-2.0
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) *
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) * Unless required by applicable law or agreed to in writing, software
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS,
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * See the License for the specific language governing permissions and
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * limitations under the License.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <gui/GraphicBufferAlloc.h>
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <gui/GLConsumer.h>
1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <gui/Surface.h>
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <EGL/egl.h>
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <GLES2/gl2.h>
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace android {
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
26b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class SurfaceComposerClient;
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class SurfaceControl;
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)enum { MAX_SHADER_LINES = 128 };
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ShaderDesc {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* name;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* vertexShader[MAX_SHADER_LINES];
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* fragmentShader[MAX_SHADER_LINES];
35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class GLHelper {
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)public:
40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    enum { DITHER_KERNEL_SIZE = 4 };
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    GLHelper();
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    ~GLHelper();
46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    bool setUp(const ShaderDesc* shaderDescs, size_t numShaders);
48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    void tearDown();
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    bool makeCurrent(EGLSurface surface);
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool createSurfaceTexture(uint32_t w, uint32_t h,
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            sp<GLConsumer>* surfaceTexture, EGLSurface* surface,
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GLuint* name);
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool createWindowSurface(uint32_t w, uint32_t h,
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            sp<SurfaceControl>* surfaceControl, EGLSurface* surface);
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    void destroySurface(EGLSurface* surface);
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    bool swapBuffers(EGLSurface surface);
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool getShaderProgram(const char* name, GLuint* outPgm);
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool getDitherTexture(GLuint* outTexName);
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)private:
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool createNamedSurfaceTexture(GLuint name, uint32_t w, uint32_t h,
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            sp<GLConsumer>* surfaceTexture, EGLSurface* surface);
7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    bool computeWindowScale(uint32_t w, uint32_t h, float* scale);
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool setUpShaders(const ShaderDesc* shaderDescs, size_t numShaders);
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    sp<GraphicBufferAlloc> mGraphicBufferAlloc;
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EGLDisplay mDisplay;
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EGLContext mContext;
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EGLSurface mDummySurface;
827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    sp<GLConsumer> mDummyGLConsumer;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EGLConfig mConfig;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sp<SurfaceComposerClient> mSurfaceComposerClient;
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    GLuint* mShaderPrograms;
8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const ShaderDesc* mShaderDescs;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t mNumShaders;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    GLuint mDitherTexture;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace android
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch