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