am 584bcf8a: Merge "opengles emulator: fix shader/program info log functions"

* commit '584bcf8aea9270069fed1c4e87a48a2a9c7e4680':
  opengles emulator: fix shader/program info log functions
This commit is contained in:
David Turner
2011-08-13 16:10:48 -07:00
committed by Android Git Automerger
5 changed files with 143 additions and 9 deletions

View File

@@ -346,11 +346,19 @@ GL_APICALL void GL_APIENTRY glColorMask(GLboolean red, GLboolean green, GLboole
GL_APICALL void GL_APIENTRY glCompileShader(GLuint shader){
GET_CTX();
if(ctx->shareGroup().Ptr()) {
const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader);
SET_ERROR_IF(objData.Ptr()->getDataType()!= SHADER_DATA,GL_INVALID_OPERATION);
ctx->dispatcher().glCompileShader(globalShaderName);
ShaderParser* sp = (ShaderParser*)objData.Ptr();
ctx->dispatcher().glCompileShader(globalShaderName);
GLsizei infoLogLength=0;
GLchar* infoLog;
ctx->dispatcher().glGetShaderiv(globalShaderName,GL_INFO_LOG_LENGTH,&infoLogLength);
infoLog = new GLchar[infoLogLength+1];
ctx->dispatcher().glGetShaderInfoLog(globalShaderName,infoLogLength,NULL,infoLog);
sp->setInfoLog(infoLog);
}
}
@@ -1151,6 +1159,16 @@ GL_APICALL void GL_APIENTRY glGetProgramiv(GLuint program, GLenum pname, GLint*
params[0] = GL_FALSE;
}
break;
case GL_INFO_LOG_LENGTH:
{
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION);
SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
ProgramData* programData = (ProgramData*)objData.Ptr();
GLint logLength = strlen(programData->getInfoLog());
params[0] = (logLength>0) ? logLength+1 : 0;
}
break;
default:
ctx->dispatcher().glGetProgramiv(globalProgramName,pname,params);
}
@@ -1162,7 +1180,30 @@ GL_APICALL void GL_APIENTRY glGetProgramInfoLog(GLuint program, GLsizei bufsize
if(ctx->shareGroup().Ptr()) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
ctx->dispatcher().glGetProgramInfoLog(globalProgramName,bufsize,length,infolog);
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION);
SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
ProgramData* programData = (ProgramData*)objData.Ptr();
if (bufsize==0) {
if (length) {
*length = 0;
}
return;
}
GLsizei logLength;
logLength = strlen(programData->getInfoLog());
GLsizei returnLength=0;
if (infolog) {
returnLength = bufsize-1 < logLength ? bufsize-1 : logLength;
strncpy(infolog,programData->getInfoLog(),returnLength+1);
infolog[returnLength] = '\0';
}
if (length) {
*length = returnLength;
}
}
}
@@ -1171,16 +1212,53 @@ GL_APICALL void GL_APIENTRY glGetShaderiv(GLuint shader, GLenum pname, GLint* p
if(ctx->shareGroup().Ptr()) {
const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
ctx->dispatcher().glGetShaderiv(globalShaderName,pname,params);
switch(pname) {
case GL_INFO_LOG_LENGTH:
{
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader);
SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION);
SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION);
ShaderParser* sp = (ShaderParser*)objData.Ptr();
GLint logLength = strlen(sp->getInfoLog());
params[0] = (logLength>0) ? logLength+1 : 0;
}
break;
default:
ctx->dispatcher().glGetShaderiv(globalShaderName,pname,params);
}
}
}
GL_APICALL void GL_APIENTRY glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog){
GET_CTX();
if(ctx->shareGroup().Ptr()) {
const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
ctx->dispatcher().glGetShaderInfoLog(globalShaderName,bufsize,length,infolog);
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader);
SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION);
SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION);
ShaderParser* sp = (ShaderParser*)objData.Ptr();
if (bufsize==0) {
if (length) {
*length = 0;
}
return;
}
GLsizei logLength;
logLength = strlen(sp->getInfoLog());
GLsizei returnLength=0;
if (infolog) {
returnLength = bufsize-1 <logLength ? bufsize-1 : logLength;
strncpy(infolog,sp->getInfoLog(),returnLength+1);
infolog[returnLength] = '\0';
}
if (length) {
*length = returnLength;
}
}
}
@@ -1501,6 +1579,13 @@ GL_APICALL void GL_APIENTRY glLinkProgram(GLuint program){
}
}
programData->setLinkStatus(linkStatus);
GLsizei infoLogLength=0;
GLchar* infoLog;
ctx->dispatcher().glGetProgramiv(globalProgramName,GL_INFO_LOG_LENGTH,&infoLogLength);
infoLog = new GLchar[infoLogLength+1];
ctx->dispatcher().glGetProgramInfoLog(globalProgramName,infoLogLength,NULL,infoLog);
programData->setInfoLog(infoLog);
}
}
@@ -1834,7 +1919,15 @@ GL_APICALL void GL_APIENTRY glValidateProgram(GLuint program){
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
ProgramData* programData = (ProgramData*)objData.Ptr();
ctx->dispatcher().glValidateProgram(globalProgramName);
GLsizei infoLogLength=0;
GLchar* infoLog;
ctx->dispatcher().glGetProgramiv(globalProgramName,GL_INFO_LOG_LENGTH,&infoLogLength);
infoLog = new GLchar[infoLogLength+1];
ctx->dispatcher().glGetProgramInfoLog(globalProgramName,infoLogLength,NULL,infoLog);
programData->setInfoLog(infoLog);
}
}

View File

@@ -20,9 +20,23 @@
ProgramData::ProgramData() : ObjectData(PROGRAM_DATA),
AttachedVertexShader(0),
AttachedFragmentShader(0),
LinkStatus(GL_FALSE) {}
LinkStatus(GL_FALSE) {
infoLog = new GLchar[1];
infoLog[0] = '\0';
}
ProgramData::~ProgramData () {};
ProgramData::~ProgramData () {
delete[] infoLog;
};
void ProgramData::setInfoLog(GLchar* log) {
delete[] infoLog;
infoLog = log;
}
GLchar* ProgramData::getInfoLog() {
return infoLog;
}
GLuint ProgramData::getAttachedVertexShader() {
return AttachedVertexShader;

View File

@@ -32,9 +32,13 @@ public:
void setLinkStatus(GLint status);
GLint getLinkStatus();
void setInfoLog(GLchar *log);
GLchar* getInfoLog();
private:
GLuint AttachedVertexShader;
GLuint AttachedFragmentShader;
GLint LinkStatus;
GLchar* infoLog;
};
#endif

View File

@@ -3,11 +3,18 @@
ShaderParser::ShaderParser():ObjectData(SHADER_DATA),
m_type(0),
m_parsedLines(NULL) {};
m_parsedLines(NULL) {
m_infoLog = new GLchar[1];
m_infoLog[0] = '\0';
};
ShaderParser::ShaderParser(GLenum type):ObjectData(SHADER_DATA),
m_type(type),
m_parsedLines(NULL) {};
m_parsedLines(NULL) {
m_infoLog = new GLchar[1];
m_infoLog[0] = '\0';
};
void ShaderParser::setSrc(const Version& ver,GLsizei count,const GLchar** strings,const GLint* length){
for(int i = 0;i<count;i++){
@@ -191,6 +198,18 @@ GLenum ShaderParser::getType() {
return m_type;
}
void ShaderParser::setInfoLog(GLchar* infoLog)
{
delete[] m_infoLog;
m_infoLog = infoLog;
}
GLchar* ShaderParser::getInfoLog()
{
return m_infoLog;
}
ShaderParser::~ShaderParser(){
clearParsedSrc();
delete[] m_infoLog;
}

View File

@@ -16,6 +16,9 @@ public:
GLenum getType();
~ShaderParser();
void setInfoLog(GLchar * infoLog);
GLchar* getInfoLog();
private:
void parseOriginalSrc();
void parseGLSLversion();
@@ -28,5 +31,6 @@ private:
std::string m_src;
std::string m_parsedSrc;
GLchar* m_parsedLines;
GLchar* m_infoLog;
};
#endif