156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall/*
256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* Copyright (C) 2011 The Android Open Source Project
356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall*
456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* Licensed under the Apache License, Version 2.0 (the "License");
556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* you may not use this file except in compliance with the License.
656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* You may obtain a copy of the License at
756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall*
856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* http://www.apache.org/licenses/LICENSE-2.0
956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall*
1056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* Unless required by applicable law or agreed to in writing, software
1156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* distributed under the License is distributed on an "AS IS" BASIS,
1256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* See the License for the specific language governing permissions and
1456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* limitations under the License.
1556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall*/
1656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#ifndef _GL_SHARED_GROUP_H_
1756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define _GL_SHARED_GROUP_H_
1856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
1956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define GL_API
2056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#ifndef ANDROID
2156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define GL_APIENTRY
2256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define GL_APIENTRYP
2356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#endif
2456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
2556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <GLES/gl.h>
2656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <GLES/glext.h>
2756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <GLES2/gl2.h>
2856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <GLES2/gl2ext.h>
2956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
3056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <stdio.h>
3156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <stdlib.h>
3256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "ErrorLog.h"
3356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <utils/KeyedVector.h>
3456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <utils/List.h>
3556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <utils/String8.h>
3656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <utils/threads.h>
3756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "FixedBuffer.h"
3856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "SmartPtr.h"
3956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
4056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstruct BufferData {
4156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    BufferData();
4256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    BufferData(GLsizeiptr size, void * data);
4356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLsizeiptr  m_size;
4456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    FixedBuffer m_fixedBuffer;
4556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall};
4656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
4756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallclass ProgramData {
4856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallprivate:
4956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    typedef struct _IndexInfo {
5056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLint base;
5156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLint size;
5256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLenum type;
5356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLint appBase;
5456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLint hostLocsPerElement;
5556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLuint flags;
5656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLint samplerValue; // only set for sampler uniforms
5756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    } IndexInfo;
5856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
5956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLuint m_numIndexes;
6056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    IndexInfo* m_Indexes;
6156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    bool m_initialized;
6256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    bool m_locShiftWAR;
6356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
6456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    android::Vector<GLuint> m_shaders;
6556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
6656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallpublic:
6756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    enum {
6856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        INDEX_FLAG_SAMPLER_EXTERNAL = 0x00000001,
6956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    };
7056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
7156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ProgramData();
7256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    void initProgramData(GLuint numIndexes);
7356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    bool isInitialized();
7456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    virtual ~ProgramData();
7556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    void setIndexInfo(GLuint index, GLint base, GLint size, GLenum type);
7656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    void setIndexFlags(GLuint index, GLuint flags);
7756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLuint getIndexForLocation(GLint location);
7856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLenum getTypeForLocation(GLint location);
7956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
8056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    bool needUniformLocationWAR() const { return m_locShiftWAR; }
8156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    void setupLocationShiftWAR();
8256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLint locationWARHostToApp(GLint hostLoc, GLint arrIndex);
8356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLint locationWARAppToHost(GLint appLoc);
8456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
8556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLint getNextSamplerUniform(GLint index, GLint* val, GLenum* target);
8656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    bool setSamplerUniform(GLint appLoc, GLint val, GLenum* target);
8756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
8856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    bool attachShader(GLuint shader);
8956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    bool detachShader(GLuint shader);
9056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    size_t getNumShaders() const { return m_shaders.size(); }
9156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLuint getShader(size_t i) const { return m_shaders[i]; }
9256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall};
9356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
9456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstruct ShaderData {
9556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    typedef android::List<android::String8> StringList;
9656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    StringList samplerExternalNames;
9756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    int refcount;
9856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall};
9956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
10056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallclass GLSharedGroup {
10156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallprivate:
10256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    android::DefaultKeyedVector<GLuint, BufferData*> m_buffers;
10356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    android::DefaultKeyedVector<GLuint, ProgramData*> m_programs;
10456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    android::DefaultKeyedVector<GLuint, ShaderData*> m_shaders;
10556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    mutable android::Mutex m_lock;
10656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
10756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    void refShaderDataLocked(ssize_t shaderIdx);
10856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    void unrefShaderDataLocked(ssize_t shaderIdx);
10956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
11056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallpublic:
11156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLSharedGroup();
11256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ~GLSharedGroup();
11356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    BufferData * getBufferData(GLuint bufferId);
11456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    void    addBufferData(GLuint bufferId, GLsizeiptr size, void * data);
11556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    void    updateBufferData(GLuint bufferId, GLsizeiptr size, void * data);
11656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLenum  subUpdateBufferData(GLuint bufferId, GLintptr offset, GLsizeiptr size, void * data);
11756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    void    deleteBufferData(GLuint);
11856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
11956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    bool    isProgram(GLuint program);
12056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    bool    isProgramInitialized(GLuint program);
12156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    void    addProgramData(GLuint program);
12256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    void    initProgramData(GLuint program, GLuint numIndexes);
12356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    void    attachShader(GLuint program, GLuint shader);
12456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    void    detachShader(GLuint program, GLuint shader);
12556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    void    deleteProgramData(GLuint program);
12656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    void    setProgramIndexInfo(GLuint program, GLuint index, GLint base, GLint size, GLenum type, const char* name);
12756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLenum  getProgramUniformType(GLuint program, GLint location);
12856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    void    setupLocationShiftWAR(GLuint program);
12956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLint   locationWARHostToApp(GLuint program, GLint hostLoc, GLint arrIndex);
13056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLint   locationWARAppToHost(GLuint program, GLint appLoc);
13156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    bool    needUniformLocationWAR(GLuint program);
13256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLint   getNextSamplerUniform(GLuint program, GLint index, GLint* val, GLenum* target) const;
13356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    bool    setSamplerUniform(GLuint program, GLint appLoc, GLint val, GLenum* target);
13456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
13556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    bool    addShaderData(GLuint shader);
13656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    // caller must hold a reference to the shader as long as it holds the pointer
13756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ShaderData* getShaderData(GLuint shader);
13856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    void    unrefShaderData(GLuint shader);
13956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall};
14056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
14156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Halltypedef SmartPtr<GLSharedGroup> GLSharedGroupPtr;
14256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
14356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#endif //_GL_SHARED_GROUP_H_
144