GLSharedGroup.cpp revision 8ee217f9cc21e26f3dd5b52be038475a3818298f
1#include "GLSharedGroup.h" 2 3/**** BufferData ****/ 4 5BufferData::BufferData() : m_size(0) {}; 6BufferData::BufferData(GLsizeiptr size, void * data) : m_size(size) 7{ 8 void * buffer = NULL; 9 if (size>0) buffer = m_fixedBuffer.alloc(size); 10 if (data) memcpy(buffer, data, size); 11} 12 13/**** ProgramData ****/ 14ProgramData::ProgramData() : m_numIndexes(0), m_initialized(false) 15{ 16 m_Indexes = NULL; 17} 18 19void ProgramData::initProgramData(GLuint numIndexes) 20{ 21 m_initialized = true; 22 m_numIndexes = numIndexes; 23 delete[] m_Indexes; 24 m_Indexes = new IndexInfo[numIndexes]; 25} 26 27bool ProgramData::isInitialized() 28{ 29 return m_initialized; 30} 31 32ProgramData::~ProgramData() 33{ 34 delete[] m_Indexes; 35 m_Indexes = NULL; 36} 37 38void ProgramData::setIndexInfo(GLuint index, GLint base, GLint size, GLenum type) 39{ 40 if (index>=m_numIndexes) 41 return; 42 m_Indexes[index].base = base; 43 m_Indexes[index].size = size; 44 m_Indexes[index].type = type; 45} 46 47GLuint ProgramData::getIndexForLocation(GLint location) 48{ 49 GLuint i=0; 50 for (i=0;i<m_numIndexes;++i) 51 { 52 GLint low = m_Indexes[i].base;; 53 GLint high = low + m_Indexes[i].size; 54 if (location >= low && location < high) 55 break; 56 } 57 return i; 58} 59 60GLenum ProgramData::getTypeForLocation(GLint location) 61{ 62 GLuint index = getIndexForLocation(location); 63 if (index<m_numIndexes) { 64 return m_Indexes[index].type; 65 } 66 return 0; 67} 68 69/***** GLSharedGroup ****/ 70 71GLSharedGroup::GLSharedGroup() : 72 m_buffers(android::DefaultKeyedVector<GLuint, BufferData*>(NULL)), 73 m_programs(android::DefaultKeyedVector<GLuint, ProgramData*>(NULL)), 74 m_shaders(android::List<GLuint>()) 75{ 76} 77 78GLSharedGroup::~GLSharedGroup() 79{ 80 m_buffers.clear(); 81 m_programs.clear(); 82} 83 84BufferData * GLSharedGroup::getBufferData(GLuint bufferId) 85{ 86 android::AutoMutex _lock(m_lock); 87 return m_buffers.valueFor(bufferId); 88} 89 90void GLSharedGroup::addBufferData(GLuint bufferId, GLsizeiptr size, void * data) 91{ 92 android::AutoMutex _lock(m_lock); 93 m_buffers.add(bufferId, new BufferData(size, data)); 94} 95 96void GLSharedGroup::updateBufferData(GLuint bufferId, GLsizeiptr size, void * data) 97{ 98 android::AutoMutex _lock(m_lock); 99 m_buffers.replaceValueFor(bufferId, new BufferData(size, data)); 100} 101 102GLenum GLSharedGroup::subUpdateBufferData(GLuint bufferId, GLintptr offset, GLsizeiptr size, void * data) 103{ 104 android::AutoMutex _lock(m_lock); 105 BufferData * buf = m_buffers.valueFor(bufferId); 106 if ((!buf) || (buf->m_size < offset+size) || (offset < 0) || (size<0)) return GL_INVALID_VALUE; 107 108 //it's safe to update now 109 memcpy((char*)buf->m_fixedBuffer.ptr() + offset, data, size); 110 return GL_NO_ERROR; 111} 112 113void GLSharedGroup::deleteBufferData(GLuint bufferId) 114{ 115 android::AutoMutex _lock(m_lock); 116 m_buffers.removeItem(bufferId); 117} 118 119void GLSharedGroup::addProgramData(GLuint program) 120{ 121 android::AutoMutex _lock(m_lock); 122 ProgramData *pData = m_programs.valueFor(program); 123 if (pData) 124 { 125 m_programs.removeItem(program); 126 delete pData; 127 } 128 129 m_programs.add(program,new ProgramData()); 130} 131 132void GLSharedGroup::initProgramData(GLuint program, GLuint numIndexes) 133{ 134 android::AutoMutex _lock(m_lock); 135 ProgramData *pData = m_programs.valueFor(program); 136 if (pData) 137 { 138 pData->initProgramData(numIndexes); 139 } 140} 141 142bool GLSharedGroup::isProgramInitialized(GLuint program) 143{ 144 android::AutoMutex _lock(m_lock); 145 ProgramData* pData = m_programs.valueFor(program); 146 if (pData) 147 { 148 return pData->isInitialized(); 149 } 150 return false; 151} 152 153void GLSharedGroup::deleteProgramData(GLuint program) 154{ 155 android::AutoMutex _lock(m_lock); 156 ProgramData *pData = m_programs.valueFor(program); 157 if (pData) 158 delete pData; 159 m_programs.removeItem(program); 160} 161 162void GLSharedGroup::setProgramIndexInfo(GLuint program, GLuint index, GLint base, GLint size, GLenum type) 163{ 164 android::AutoMutex _lock(m_lock); 165 ProgramData* pData = m_programs.valueFor(program); 166 if (pData) 167 { 168 pData->setIndexInfo(index,base,size,type); 169 } 170} 171 172GLenum GLSharedGroup::getProgramUniformType(GLuint program, GLint location) 173{ 174 android::AutoMutex _lock(m_lock); 175 ProgramData* pData = m_programs.valueFor(program); 176 GLenum type=0; 177 if (pData) 178 { 179 type = pData->getTypeForLocation(location); 180 } 181 return type; 182} 183 184bool GLSharedGroup::isProgram(GLuint program) 185{ 186 android::AutoMutex _lock(m_lock); 187 ProgramData* pData = m_programs.valueFor(program); 188 return (pData!=NULL); 189} 190 191 192void GLSharedGroup::addShaderData(GLuint shader) 193{ 194 android::AutoMutex _lock(m_lock); 195 m_shaders.push_front(shader); 196 197} 198bool GLSharedGroup::isShader(GLuint shader) 199{ 200 android::AutoMutex _lock(m_lock); 201 android::List<GLuint>::iterator iter; 202 iter = m_shaders.begin(); 203 while (iter!=m_shaders.end()) 204 { 205 if (*iter==shader) 206 return true; 207 iter++; 208 } 209 return false; 210} 211void GLSharedGroup::deleteShaderData(GLuint shader) 212{ 213 android::AutoMutex _lock(m_lock); 214 android::List<GLuint>::iterator iter; 215 iter = m_shaders.begin(); 216 while (iter!=m_shaders.end()) 217 { 218 if (*iter==shader) 219 { 220 m_shaders.erase(iter); 221 return; 222 } 223 iter++; 224 } 225} 226