remove duplicate shaders

This commit is contained in:
FunkyFr3sh 2023-08-29 17:35:09 +02:00
parent 3716807d3d
commit f85ffee65a
4 changed files with 44 additions and 246 deletions

View file

@ -247,12 +247,33 @@ BOOL oglu_ext_exists(char* ext, HDC hdc)
return FALSE;
}
GLuint oglu_build_program(const GLchar* vert_source, const GLchar* frag_source)
GLuint oglu_build_program(GLchar* vert_source, GLchar* frag_source, BOOL core_profile)
{
if (!glCreateShader || !glShaderSource || !glCompileShader || !glCreateProgram ||
!glAttachShader || !glLinkProgram || !glUseProgram || !glDetachShader)
!glAttachShader || !glLinkProgram || !glUseProgram || !glDetachShader ||
!vert_source || !frag_source)
return 0;
char* version_start = strstr(vert_source, "#version");
if (version_start && core_profile)
{
if (_strnicmp(version_start, "#version 130", 12) == 0 ||
_strnicmp(version_start, "#version 140", 12) == 0)
{
memcpy(version_start, "#version 150", 12);
}
}
version_start = strstr(frag_source, "#version");
if (version_start && core_profile)
{
if (_strnicmp(version_start, "#version 130", 12) == 0 ||
_strnicmp(version_start, "#version 140", 12) == 0)
{
memcpy(version_start, "#version 150", 12);
}
}
GLuint vert_shader = glCreateShader(GL_VERTEX_SHADER);
GLuint frag_shader = glCreateShader(GL_FRAGMENT_SHADER);
@ -401,7 +422,7 @@ GLuint oglu_build_program_from_file(const char* file_path, BOOL core_profile)
strcat(vert_source, version + strlen(version) + 1);
strcat(frag_source, version + strlen(version) + 1);
program = oglu_build_program(vert_source, frag_source);
program = oglu_build_program(vert_source, frag_source, core_profile);
}
else
{
@ -412,7 +433,7 @@ GLuint oglu_build_program_from_file(const char* file_path, BOOL core_profile)
strcat(vert_source, source);
strcat(frag_source, source);
program = oglu_build_program(vert_source, frag_source);
program = oglu_build_program(vert_source, frag_source, core_profile);
}
free(vert_source);

View file

@ -133,25 +133,17 @@ static void ogl_build_programs()
{
g_ogl.main_program = g_ogl.scale_program = 0;
BOOL core_profile = wglCreateContextAttribsARB != NULL;
if (g_oglu_got_version3)
{
if (g_ddraw->bpp == 8)
{
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PALETTE_FRAG_SHADER);
if (!g_ogl.main_program)
{
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_CORE, PALETTE_FRAG_SHADER_CORE);
}
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PALETTE_FRAG_SHADER, core_profile);
}
else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32)
{
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PASSTHROUGH_FRAG_SHADER);
if (!g_ogl.main_program)
{
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_CORE, PASSTHROUGH_FRAG_SHADER_CORE);
}
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PASSTHROUGH_FRAG_SHADER, core_profile);
}
BOOL bilinear = FALSE;
@ -179,7 +171,7 @@ static void ogl_build_programs()
g_ddraw->render.viewport.width != g_ddraw->width ||
g_ddraw->render.viewport.height != g_ddraw->height)
{
g_ogl.scale_program = oglu_build_program_from_file(shader_path, wglCreateContextAttribsARB != NULL);
g_ogl.scale_program = oglu_build_program_from_file(shader_path, core_profile);
if (!g_ogl.scale_program &&
(g_ddraw->render.viewport.width != g_ddraw->width ||
@ -191,18 +183,8 @@ static void ogl_build_programs()
_stricmp(g_ddraw->shader, "Nearest neighbor") == 0 ? PASSTHROUGH_FRAG_SHADER :
_stricmp(g_ddraw->shader, "Bilinear") == 0 ? PASSTHROUGH_FRAG_SHADER :
_stricmp(g_ddraw->shader, "Lanczos") == 0 ? LANCZOS2_FRAG_SHADER :
CATMULL_ROM_FRAG_SHADER);
if (!g_ogl.scale_program)
{
g_ogl.scale_program =
oglu_build_program(
PASSTHROUGH_VERT_SHADER_CORE,
_stricmp(g_ddraw->shader, "Nearest neighbor") == 0 ? PASSTHROUGH_FRAG_SHADER_CORE :
_stricmp(g_ddraw->shader, "Bilinear") == 0 ? PASSTHROUGH_FRAG_SHADER_CORE :
_stricmp(g_ddraw->shader, "Lanczos") == 0 ? LANCZOS2_FRAG_SHADER_CORE :
CATMULL_ROM_FRAG_SHADER_CORE);
}
CATMULL_ROM_FRAG_SHADER,
core_profile);
bilinear =
_stricmp(g_ddraw->shader, "Nearest neighbor") != 0 &&
@ -222,11 +204,11 @@ static void ogl_build_programs()
{
if (g_ddraw->bpp == 8)
{
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PALETTE_FRAG_SHADER_110);
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PALETTE_FRAG_SHADER_110, FALSE);
}
else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32)
{
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PASSTHROUGH_FRAG_SHADER_110);
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PASSTHROUGH_FRAG_SHADER_110, FALSE);
}
}
}