Merge "opengles emulator: fix shader/program info log functions"
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user