Merge "opengles emulator: fix glGetUnifrom"
This commit is contained in:
@@ -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