mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-06-28 09:59:41 -06:00
do binding of VS inputs and FS outputs before linking shader programs, as per OpenGL standard.
should fix the rendering issues with strict drivers (AMD, Intel).
This commit is contained in:
@ -148,9 +148,6 @@ bool BuildRenderShader(u32 flags, const char* vs, const char* fs)
|
|||||||
|
|
||||||
GLuint prog = RenderShader[flags][2];
|
GLuint prog = RenderShader[flags][2];
|
||||||
|
|
||||||
GLint uni_id = glGetUniformBlockIndex(prog, "uConfig");
|
|
||||||
glUniformBlockBinding(prog, uni_id, 0);
|
|
||||||
|
|
||||||
glBindAttribLocation(prog, 0, "vPosition");
|
glBindAttribLocation(prog, 0, "vPosition");
|
||||||
glBindAttribLocation(prog, 1, "vColor");
|
glBindAttribLocation(prog, 1, "vColor");
|
||||||
glBindAttribLocation(prog, 2, "vTexcoord");
|
glBindAttribLocation(prog, 2, "vTexcoord");
|
||||||
@ -158,6 +155,12 @@ bool BuildRenderShader(u32 flags, const char* vs, const char* fs)
|
|||||||
glBindFragDataLocation(prog, 0, "oColor");
|
glBindFragDataLocation(prog, 0, "oColor");
|
||||||
glBindFragDataLocation(prog, 1, "oAttr");
|
glBindFragDataLocation(prog, 1, "oAttr");
|
||||||
|
|
||||||
|
if (!OpenGL_LinkShaderProgram(RenderShader[flags]))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
GLint uni_id = glGetUniformBlockIndex(prog, "uConfig");
|
||||||
|
glUniformBlockBinding(prog, uni_id, 0);
|
||||||
|
|
||||||
glUseProgram(prog);
|
glUseProgram(prog);
|
||||||
|
|
||||||
uni_id = glGetUniformLocation(prog, "TexMem");
|
uni_id = glGetUniformLocation(prog, "TexMem");
|
||||||
@ -202,6 +205,10 @@ bool Init()
|
|||||||
glBindAttribLocation(ClearShaderPlain[2], 0, "vPosition");
|
glBindAttribLocation(ClearShaderPlain[2], 0, "vPosition");
|
||||||
glBindFragDataLocation(ClearShaderPlain[2], 0, "oColor");
|
glBindFragDataLocation(ClearShaderPlain[2], 0, "oColor");
|
||||||
glBindFragDataLocation(ClearShaderPlain[2], 1, "oAttr");
|
glBindFragDataLocation(ClearShaderPlain[2], 1, "oAttr");
|
||||||
|
|
||||||
|
if (!OpenGL_LinkShaderProgram(ClearShaderPlain))
|
||||||
|
return false;
|
||||||
|
|
||||||
ClearUniformLoc[0] = glGetUniformLocation(ClearShaderPlain[2], "uColor");
|
ClearUniformLoc[0] = glGetUniformLocation(ClearShaderPlain[2], "uColor");
|
||||||
ClearUniformLoc[1] = glGetUniformLocation(ClearShaderPlain[2], "uDepth");
|
ClearUniformLoc[1] = glGetUniformLocation(ClearShaderPlain[2], "uDepth");
|
||||||
ClearUniformLoc[2] = glGetUniformLocation(ClearShaderPlain[2], "uOpaquePolyID");
|
ClearUniformLoc[2] = glGetUniformLocation(ClearShaderPlain[2], "uOpaquePolyID");
|
||||||
@ -226,12 +233,15 @@ bool Init()
|
|||||||
if (!OpenGL_BuildShaderProgram(kFinalPassVS, kFinalPassFS, FinalPassShader, "FinalPassShader"))
|
if (!OpenGL_BuildShaderProgram(kFinalPassVS, kFinalPassFS, FinalPassShader, "FinalPassShader"))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
uni_id = glGetUniformBlockIndex(FinalPassShader[2], "uConfig");
|
|
||||||
glUniformBlockBinding(FinalPassShader[2], uni_id, 0);
|
|
||||||
|
|
||||||
glBindAttribLocation(FinalPassShader[2], 0, "vPosition");
|
glBindAttribLocation(FinalPassShader[2], 0, "vPosition");
|
||||||
glBindFragDataLocation(FinalPassShader[2], 0, "oColor");
|
glBindFragDataLocation(FinalPassShader[2], 0, "oColor");
|
||||||
|
|
||||||
|
if (!OpenGL_LinkShaderProgram(FinalPassShader))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
uni_id = glGetUniformBlockIndex(FinalPassShader[2], "uConfig");
|
||||||
|
glUniformBlockBinding(FinalPassShader[2], uni_id, 0);
|
||||||
|
|
||||||
glUseProgram(FinalPassShader[2]);
|
glUseProgram(FinalPassShader[2]);
|
||||||
|
|
||||||
uni_id = glGetUniformLocation(FinalPassShader[2], "DepthBuffer");
|
uni_id = glGetUniformLocation(FinalPassShader[2], "DepthBuffer");
|
||||||
|
@ -85,6 +85,14 @@ bool OpenGL_BuildShaderProgram(const char* vs, const char* fs, GLuint* ids, cons
|
|||||||
ids[2] = glCreateProgram();
|
ids[2] = glCreateProgram();
|
||||||
glAttachShader(ids[2], ids[0]);
|
glAttachShader(ids[2], ids[0]);
|
||||||
glAttachShader(ids[2], ids[1]);
|
glAttachShader(ids[2], ids[1]);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OpenGL_LinkShaderProgram(GLuint* ids)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
|
||||||
glLinkProgram(ids[2]);
|
glLinkProgram(ids[2]);
|
||||||
|
|
||||||
glGetProgramiv(ids[2], GL_LINK_STATUS, &res);
|
glGetProgramiv(ids[2], GL_LINK_STATUS, &res);
|
||||||
@ -94,7 +102,7 @@ bool OpenGL_BuildShaderProgram(const char* vs, const char* fs, GLuint* ids, cons
|
|||||||
if (res < 1) res = 1024;
|
if (res < 1) res = 1024;
|
||||||
char* log = new char[res+1];
|
char* log = new char[res+1];
|
||||||
glGetProgramInfoLog(ids[2], res+1, NULL, log);
|
glGetProgramInfoLog(ids[2], res+1, NULL, log);
|
||||||
printf("OpenGL: failed to link program %s: %s\n", name, log);
|
printf("OpenGL: failed to link shader program: %s\n", log);
|
||||||
delete[] log;
|
delete[] log;
|
||||||
|
|
||||||
glDeleteShader(ids[0]);
|
glDeleteShader(ids[0]);
|
||||||
|
@ -131,6 +131,7 @@ DO_PROCLIST(DECLPROC_EXT);
|
|||||||
bool OpenGL_Init();
|
bool OpenGL_Init();
|
||||||
|
|
||||||
bool OpenGL_BuildShaderProgram(const char* vs, const char* fs, GLuint* ids, const char* name);
|
bool OpenGL_BuildShaderProgram(const char* vs, const char* fs, GLuint* ids, const char* name);
|
||||||
|
bool OpenGL_LinkShaderProgram(GLuint* ids);
|
||||||
void OpenGL_DeleteShaderProgram(GLuint* ids);
|
void OpenGL_DeleteShaderProgram(GLuint* ids);
|
||||||
void OpenGL_UseShaderProgram(GLuint* ids);
|
void OpenGL_UseShaderProgram(GLuint* ids);
|
||||||
|
|
||||||
|
@ -175,6 +175,13 @@ bool GLScreen_InitShader(GLuint* shader, const char* fs)
|
|||||||
if (!OpenGL_BuildShaderProgram(kScreenVS, fs, shader, "ScreenShader"))
|
if (!OpenGL_BuildShaderProgram(kScreenVS, fs, shader, "ScreenShader"))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
glBindAttribLocation(shader[2], 0, "vPosition");
|
||||||
|
glBindAttribLocation(shader[2], 1, "vTexcoord");
|
||||||
|
glBindFragDataLocation(shader[2], 0, "oColor");
|
||||||
|
|
||||||
|
if (!OpenGL_LinkShaderProgram(shader))
|
||||||
|
return false;
|
||||||
|
|
||||||
GLuint uni_id;
|
GLuint uni_id;
|
||||||
|
|
||||||
uni_id = glGetUniformBlockIndex(shader[2], "uConfig");
|
uni_id = glGetUniformBlockIndex(shader[2], "uConfig");
|
||||||
@ -186,10 +193,6 @@ bool GLScreen_InitShader(GLuint* shader, const char* fs)
|
|||||||
uni_id = glGetUniformLocation(shader[2], "_3DTex");
|
uni_id = glGetUniformLocation(shader[2], "_3DTex");
|
||||||
glUniform1i(uni_id, 1);
|
glUniform1i(uni_id, 1);
|
||||||
|
|
||||||
glBindAttribLocation(shader[2], 0, "vPosition");
|
|
||||||
glBindAttribLocation(shader[2], 1, "vTexcoord");
|
|
||||||
glBindFragDataLocation(shader[2], 0, "oColor");
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user