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