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