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
This commit is contained in:
committed by
David 'Digit' Turner
parent
d2fae7055e
commit
8ee217f9cc
@@ -167,6 +167,7 @@ public:
|
|||||||
handled = false;
|
handled = false;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
handled = false;
|
||||||
ERR("unknown vertex-attrib parameter param %d\n", param);
|
ERR("unknown vertex-attrib parameter param %d\n", param);
|
||||||
}
|
}
|
||||||
return handled;
|
return handled;
|
||||||
|
|||||||
@@ -10,16 +10,75 @@ BufferData::BufferData(GLsizeiptr size, void * data) : m_size(size)
|
|||||||
if (data) memcpy(buffer, data, 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::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()
|
GLSharedGroup::~GLSharedGroup()
|
||||||
{
|
{
|
||||||
m_buffers.clear();
|
m_buffers.clear();
|
||||||
|
m_programs.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferData * GLSharedGroup::getBufferData(GLuint bufferId)
|
BufferData * GLSharedGroup::getBufferData(GLuint bufferId)
|
||||||
@@ -56,3 +115,111 @@ void GLSharedGroup::deleteBufferData(GLuint bufferId)
|
|||||||
android::AutoMutex _lock(m_lock);
|
android::AutoMutex _lock(m_lock);
|
||||||
m_buffers.removeItem(bufferId);
|
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++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
#include "ErrorLog.h"
|
#include "ErrorLog.h"
|
||||||
#include <utils/KeyedVector.h>
|
#include <utils/KeyedVector.h>
|
||||||
#include <utils/threads.h>
|
#include <utils/threads.h>
|
||||||
|
#include <utils/List.h>
|
||||||
#include "FixedBuffer.h"
|
#include "FixedBuffer.h"
|
||||||
#include "SmartPtr.h"
|
#include "SmartPtr.h"
|
||||||
|
|
||||||
@@ -42,10 +43,32 @@ struct BufferData {
|
|||||||
FixedBuffer m_fixedBuffer;
|
FixedBuffer m_fixedBuffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ProgramData {
|
||||||
|
private:
|
||||||
|
typedef struct _IndexInfo {
|
||||||
|
GLint base;
|
||||||
|
GLint size;
|
||||||
|
GLenum type;
|
||||||
|
}IndexInfo;
|
||||||
|
|
||||||
|
GLuint m_numIndexes;
|
||||||
|
IndexInfo* m_Indexes;
|
||||||
|
bool m_initialized;
|
||||||
|
public:
|
||||||
|
ProgramData();
|
||||||
|
void initProgramData(GLuint numIndexes);
|
||||||
|
bool isInitialized();
|
||||||
|
virtual ~ProgramData();
|
||||||
|
void setIndexInfo(GLuint index, GLint base, GLint size, GLenum type);
|
||||||
|
GLuint getIndexForLocation(GLint location);
|
||||||
|
GLenum getTypeForLocation(GLint location);
|
||||||
|
};
|
||||||
|
|
||||||
class GLSharedGroup {
|
class GLSharedGroup {
|
||||||
private:
|
private:
|
||||||
android::DefaultKeyedVector<GLuint, BufferData*> m_buffers;
|
android::DefaultKeyedVector<GLuint, BufferData*> m_buffers;
|
||||||
|
android::DefaultKeyedVector<GLuint, ProgramData*> m_programs;
|
||||||
|
android::List<GLuint> m_shaders;
|
||||||
mutable android::Mutex m_lock;
|
mutable android::Mutex m_lock;
|
||||||
public:
|
public:
|
||||||
GLSharedGroup();
|
GLSharedGroup();
|
||||||
@@ -55,6 +78,19 @@ public:
|
|||||||
void updateBufferData(GLuint bufferId, GLsizeiptr size, void * data);
|
void updateBufferData(GLuint bufferId, GLsizeiptr size, void * data);
|
||||||
GLenum subUpdateBufferData(GLuint bufferId, GLintptr offset, GLsizeiptr size, void * data);
|
GLenum subUpdateBufferData(GLuint bufferId, GLintptr offset, GLsizeiptr size, void * data);
|
||||||
void deleteBufferData(GLuint);
|
void deleteBufferData(GLuint);
|
||||||
|
|
||||||
|
bool isProgram(GLuint program);
|
||||||
|
bool isProgramInitialized(GLuint program);
|
||||||
|
void addProgramData(GLuint program);
|
||||||
|
void initProgramData(GLuint program, GLuint numIndexes);
|
||||||
|
void deleteProgramData(GLuint program);
|
||||||
|
void setProgramIndexInfo(GLuint program, GLuint index, GLint base, GLint size, GLenum type);
|
||||||
|
GLenum getProgramUniformType(GLuint program, GLint location);
|
||||||
|
|
||||||
|
void addShaderData(GLuint shader);
|
||||||
|
bool isShader(GLuint shader);
|
||||||
|
void deleteShaderData(GLuint shader);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef SmartPtr<GLSharedGroup> GLSharedGroupPtr;
|
typedef SmartPtr<GLSharedGroup> GLSharedGroupPtr;
|
||||||
|
|||||||
@@ -30,8 +30,10 @@ size_t glSizeof(GLenum type)
|
|||||||
case GL_HALF_FLOAT_OES:
|
case GL_HALF_FLOAT_OES:
|
||||||
retval = 2;
|
retval = 2;
|
||||||
break;
|
break;
|
||||||
|
case GL_INT:
|
||||||
case GL_FLOAT:
|
case GL_FLOAT:
|
||||||
case GL_FIXED:
|
case GL_FIXED:
|
||||||
|
case GL_BOOL:
|
||||||
retval = 4;
|
retval = 4;
|
||||||
break;
|
break;
|
||||||
#ifdef GL_DOUBLE
|
#ifdef GL_DOUBLE
|
||||||
@@ -39,6 +41,32 @@ size_t glSizeof(GLenum type)
|
|||||||
retval = 8;
|
retval = 8;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
case GL_FLOAT_VEC2:
|
||||||
|
case GL_INT_VEC2:
|
||||||
|
case GL_BOOL_VEC2:
|
||||||
|
retval = 8;
|
||||||
|
break;
|
||||||
|
case GL_INT_VEC3:
|
||||||
|
case GL_BOOL_VEC3:
|
||||||
|
case GL_FLOAT_VEC3:
|
||||||
|
retval = 12;
|
||||||
|
break;
|
||||||
|
case GL_FLOAT_VEC4:
|
||||||
|
case GL_BOOL_VEC4:
|
||||||
|
case GL_INT_VEC4:
|
||||||
|
case GL_FLOAT_MAT2:
|
||||||
|
retval = 16;
|
||||||
|
break;
|
||||||
|
case GL_FLOAT_MAT3:
|
||||||
|
retval = 36;
|
||||||
|
break;
|
||||||
|
case GL_FLOAT_MAT4:
|
||||||
|
retval = 64;
|
||||||
|
break;
|
||||||
|
case GL_SAMPLER_2D:
|
||||||
|
case GL_SAMPLER_CUBE:
|
||||||
|
retval = 4;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ERR("**** ERROR unknown type 0x%x (%s,%d)\n", type, __FUNCTION__,__LINE__);
|
ERR("**** ERROR unknown type 0x%x (%s,%d)\n", type, __FUNCTION__,__LINE__);
|
||||||
}
|
}
|
||||||
@@ -250,6 +278,7 @@ size_t glUtilsParamSize(GLenum param)
|
|||||||
case GL_MAX_TEXTURE_IMAGE_UNITS:
|
case GL_MAX_TEXTURE_IMAGE_UNITS:
|
||||||
case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
|
case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
|
||||||
case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
|
case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
|
||||||
|
case GL_LINE_WIDTH:
|
||||||
s = 1;
|
s = 1;
|
||||||
break;
|
break;
|
||||||
case GL_ALIASED_LINE_WIDTH_RANGE:
|
case GL_ALIASED_LINE_WIDTH_RANGE:
|
||||||
@@ -282,6 +311,7 @@ size_t glUtilsParamSize(GLenum param)
|
|||||||
case GL_COLOR_CLEAR_VALUE:
|
case GL_COLOR_CLEAR_VALUE:
|
||||||
case GL_COLOR_WRITEMASK:
|
case GL_COLOR_WRITEMASK:
|
||||||
case GL_AMBIENT_AND_DIFFUSE:
|
case GL_AMBIENT_AND_DIFFUSE:
|
||||||
|
case GL_BLEND_COLOR:
|
||||||
s = 4;
|
s = 4;
|
||||||
break;
|
break;
|
||||||
case GL_MODELVIEW_MATRIX:
|
case GL_MODELVIEW_MATRIX:
|
||||||
@@ -320,9 +350,12 @@ int glUtilsPixelBitSize(GLenum format, GLenum type)
|
|||||||
int componentsize = 0;
|
int componentsize = 0;
|
||||||
int pixelsize = 0;
|
int pixelsize = 0;
|
||||||
switch(type) {
|
switch(type) {
|
||||||
|
case GL_BYTE:
|
||||||
case GL_UNSIGNED_BYTE:
|
case GL_UNSIGNED_BYTE:
|
||||||
componentsize = 8;
|
componentsize = 8;
|
||||||
break;
|
break;
|
||||||
|
case GL_SHORT:
|
||||||
|
case GL_UNSIGNED_SHORT:
|
||||||
case GL_UNSIGNED_SHORT_5_6_5:
|
case GL_UNSIGNED_SHORT_5_6_5:
|
||||||
case GL_UNSIGNED_SHORT_4_4_4_4:
|
case GL_UNSIGNED_SHORT_4_4_4_4:
|
||||||
case GL_UNSIGNED_SHORT_5_5_5_1:
|
case GL_UNSIGNED_SHORT_5_5_5_1:
|
||||||
@@ -331,6 +364,13 @@ int glUtilsPixelBitSize(GLenum format, GLenum type)
|
|||||||
case GL_RGBA4_OES:
|
case GL_RGBA4_OES:
|
||||||
pixelsize = 16;
|
pixelsize = 16;
|
||||||
break;
|
break;
|
||||||
|
case GL_INT:
|
||||||
|
case GL_UNSIGNED_INT:
|
||||||
|
case GL_FLOAT:
|
||||||
|
case GL_FIXED:
|
||||||
|
case GL_UNSIGNED_INT_24_8_OES:
|
||||||
|
pixelsize = 32;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ERR("glUtilsPixelBitSize: unknown pixel type - assuming pixel data 0\n");
|
ERR("glUtilsPixelBitSize: unknown pixel type - assuming pixel data 0\n");
|
||||||
componentsize = 0;
|
componentsize = 0;
|
||||||
@@ -345,6 +385,8 @@ int glUtilsPixelBitSize(GLenum format, GLenum type)
|
|||||||
#endif
|
#endif
|
||||||
case GL_ALPHA:
|
case GL_ALPHA:
|
||||||
case GL_LUMINANCE:
|
case GL_LUMINANCE:
|
||||||
|
case GL_DEPTH_COMPONENT:
|
||||||
|
case GL_DEPTH_STENCIL_OES:
|
||||||
components = 1;
|
components = 1;
|
||||||
break;
|
break;
|
||||||
case GL_LUMINANCE_ALPHA:
|
case GL_LUMINANCE_ALPHA:
|
||||||
|
|||||||
@@ -47,6 +47,13 @@ GL2Encoder::GL2Encoder(IOStream *stream) : gl2_encoder_context_t(stream)
|
|||||||
set_glShaderSource(s_glShaderSource);
|
set_glShaderSource(s_glShaderSource);
|
||||||
set_glFinish(s_glFinish);
|
set_glFinish(s_glFinish);
|
||||||
m_glGetError_enc = set_glGetError(s_glGetError);
|
m_glGetError_enc = set_glGetError(s_glGetError);
|
||||||
|
m_glLinkProgram_enc = set_glLinkProgram(s_glLinkProgram);
|
||||||
|
m_glDeleteProgram_enc = set_glDeleteProgram(s_glDeleteProgram);
|
||||||
|
m_glGetUniformiv_enc = set_glGetUniformiv(s_glGetUniformiv);
|
||||||
|
m_glGetUniformfv_enc = set_glGetUniformfv(s_glGetUniformfv);
|
||||||
|
m_glCreateProgram_enc = set_glCreateProgram(s_glCreateProgram);
|
||||||
|
m_glCreateShader_enc = set_glCreateShader(s_glCreateShader);
|
||||||
|
m_glDeleteShader_enc = set_glDeleteShader(s_glDeleteShader);
|
||||||
}
|
}
|
||||||
|
|
||||||
GL2Encoder::~GL2Encoder()
|
GL2Encoder::~GL2Encoder()
|
||||||
@@ -416,3 +423,86 @@ void GL2Encoder::s_glFinish(void *self)
|
|||||||
ctx->glFinishRoundTrip(self);
|
ctx->glFinishRoundTrip(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GL2Encoder::s_glLinkProgram(void * self, GLuint program)
|
||||||
|
{
|
||||||
|
GL2Encoder *ctx = (GL2Encoder *)self;
|
||||||
|
ctx->m_glLinkProgram_enc(self, program);
|
||||||
|
|
||||||
|
GLint linkStatus = 0;
|
||||||
|
ctx->glGetProgramiv(self,program,GL_LINK_STATUS,&linkStatus);
|
||||||
|
if (!linkStatus)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//get number of active uniforms in the program
|
||||||
|
GLint numUniforms=0;
|
||||||
|
ctx->glGetProgramiv(self, program, GL_ACTIVE_UNIFORMS, &numUniforms);
|
||||||
|
ctx->m_shared->initProgramData(program,numUniforms);
|
||||||
|
|
||||||
|
//get the length of the longest uniform name
|
||||||
|
GLint maxLength=0;
|
||||||
|
ctx->glGetProgramiv(self, program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxLength);
|
||||||
|
|
||||||
|
GLint size;
|
||||||
|
GLenum type;
|
||||||
|
GLchar *name = new GLchar[maxLength+1];
|
||||||
|
GLint location;
|
||||||
|
//for each active uniform, get its size and starting location.
|
||||||
|
for (GLint i=0 ; i<numUniforms ; ++i)
|
||||||
|
{
|
||||||
|
ctx->glGetActiveUniform(self, program, i, maxLength, NULL, &size, &type, name);
|
||||||
|
location = ctx->glGetUniformLocation(self, program, name);
|
||||||
|
ctx->m_shared->setProgramIndexInfo(program, i, location, size, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete[] name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GL2Encoder::s_glDeleteProgram(void *self, GLuint program)
|
||||||
|
{
|
||||||
|
GL2Encoder *ctx = (GL2Encoder*)self;
|
||||||
|
ctx->m_glDeleteProgram_enc(self, program);
|
||||||
|
|
||||||
|
ctx->m_shared->deleteProgramData(program);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GL2Encoder::s_glGetUniformiv(void *self, GLuint program, GLint location, GLint* params)
|
||||||
|
{
|
||||||
|
GL2Encoder *ctx = (GL2Encoder*)self;
|
||||||
|
SET_ERROR_IF(!(ctx->m_shared->isProgram(program) || ctx->m_shared->isShader(program)), GL_INVALID_VALUE);
|
||||||
|
SET_ERROR_IF(!ctx->m_shared->isProgramInitialized(program), GL_INVALID_OPERATION);
|
||||||
|
SET_ERROR_IF(ctx->m_shared->getProgramUniformType(program,location)==0, GL_INVALID_OPERATION);
|
||||||
|
ctx->m_glGetUniformiv_enc(self, program, location, params);
|
||||||
|
}
|
||||||
|
void GL2Encoder::s_glGetUniformfv(void *self, GLuint program, GLint location, GLfloat* params)
|
||||||
|
{
|
||||||
|
GL2Encoder *ctx = (GL2Encoder*)self;
|
||||||
|
SET_ERROR_IF(!(ctx->m_shared->isProgram(program) || ctx->m_shared->isShader(program)), GL_INVALID_VALUE);
|
||||||
|
SET_ERROR_IF(!ctx->m_shared->isProgramInitialized(program), GL_INVALID_OPERATION);
|
||||||
|
SET_ERROR_IF(ctx->m_shared->getProgramUniformType(program,location)==0, GL_INVALID_OPERATION);
|
||||||
|
ctx->m_glGetUniformfv_enc(self, program, location, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint GL2Encoder::s_glCreateProgram(void * self)
|
||||||
|
{
|
||||||
|
GL2Encoder *ctx = (GL2Encoder*)self;
|
||||||
|
GLuint program = ctx->m_glCreateProgram_enc(self);
|
||||||
|
if (program!=0)
|
||||||
|
ctx->m_shared->addProgramData(program);
|
||||||
|
return program;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint GL2Encoder::s_glCreateShader(void *self, GLenum shaderType)
|
||||||
|
{
|
||||||
|
GL2Encoder *ctx = (GL2Encoder*)self;
|
||||||
|
GLuint shader = ctx->m_glCreateShader_enc(self, shaderType);
|
||||||
|
if (shader!=0)
|
||||||
|
ctx->m_shared->addShaderData(shader);
|
||||||
|
return shader;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GL2Encoder::s_glDeleteShader(void *self, GLenum shader)
|
||||||
|
{
|
||||||
|
GL2Encoder *ctx = (GL2Encoder*)self;
|
||||||
|
ctx->m_glDeleteShader_enc(self,shader);
|
||||||
|
ctx->m_shared->deleteShaderData(shader);
|
||||||
|
}
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ public:
|
|||||||
}
|
}
|
||||||
void setSharedGroup(GLSharedGroupPtr shared){ m_shared = shared; }
|
void setSharedGroup(GLSharedGroupPtr shared){ m_shared = shared; }
|
||||||
const GLClientState *state() { return m_state; }
|
const GLClientState *state() { return m_state; }
|
||||||
|
const GLSharedGroupPtr shared() { return m_shared; }
|
||||||
void flush() {
|
void flush() {
|
||||||
gl2_encoder_context_t::m_stream->flush();
|
gl2_encoder_context_t::m_stream->flush();
|
||||||
}
|
}
|
||||||
@@ -118,5 +119,27 @@ private:
|
|||||||
static void s_glShaderSource(void *self, GLuint shader, GLsizei count, const GLchar **string, const GLint *length);
|
static void s_glShaderSource(void *self, GLuint shader, GLsizei count, const GLchar **string, const GLint *length);
|
||||||
|
|
||||||
static void s_glFinish(void *self);
|
static void s_glFinish(void *self);
|
||||||
|
|
||||||
|
glLinkProgram_client_proc_t m_glLinkProgram_enc;
|
||||||
|
static void s_glLinkProgram(void *self, GLuint program);
|
||||||
|
|
||||||
|
glDeleteProgram_client_proc_t m_glDeleteProgram_enc;
|
||||||
|
static void s_glDeleteProgram(void * self, GLuint program);
|
||||||
|
|
||||||
|
glGetUniformiv_client_proc_t m_glGetUniformiv_enc;
|
||||||
|
static void s_glGetUniformiv(void *self, GLuint program, GLint location , GLint *params);
|
||||||
|
|
||||||
|
glGetUniformfv_client_proc_t m_glGetUniformfv_enc;
|
||||||
|
static void s_glGetUniformfv(void *self, GLuint program, GLint location , GLfloat *params);
|
||||||
|
|
||||||
|
glCreateProgram_client_proc_t m_glCreateProgram_enc;
|
||||||
|
static GLuint s_glCreateProgram(void *self);
|
||||||
|
|
||||||
|
glCreateShader_client_proc_t m_glCreateShader_enc;
|
||||||
|
static GLuint s_glCreateShader(void *self, GLenum shaderType);
|
||||||
|
|
||||||
|
glDeleteShader_client_proc_t m_glDeleteShader_enc;
|
||||||
|
static void s_glDeleteShader(void *self, GLuint shader);
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -30,3 +30,10 @@ size_t pixelDataSize3D(void *self, GLsizei width, GLsizei height, GLsizei depth,
|
|||||||
size_t layerSize = pixelDataSize(self, width, height, format, type, pack);
|
size_t layerSize = pixelDataSize(self, width, height, format, type, pack);
|
||||||
return layerSize * depth;
|
return layerSize * depth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLenum uniformType(void * self, GLuint program, GLint location)
|
||||||
|
{
|
||||||
|
GL2Encoder * ctx = (GL2Encoder *) self;
|
||||||
|
assert (ctx->shared() != NULL);
|
||||||
|
return ctx->shared()->getProgramUniformType(program, location);
|
||||||
|
}
|
||||||
|
|||||||
@@ -19,5 +19,6 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
size_t pixelDataSize(void *self, GLsizei width, GLsizei height, GLenum format, GLenum type, int pack);
|
size_t pixelDataSize(void *self, GLsizei width, GLsizei height, GLenum format, GLenum type, int pack);
|
||||||
size_t pixelDataSize3D(void *self, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, int pack);
|
size_t pixelDataSize3D(void *self, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, int pack);
|
||||||
|
GLenum uniformType(void * self, GLuint program, GLint location);
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -76,8 +76,10 @@ glGenTextures
|
|||||||
glGetActiveAttrib
|
glGetActiveAttrib
|
||||||
len name bufsize
|
len name bufsize
|
||||||
dir name out
|
dir name out
|
||||||
|
var_flag name nullAllowed
|
||||||
dir length out
|
dir length out
|
||||||
len length (sizeof(GLsizei))
|
len length (sizeof(GLsizei))
|
||||||
|
var_flag length nullAllowed
|
||||||
dir size out
|
dir size out
|
||||||
len size (sizeof(GLint))
|
len size (sizeof(GLint))
|
||||||
dir type out
|
dir type out
|
||||||
@@ -87,8 +89,10 @@ glGetActiveAttrib
|
|||||||
glGetActiveUniform
|
glGetActiveUniform
|
||||||
len name bufsize
|
len name bufsize
|
||||||
dir name out
|
dir name out
|
||||||
|
var_flag name nullAllowed
|
||||||
dir length out
|
dir length out
|
||||||
len length (sizeof(GLsizei))
|
len length (sizeof(GLsizei))
|
||||||
|
var_flag length nullAllowed
|
||||||
dir size out
|
dir size out
|
||||||
len size (sizeof(GLint))
|
len size (sizeof(GLint))
|
||||||
dir type out
|
dir type out
|
||||||
@@ -168,7 +172,9 @@ glGetShaderInfoLog
|
|||||||
|
|
||||||
#void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
|
#void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
|
||||||
glGetShaderPrecisionFormat
|
glGetShaderPrecisionFormat
|
||||||
len range (sizeof(GLint))
|
dir range out
|
||||||
|
len range (2 * sizeof(GLint))
|
||||||
|
dir precision out
|
||||||
len precision (sizeof(GLint))
|
len precision (sizeof(GLint))
|
||||||
|
|
||||||
#void glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
|
#void glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
|
||||||
@@ -195,11 +201,13 @@ glGetTexParameteriv
|
|||||||
|
|
||||||
#void glGetUniformfv(GLuint program, GLint location, GLfloat *params)
|
#void glGetUniformfv(GLuint program, GLint location, GLfloat *params)
|
||||||
glGetUniformfv
|
glGetUniformfv
|
||||||
flag unsupported
|
dir params out
|
||||||
|
len params glSizeof(uniformType(self, program, location))
|
||||||
|
|
||||||
#void glGetUniformiv(GLuint program, GLint location, GLint *params)
|
#void glGetUniformiv(GLuint program, GLint location, GLint *params)
|
||||||
glGetUniformiv
|
glGetUniformiv
|
||||||
flag unsupported
|
dir params out
|
||||||
|
len params glSizeof(uniformType(self, program, location))
|
||||||
|
|
||||||
#int glGetUniformLocation(GLuint program, GLchar *name)
|
#int glGetUniformLocation(GLuint program, GLchar *name)
|
||||||
glGetUniformLocation
|
glGetUniformLocation
|
||||||
@@ -210,11 +218,13 @@ glGetUniformLocation
|
|||||||
# thus we still need to implement it.
|
# thus we still need to implement it.
|
||||||
#void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
|
#void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
|
||||||
glGetVertexAttribfv
|
glGetVertexAttribfv
|
||||||
|
dir params out
|
||||||
len params (glUtilsParamSize(pname) * sizeof(GLfloat))
|
len params (glUtilsParamSize(pname) * sizeof(GLfloat))
|
||||||
|
|
||||||
#see glGetVertexAttribfv for comments
|
#see glGetVertexAttribfv for comments
|
||||||
#void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
|
#void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
|
||||||
glGetVertexAttribiv
|
glGetVertexAttribiv
|
||||||
|
dir params out
|
||||||
len params (glUtilsParamSize(pname) * sizeof(GLint))
|
len params (glUtilsParamSize(pname) * sizeof(GLint))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user