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:
@@ -346,11 +346,19 @@ GL_APICALL void GL_APIENTRY glColorMask(GLboolean red, GLboolean green, GLboole
|
|||||||
GL_APICALL void GL_APIENTRY glCompileShader(GLuint shader){
|
GL_APICALL void GL_APIENTRY glCompileShader(GLuint shader){
|
||||||
GET_CTX();
|
GET_CTX();
|
||||||
if(ctx->shareGroup().Ptr()) {
|
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);
|
SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
|
||||||
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader);
|
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader);
|
||||||
SET_ERROR_IF(objData.Ptr()->getDataType()!= SHADER_DATA,GL_INVALID_OPERATION);
|
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;
|
params[0] = GL_FALSE;
|
||||||
}
|
}
|
||||||
break;
|
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:
|
default:
|
||||||
ctx->dispatcher().glGetProgramiv(globalProgramName,pname,params);
|
ctx->dispatcher().glGetProgramiv(globalProgramName,pname,params);
|
||||||
}
|
}
|
||||||
@@ -1162,7 +1180,30 @@ GL_APICALL void GL_APIENTRY glGetProgramInfoLog(GLuint program, GLsizei bufsize
|
|||||||
if(ctx->shareGroup().Ptr()) {
|
if(ctx->shareGroup().Ptr()) {
|
||||||
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
||||||
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
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()) {
|
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);
|
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){
|
GL_APICALL void GL_APIENTRY glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog){
|
||||||
GET_CTX();
|
GET_CTX();
|
||||||
if(ctx->shareGroup().Ptr()) {
|
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);
|
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);
|
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);
|
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
||||||
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
|
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
|
||||||
SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
|
SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
|
||||||
|
ProgramData* programData = (ProgramData*)objData.Ptr();
|
||||||
ctx->dispatcher().glValidateProgram(globalProgramName);
|
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),
|
ProgramData::ProgramData() : ObjectData(PROGRAM_DATA),
|
||||||
AttachedVertexShader(0),
|
AttachedVertexShader(0),
|
||||||
AttachedFragmentShader(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() {
|
GLuint ProgramData::getAttachedVertexShader() {
|
||||||
return AttachedVertexShader;
|
return AttachedVertexShader;
|
||||||
|
|||||||
@@ -32,9 +32,13 @@ public:
|
|||||||
void setLinkStatus(GLint status);
|
void setLinkStatus(GLint status);
|
||||||
GLint getLinkStatus();
|
GLint getLinkStatus();
|
||||||
|
|
||||||
|
void setInfoLog(GLchar *log);
|
||||||
|
GLchar* getInfoLog();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GLuint AttachedVertexShader;
|
GLuint AttachedVertexShader;
|
||||||
GLuint AttachedFragmentShader;
|
GLuint AttachedFragmentShader;
|
||||||
GLint LinkStatus;
|
GLint LinkStatus;
|
||||||
|
GLchar* infoLog;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -3,11 +3,18 @@
|
|||||||
|
|
||||||
ShaderParser::ShaderParser():ObjectData(SHADER_DATA),
|
ShaderParser::ShaderParser():ObjectData(SHADER_DATA),
|
||||||
m_type(0),
|
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),
|
ShaderParser::ShaderParser(GLenum type):ObjectData(SHADER_DATA),
|
||||||
m_type(type),
|
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){
|
void ShaderParser::setSrc(const Version& ver,GLsizei count,const GLchar** strings,const GLint* length){
|
||||||
for(int i = 0;i<count;i++){
|
for(int i = 0;i<count;i++){
|
||||||
@@ -191,6 +198,18 @@ GLenum ShaderParser::getType() {
|
|||||||
return m_type;
|
return m_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ShaderParser::setInfoLog(GLchar* infoLog)
|
||||||
|
{
|
||||||
|
delete[] m_infoLog;
|
||||||
|
m_infoLog = infoLog;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLchar* ShaderParser::getInfoLog()
|
||||||
|
{
|
||||||
|
return m_infoLog;
|
||||||
|
}
|
||||||
|
|
||||||
ShaderParser::~ShaderParser(){
|
ShaderParser::~ShaderParser(){
|
||||||
clearParsedSrc();
|
clearParsedSrc();
|
||||||
|
delete[] m_infoLog;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ public:
|
|||||||
GLenum getType();
|
GLenum getType();
|
||||||
~ShaderParser();
|
~ShaderParser();
|
||||||
|
|
||||||
|
void setInfoLog(GLchar * infoLog);
|
||||||
|
GLchar* getInfoLog();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void parseOriginalSrc();
|
void parseOriginalSrc();
|
||||||
void parseGLSLversion();
|
void parseGLSLversion();
|
||||||
@@ -28,5 +31,6 @@ private:
|
|||||||
std::string m_src;
|
std::string m_src;
|
||||||
std::string m_parsedSrc;
|
std::string m_parsedSrc;
|
||||||
GLchar* m_parsedLines;
|
GLchar* m_parsedLines;
|
||||||
|
GLchar* m_infoLog;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user