summaryrefslogtreecommitdiff
path: root/tools/emulator/opengl/shared/OpenglCodecCommon/GLSharedGroup.cpp
diff options
context:
space:
mode:
authorLiran <liran@graphtech.co.il>2011-08-01 10:01:54 +0300
committerDavid 'Digit' Turner <digit@android.com>2011-08-10 10:08:05 +0200
commit8ee217f9cc21e26f3dd5b52be038475a3818298f (patch)
tree3c0c28b7a9bf1239f05a74880eff8f74cf5e822a /tools/emulator/opengl/shared/OpenglCodecCommon/GLSharedGroup.cpp
parentd2fae7055e060af39b438f0dd921ea9473f08669 (diff)
opengles emulator: fix glGetUnifrom
added state tracking for uniforms in program objects for each active uniform in index i we will save its starting location ,size and type, so when calling glGetUniform on its location, we can tell how many bytes we should read from the stream according to the uniform's type add some type and size definitions to functions that calculate size from enum some other fixes to the codec Change-Id: I4ecdf41e752454a908d131e76bab113a616f2bc8
Diffstat (limited to 'tools/emulator/opengl/shared/OpenglCodecCommon/GLSharedGroup.cpp')
-rw-r--r--tools/emulator/opengl/shared/OpenglCodecCommon/GLSharedGroup.cpp169
1 files changed, 168 insertions, 1 deletions
diff --git a/tools/emulator/opengl/shared/OpenglCodecCommon/GLSharedGroup.cpp b/tools/emulator/opengl/shared/OpenglCodecCommon/GLSharedGroup.cpp
index 84a73ef34..768e3c9ab 100644
--- a/tools/emulator/opengl/shared/OpenglCodecCommon/GLSharedGroup.cpp
+++ b/tools/emulator/opengl/shared/OpenglCodecCommon/GLSharedGroup.cpp
@@ -10,16 +10,75 @@ BufferData::BufferData(GLsizeiptr size, void * data) : m_size(size)
if (data) memcpy(buffer, data, size);
}
+/**** ProgramData ****/
+ProgramData::ProgramData() : m_numIndexes(0), m_initialized(false)
+{
+ m_Indexes = NULL;
+}
+
+void ProgramData::initProgramData(GLuint numIndexes)
+{
+ m_initialized = true;
+ m_numIndexes = numIndexes;
+ delete[] m_Indexes;
+ m_Indexes = new IndexInfo[numIndexes];
+}
+
+bool ProgramData::isInitialized()
+{
+ return m_initialized;
+}
+
+ProgramData::~ProgramData()
+{
+ delete[] m_Indexes;
+ m_Indexes = NULL;
+}
+
+void ProgramData::setIndexInfo(GLuint index, GLint base, GLint size, GLenum type)
+{
+ if (index>=m_numIndexes)
+ return;
+ m_Indexes[index].base = base;
+ m_Indexes[index].size = size;
+ m_Indexes[index].type = type;
+}
+
+GLuint ProgramData::getIndexForLocation(GLint location)
+{
+ GLuint i=0;
+ for (i=0;i<m_numIndexes;++i)
+ {
+ GLint low = m_Indexes[i].base;;
+ GLint high = low + m_Indexes[i].size;
+ if (location >= low && location < high)
+ break;
+ }
+ return i;
+}
+
+GLenum ProgramData::getTypeForLocation(GLint location)
+{
+ GLuint index = getIndexForLocation(location);
+ if (index<m_numIndexes) {
+ return m_Indexes[index].type;
+ }
+ return 0;
+}
+
/***** GLSharedGroup ****/
GLSharedGroup::GLSharedGroup() :
- m_buffers(android::DefaultKeyedVector<GLuint, BufferData*>(NULL))
+ m_buffers(android::DefaultKeyedVector<GLuint, BufferData*>(NULL)),
+ m_programs(android::DefaultKeyedVector<GLuint, ProgramData*>(NULL)),
+ m_shaders(android::List<GLuint>())
{
}
GLSharedGroup::~GLSharedGroup()
{
m_buffers.clear();
+ m_programs.clear();
}
BufferData * GLSharedGroup::getBufferData(GLuint bufferId)
@@ -56,3 +115,111 @@ void GLSharedGroup::deleteBufferData(GLuint bufferId)
android::AutoMutex _lock(m_lock);
m_buffers.removeItem(bufferId);
}
+
+void GLSharedGroup::addProgramData(GLuint program)
+{
+ android::AutoMutex _lock(m_lock);
+ ProgramData *pData = m_programs.valueFor(program);
+ if (pData)
+ {
+ m_programs.removeItem(program);
+ delete pData;
+ }
+
+ m_programs.add(program,new ProgramData());
+}
+
+void GLSharedGroup::initProgramData(GLuint program, GLuint numIndexes)
+{
+ android::AutoMutex _lock(m_lock);
+ ProgramData *pData = m_programs.valueFor(program);
+ if (pData)
+ {
+ pData->initProgramData(numIndexes);
+ }
+}
+
+bool GLSharedGroup::isProgramInitialized(GLuint program)
+{
+ android::AutoMutex _lock(m_lock);
+ ProgramData* pData = m_programs.valueFor(program);
+ if (pData)
+ {
+ return pData->isInitialized();
+ }
+ return false;
+}
+
+void GLSharedGroup::deleteProgramData(GLuint program)
+{
+ android::AutoMutex _lock(m_lock);
+ ProgramData *pData = m_programs.valueFor(program);
+ if (pData)
+ delete pData;
+ m_programs.removeItem(program);
+}
+
+void GLSharedGroup::setProgramIndexInfo(GLuint program, GLuint index, GLint base, GLint size, GLenum type)
+{
+ android::AutoMutex _lock(m_lock);
+ ProgramData* pData = m_programs.valueFor(program);
+ if (pData)
+ {
+ pData->setIndexInfo(index,base,size,type);
+ }
+}
+
+GLenum GLSharedGroup::getProgramUniformType(GLuint program, GLint location)
+{
+ android::AutoMutex _lock(m_lock);
+ ProgramData* pData = m_programs.valueFor(program);
+ GLenum type=0;
+ if (pData)
+ {
+ type = pData->getTypeForLocation(location);
+ }
+ return type;
+}
+
+bool GLSharedGroup::isProgram(GLuint program)
+{
+ android::AutoMutex _lock(m_lock);
+ ProgramData* pData = m_programs.valueFor(program);
+ return (pData!=NULL);
+}
+
+
+void GLSharedGroup::addShaderData(GLuint shader)
+{
+ android::AutoMutex _lock(m_lock);
+ m_shaders.push_front(shader);
+
+}
+bool GLSharedGroup::isShader(GLuint shader)
+{
+ android::AutoMutex _lock(m_lock);
+ android::List<GLuint>::iterator iter;
+ iter = m_shaders.begin();
+ while (iter!=m_shaders.end())
+ {
+ if (*iter==shader)
+ return true;
+ iter++;
+ }
+ return false;
+}
+void GLSharedGroup::deleteShaderData(GLuint shader)
+{
+ android::AutoMutex _lock(m_lock);
+ android::List<GLuint>::iterator iter;
+ iter = m_shaders.begin();
+ while (iter!=m_shaders.end())
+ {
+ if (*iter==shader)
+ {
+ m_shaders.erase(iter);
+ return;
+ }
+ iter++;
+ }
+}