mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-07 03:13:49 +00:00
Switch from ARB GLSL extension to OGL 2.0 functions.
This commit is contained in:
parent
10123b8895
commit
2c5266eef3
380
GLSLCombiner.cpp
380
GLSLCombiner.cpp
|
@ -16,24 +16,23 @@
|
|||
#include "Shaders.h"
|
||||
#include "Noise_shader.h"
|
||||
|
||||
static GLhandleARB g_vertex_shader_object;
|
||||
static GLhandleARB g_calc_light_shader_object;
|
||||
static GLhandleARB g_calc_lod_shader_object;
|
||||
static GLhandleARB g_calc_noise_shader_object;
|
||||
static GLhandleARB g_calc_depth_shader_object;
|
||||
static GLhandleARB g_test_alpha_shader_object;
|
||||
static GLuint g_vertex_shader_object;
|
||||
static GLuint g_calc_light_shader_object;
|
||||
static GLuint g_calc_lod_shader_object;
|
||||
static GLuint g_calc_noise_shader_object;
|
||||
static GLuint g_calc_depth_shader_object;
|
||||
static GLuint g_test_alpha_shader_object;
|
||||
static GLuint g_zlut_tex = 0;
|
||||
|
||||
static GLhandleARB g_shadow_map_vertex_shader_object;
|
||||
static GLhandleARB g_shadow_map_fragment_shader_object;
|
||||
static GLhandleARB g_draw_shadow_map_program;
|
||||
static GLuint g_shadow_map_vertex_shader_object;
|
||||
static GLuint g_shadow_map_fragment_shader_object;
|
||||
static GLuint g_draw_shadow_map_program;
|
||||
GLuint g_tlut_tex = 0;
|
||||
|
||||
static const GLuint ZlutImageUnit = 0;
|
||||
static const GLuint TlutImageUnit = 1;
|
||||
static const GLuint depthImageUnit = 2;
|
||||
|
||||
|
||||
static
|
||||
void display_warning(const char *text, ...)
|
||||
{
|
||||
|
@ -51,6 +50,39 @@ void display_warning(const char *text, ...)
|
|||
}
|
||||
}
|
||||
|
||||
static const GLsizei nShaderLogSize = 1024;
|
||||
static
|
||||
bool check_shader_compile_status(GLuint obj)
|
||||
{
|
||||
GLint status;
|
||||
glGetShaderiv(obj, GL_COMPILE_STATUS, &status);
|
||||
if(status == GL_FALSE)
|
||||
{
|
||||
GLchar shader_log[nShaderLogSize];
|
||||
GLsizei nLogSize = nShaderLogSize;
|
||||
glGetShaderInfoLog(obj, nShaderLogSize, &nLogSize, shader_log);
|
||||
display_warning(shader_log);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static
|
||||
bool check_program_link_status(GLuint obj)
|
||||
{
|
||||
GLint status;
|
||||
glGetProgramiv(obj, GL_LINK_STATUS, &status);
|
||||
if(status == GL_FALSE)
|
||||
{
|
||||
GLsizei nLogSize = nShaderLogSize;
|
||||
GLchar shader_log[nShaderLogSize];
|
||||
glGetProgramInfoLog(obj, nShaderLogSize, &nLogSize, shader_log);
|
||||
display_warning(shader_log);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static
|
||||
void InitZlutTexture()
|
||||
{
|
||||
|
@ -101,42 +133,24 @@ void InitShadowMapShader()
|
|||
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
||||
glTexImage1D(GL_TEXTURE_1D, 0, GL_R16, 256, 0, GL_RED, GL_UNSIGNED_SHORT, NULL);
|
||||
|
||||
g_shadow_map_vertex_shader_object = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
|
||||
glShaderSourceARB(g_shadow_map_vertex_shader_object, 1, &shadow_map_vertex_shader, NULL);
|
||||
glCompileShaderARB(g_shadow_map_vertex_shader_object);
|
||||
g_shadow_map_vertex_shader_object = glCreateShader(GL_VERTEX_SHADER);
|
||||
glShaderSource(g_shadow_map_vertex_shader_object, 1, &shadow_map_vertex_shader, NULL);
|
||||
glCompileShader(g_shadow_map_vertex_shader_object);
|
||||
assert(check_shader_compile_status(g_shadow_map_vertex_shader_object));
|
||||
|
||||
g_shadow_map_fragment_shader_object = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
|
||||
g_shadow_map_fragment_shader_object = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
if (g_bUseFloatDepthTexture)
|
||||
glShaderSourceARB(g_shadow_map_fragment_shader_object, 1, &shadow_map_fragment_shader_float, NULL);
|
||||
glShaderSource(g_shadow_map_fragment_shader_object, 1, &shadow_map_fragment_shader_float, NULL);
|
||||
else
|
||||
glShaderSourceARB(g_shadow_map_fragment_shader_object, 1, &shadow_map_fragment_shader_int, NULL);
|
||||
glCompileShaderARB(g_shadow_map_fragment_shader_object);
|
||||
glShaderSource(g_shadow_map_fragment_shader_object, 1, &shadow_map_fragment_shader_int, NULL);
|
||||
glCompileShader(g_shadow_map_fragment_shader_object);
|
||||
assert(check_shader_compile_status(g_shadow_map_fragment_shader_object));
|
||||
|
||||
g_draw_shadow_map_program = glCreateProgramObjectARB();
|
||||
glAttachObjectARB(g_draw_shadow_map_program, g_shadow_map_vertex_shader_object);
|
||||
glAttachObjectARB(g_draw_shadow_map_program, g_shadow_map_fragment_shader_object);
|
||||
glLinkProgramARB(g_draw_shadow_map_program);
|
||||
|
||||
#ifdef _DEBUG
|
||||
int log_length;
|
||||
glGetObjectParameterivARB(g_draw_shadow_map_program, GL_OBJECT_LINK_STATUS_ARB , &log_length);
|
||||
if(!log_length)
|
||||
{
|
||||
const int nLogSize = 1024;
|
||||
char shader_log[nLogSize];
|
||||
glGetInfoLogARB(g_shadow_map_fragment_shader_object,
|
||||
nLogSize, &log_length, shader_log);
|
||||
if(log_length)
|
||||
display_warning(shader_log);
|
||||
glGetInfoLogARB(g_shadow_map_vertex_shader_object, nLogSize, &log_length, shader_log);
|
||||
if(log_length)
|
||||
display_warning(shader_log);
|
||||
glGetInfoLogARB(g_draw_shadow_map_program,
|
||||
nLogSize, &log_length, shader_log);
|
||||
if(log_length)
|
||||
display_warning(shader_log);
|
||||
}
|
||||
#endif
|
||||
g_draw_shadow_map_program = glCreateProgram();
|
||||
glAttachShader(g_draw_shadow_map_program, g_shadow_map_vertex_shader_object);
|
||||
glAttachShader(g_draw_shadow_map_program, g_shadow_map_fragment_shader_object);
|
||||
glLinkProgram(g_draw_shadow_map_program);
|
||||
assert(check_program_link_status(g_draw_shadow_map_program));
|
||||
}
|
||||
|
||||
static
|
||||
|
@ -147,13 +161,11 @@ void DestroyShadowMapShader()
|
|||
|
||||
if (g_tlut_tex > 0)
|
||||
glDeleteTextures(1, &g_tlut_tex);
|
||||
/*
|
||||
glDetachShader(g_draw_shadow_map_program, g_shadow_map_vertex_shader_object);
|
||||
glDetachShader(g_draw_shadow_map_program, g_shadow_map_fragment_shader_object);
|
||||
glDeleteShader(g_shadow_map_vertex_shader_object);
|
||||
glDeleteShader(g_shadow_map_fragment_shader_object);
|
||||
glDeleteProgram(g_draw_shadow_map_program);
|
||||
*/
|
||||
glDetachShader(g_draw_shadow_map_program, g_shadow_map_vertex_shader_object);
|
||||
glDetachShader(g_draw_shadow_map_program, g_shadow_map_fragment_shader_object);
|
||||
glDeleteShader(g_shadow_map_vertex_shader_object);
|
||||
glDeleteShader(g_shadow_map_fragment_shader_object);
|
||||
glDeleteProgram(g_draw_shadow_map_program);
|
||||
}
|
||||
|
||||
void InitGLSLCombiner()
|
||||
|
@ -163,73 +175,43 @@ void InitGLSLCombiner()
|
|||
glActiveTextureARB(GL_TEXTURE1_ARB);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
|
||||
g_vertex_shader_object = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
|
||||
glShaderSourceARB(g_vertex_shader_object, 1, &vertex_shader, NULL);
|
||||
glCompileShaderARB(g_vertex_shader_object);
|
||||
g_vertex_shader_object = glCreateShader(GL_VERTEX_SHADER);
|
||||
glShaderSource(g_vertex_shader_object, 1, &vertex_shader, NULL);
|
||||
glCompileShader(g_vertex_shader_object);
|
||||
assert(check_shader_compile_status(g_vertex_shader_object));
|
||||
|
||||
g_calc_light_shader_object = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
|
||||
glShaderSourceARB(g_calc_light_shader_object, 1, &fragment_shader_calc_light, NULL);
|
||||
glCompileShaderARB(g_calc_light_shader_object);
|
||||
g_calc_light_shader_object = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
glShaderSource(g_calc_light_shader_object, 1, &fragment_shader_calc_light, NULL);
|
||||
glCompileShader(g_calc_light_shader_object);
|
||||
assert(check_shader_compile_status(g_calc_light_shader_object));
|
||||
|
||||
g_calc_lod_shader_object = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
|
||||
glShaderSourceARB(g_calc_lod_shader_object, 1, &fragment_shader_calc_lod, NULL);
|
||||
glCompileShaderARB(g_calc_lod_shader_object);
|
||||
g_calc_lod_shader_object = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
glShaderSource(g_calc_lod_shader_object, 1, &fragment_shader_calc_lod, NULL);
|
||||
glCompileShader(g_calc_lod_shader_object);
|
||||
assert(check_shader_compile_status(g_calc_lod_shader_object));
|
||||
|
||||
g_calc_noise_shader_object = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
|
||||
glShaderSourceARB(g_calc_noise_shader_object, 1, &noise_fragment_shader, NULL);
|
||||
glCompileShaderARB(g_calc_noise_shader_object);
|
||||
g_calc_noise_shader_object = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
glShaderSource(g_calc_noise_shader_object, 1, &noise_fragment_shader, NULL);
|
||||
glCompileShader(g_calc_noise_shader_object);
|
||||
assert(check_shader_compile_status(g_calc_noise_shader_object));
|
||||
|
||||
g_test_alpha_shader_object = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
|
||||
glShaderSourceARB(g_test_alpha_shader_object, 1, &alpha_test_fragment_shader, NULL);
|
||||
glCompileShaderARB(g_test_alpha_shader_object);
|
||||
g_test_alpha_shader_object = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
glShaderSource(g_test_alpha_shader_object, 1, &alpha_test_fragment_shader, NULL);
|
||||
glCompileShader(g_test_alpha_shader_object);
|
||||
assert(check_shader_compile_status(g_test_alpha_shader_object));
|
||||
|
||||
if (OGL.bImageTexture) {
|
||||
g_calc_depth_shader_object = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
|
||||
g_calc_depth_shader_object = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
if (g_bUseFloatDepthTexture)
|
||||
glShaderSourceARB(g_calc_depth_shader_object, 1, &depth_compare_shader_float, NULL);
|
||||
glShaderSource(g_calc_depth_shader_object, 1, &depth_compare_shader_float, NULL);
|
||||
else
|
||||
glShaderSourceARB(g_calc_depth_shader_object, 1, &depth_compare_shader_int, NULL);
|
||||
glCompileShaderARB(g_calc_depth_shader_object);
|
||||
glShaderSource(g_calc_depth_shader_object, 1, &depth_compare_shader_int, NULL);
|
||||
glCompileShader(g_calc_depth_shader_object);
|
||||
assert(check_shader_compile_status(g_calc_depth_shader_object));
|
||||
}
|
||||
|
||||
InitZlutTexture();
|
||||
InitShadowMapShader();
|
||||
|
||||
/*
|
||||
const char* base_vertex_shader =
|
||||
"void main() \n"
|
||||
"{ \n"
|
||||
" gl_Position = ftransform(); \n"
|
||||
"} \n"
|
||||
;
|
||||
|
||||
GLhandleARB base_vertex_shader_object = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
|
||||
glShaderSourceARB(base_vertex_shader_object, 1, &base_vertex_shader, NULL);
|
||||
glCompileShaderARB(base_vertex_shader_object);
|
||||
GLhandleARB test_program = glCreateProgramObjectARB();
|
||||
glAttachObjectARB(test_program, base_vertex_shader_object);
|
||||
glAttachObjectARB(test_program, g_calc_depth_shader_object);
|
||||
glLinkProgramARB(test_program);
|
||||
|
||||
int log_length;
|
||||
glGetObjectParameterivARB(test_program, GL_OBJECT_LINK_STATUS_ARB , &log_length);
|
||||
if(!log_length)
|
||||
{
|
||||
const int nLogSize = 1024;
|
||||
char shader_log[nLogSize];
|
||||
glGetInfoLogARB(g_calc_depth_shader_object,
|
||||
nLogSize, &log_length, shader_log);
|
||||
if(log_length)
|
||||
display_warning(shader_log);
|
||||
glGetInfoLogARB(base_vertex_shader_object, nLogSize, &log_length, shader_log);
|
||||
if(log_length)
|
||||
display_warning(shader_log);
|
||||
glGetInfoLogARB(test_program,
|
||||
nLogSize, &log_length, shader_log);
|
||||
if(log_length)
|
||||
display_warning(shader_log);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void DestroyGLSLCombiner() {
|
||||
|
@ -394,9 +376,7 @@ int CompileCombiner(const CombinerStage & _stage, const char** _Input, char * _f
|
|||
}
|
||||
|
||||
GLSLCombiner::GLSLCombiner(Combiner *_color, Combiner *_alpha) {
|
||||
m_vertexShaderObject = g_vertex_shader_object;
|
||||
|
||||
char *fragment_shader = (char*)malloc(8192);
|
||||
char *fragment_shader = (char*)malloc(4096);
|
||||
strcpy(fragment_shader, fragment_shader_header_common_variables);
|
||||
|
||||
char strCombiner[512];
|
||||
|
@ -452,24 +432,51 @@ GLSLCombiner::GLSLCombiner(Combiner *_color, Combiner *_alpha) {
|
|||
strcat(fragment_shader, fragment_shader_toonify);
|
||||
#endif
|
||||
|
||||
m_fragmentShaderObject = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
|
||||
glShaderSourceARB(m_fragmentShaderObject, 1, (const GLcharARB**)&fragment_shader, NULL);
|
||||
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
glShaderSource(fragmentShader, 1, (const GLchar**)&fragment_shader, NULL);
|
||||
free(fragment_shader);
|
||||
glCompileShader(fragmentShader);
|
||||
assert(check_shader_compile_status(fragmentShader));
|
||||
|
||||
glCompileShaderARB(m_fragmentShaderObject);
|
||||
memset(m_aShaders, 0, sizeof(m_aShaders));
|
||||
u32 uShaderIdx = 0;
|
||||
|
||||
m_programObject = glCreateProgramObjectARB();
|
||||
glAttachObjectARB(m_programObject, m_fragmentShaderObject);
|
||||
if (bHWLightingCalculation)
|
||||
glAttachObjectARB(m_programObject, g_calc_light_shader_object);
|
||||
if (bUseLod)
|
||||
glAttachObjectARB(m_programObject, g_calc_lod_shader_object);
|
||||
glAttachObjectARB(m_programObject, g_test_alpha_shader_object);
|
||||
if (OGL.bImageTexture)
|
||||
glAttachObjectARB(m_programObject, g_calc_depth_shader_object);
|
||||
glAttachObjectARB(m_programObject, g_calc_noise_shader_object);
|
||||
glAttachObjectARB(m_programObject, m_vertexShaderObject);
|
||||
glLinkProgramARB(m_programObject);
|
||||
m_program = glCreateProgram();
|
||||
glAttachShader(m_program, g_vertex_shader_object);
|
||||
m_aShaders[uShaderIdx++] = g_vertex_shader_object;
|
||||
glAttachShader(m_program, fragmentShader);
|
||||
m_aShaders[uShaderIdx++] = fragmentShader;
|
||||
glAttachShader(m_program, g_calc_depth_shader_object);
|
||||
m_aShaders[uShaderIdx++] = g_calc_depth_shader_object;
|
||||
if (bHWLightingCalculation) {
|
||||
glAttachShader(m_program, g_calc_light_shader_object);
|
||||
m_aShaders[uShaderIdx++] = g_calc_light_shader_object;
|
||||
}
|
||||
if (bUseLod) {
|
||||
glAttachShader(m_program, g_calc_lod_shader_object);
|
||||
m_aShaders[uShaderIdx++] = g_calc_lod_shader_object;
|
||||
}
|
||||
glAttachShader(m_program, g_test_alpha_shader_object);
|
||||
m_aShaders[uShaderIdx++] = g_test_alpha_shader_object;
|
||||
if (OGL.bImageTexture) {
|
||||
glAttachShader(m_program, g_calc_depth_shader_object);
|
||||
m_aShaders[uShaderIdx++] = g_calc_depth_shader_object;
|
||||
}
|
||||
glAttachShader(m_program, g_calc_noise_shader_object);
|
||||
m_aShaders[uShaderIdx] = g_calc_noise_shader_object;
|
||||
assert(uShaderIdx <= sizeof(m_aShaders)/sizeof(m_aShaders[0]));
|
||||
glLinkProgram(m_program);
|
||||
assert(check_program_link_status(m_program));
|
||||
}
|
||||
|
||||
GLSLCombiner::~GLSLCombiner() {
|
||||
u32 shaderIndex = 0;
|
||||
const u32 arraySize = sizeof(m_aShaders)/sizeof(m_aShaders[0]);
|
||||
while (shaderIndex < arraySize && m_aShaders[shaderIndex] > 0) {
|
||||
glDetachShader(m_program, m_aShaders[shaderIndex]);
|
||||
glDeleteShader(m_aShaders[shaderIndex++]);
|
||||
}
|
||||
glDeleteProgram(m_program);
|
||||
}
|
||||
|
||||
void GLSLCombiner::Set() {
|
||||
|
@ -481,87 +488,66 @@ void GLSLCombiner::Set() {
|
|||
combiner.vertex.alpha = COMBINED;
|
||||
combiner.vertex.secondaryColor = LIGHT;
|
||||
|
||||
glUseProgramObjectARB(m_programObject);
|
||||
glUseProgram(m_program);
|
||||
|
||||
int texture0_location = glGetUniformLocationARB(m_programObject, "texture0");
|
||||
int texture0_location = glGetUniformLocation(m_program, "texture0");
|
||||
if (texture0_location != -1) {
|
||||
glUniform1iARB(texture0_location, 0);
|
||||
glUniform1i(texture0_location, 0);
|
||||
combiner.usesT0 = TRUE;
|
||||
}
|
||||
|
||||
int texture1_location = glGetUniformLocationARB(m_programObject, "texture1");
|
||||
int texture1_location = glGetUniformLocation(m_program, "texture1");
|
||||
if (texture1_location != -1) {
|
||||
glUniform1iARB(texture1_location, 1);
|
||||
glUniform1i(texture1_location, 1);
|
||||
combiner.usesT1 = TRUE;
|
||||
}
|
||||
|
||||
UpdateColors();
|
||||
UpdateAlphaTestInfo();
|
||||
|
||||
#ifdef _DEBUG
|
||||
int log_length;
|
||||
glGetObjectParameterivARB(m_programObject, GL_OBJECT_LINK_STATUS_ARB , &log_length);
|
||||
if(!log_length)
|
||||
{
|
||||
const int nLogSize = 1024;
|
||||
char shader_log[nLogSize];
|
||||
glGetInfoLogARB(m_fragmentShaderObject,
|
||||
nLogSize, &log_length, shader_log);
|
||||
if(log_length)
|
||||
display_warning(shader_log);
|
||||
glGetInfoLogARB(m_vertexShaderObject, nLogSize, &log_length, shader_log);
|
||||
if(log_length)
|
||||
display_warning(shader_log);
|
||||
glGetInfoLogARB(m_programObject,
|
||||
nLogSize, &log_length, shader_log);
|
||||
if(log_length)
|
||||
display_warning(shader_log);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void GLSLCombiner::UpdateColors() {
|
||||
int prim_color_location = glGetUniformLocationARB(m_programObject, "prim_color");
|
||||
glUniform4fARB(prim_color_location, gDP.primColor.r, gDP.primColor.g, gDP.primColor.b, gDP.primColor.a);
|
||||
int prim_color_location = glGetUniformLocation(m_program, "prim_color");
|
||||
glUniform4f(prim_color_location, gDP.primColor.r, gDP.primColor.g, gDP.primColor.b, gDP.primColor.a);
|
||||
|
||||
int env_color_location = glGetUniformLocationARB(m_programObject, "env_color");
|
||||
glUniform4fARB(env_color_location, gDP.envColor.r, gDP.envColor.g, gDP.envColor.b, gDP.envColor.a);
|
||||
int env_color_location = glGetUniformLocation(m_program, "env_color");
|
||||
glUniform4f(env_color_location, gDP.envColor.r, gDP.envColor.g, gDP.envColor.b, gDP.envColor.a);
|
||||
|
||||
int prim_lod_location = glGetUniformLocationARB(m_programObject, "prim_lod");
|
||||
glUniform1fARB(prim_lod_location, gDP.primColor.l);
|
||||
int prim_lod_location = glGetUniformLocation(m_program, "prim_lod");
|
||||
glUniform1f(prim_lod_location, gDP.primColor.l);
|
||||
|
||||
if (combiner.usesLOD) {
|
||||
BOOL bCalcLOD = gDP.otherMode.textureLOD == G_TL_LOD;
|
||||
int lod_en_location = glGetUniformLocationARB(m_programObject, "lod_enabled");
|
||||
glUniform1iARB(lod_en_location, bCalcLOD);
|
||||
int lod_en_location = glGetUniformLocation(m_program, "lod_enabled");
|
||||
glUniform1i(lod_en_location, bCalcLOD);
|
||||
if (bCalcLOD) {
|
||||
int scale_x_location = glGetUniformLocationARB(m_programObject, "lod_x_scale");
|
||||
glUniform1fARB(scale_x_location, OGL.scaleX);
|
||||
int scale_y_location = glGetUniformLocationARB(m_programObject, "lod_y_scale");
|
||||
glUniform1fARB(scale_y_location, OGL.scaleY);
|
||||
int min_lod_location = glGetUniformLocationARB(m_programObject, "min_lod");
|
||||
glUniform1fARB(min_lod_location, gDP.primColor.m);
|
||||
int max_tile_location = glGetUniformLocationARB(m_programObject, "max_tile");
|
||||
glUniform1iARB(max_tile_location, gSP.texture.level);
|
||||
int texture_detail_location = glGetUniformLocationARB(m_programObject, "texture_detail");
|
||||
glUniform1iARB(texture_detail_location, gDP.otherMode.textureDetail);
|
||||
int scale_x_location = glGetUniformLocation(m_program, "lod_x_scale");
|
||||
glUniform1f(scale_x_location, OGL.scaleX);
|
||||
int scale_y_location = glGetUniformLocation(m_program, "lod_y_scale");
|
||||
glUniform1f(scale_y_location, OGL.scaleY);
|
||||
int min_lod_location = glGetUniformLocation(m_program, "min_lod");
|
||||
glUniform1f(min_lod_location, gDP.primColor.m);
|
||||
int max_tile_location = glGetUniformLocation(m_program, "max_tile");
|
||||
glUniform1i(max_tile_location, gSP.texture.level);
|
||||
int texture_detail_location = glGetUniformLocation(m_program, "texture_detail");
|
||||
glUniform1i(texture_detail_location, gDP.otherMode.textureDetail);
|
||||
}
|
||||
}
|
||||
|
||||
int nDither = (gDP.otherMode.alphaCompare == 3 && (gDP.otherMode.colorDither == 2 || gDP.otherMode.alphaDither == 2)) ? 1 : 0;
|
||||
int dither_location = glGetUniformLocationARB(m_programObject, "dither_enabled");
|
||||
glUniform1iARB(dither_location, nDither);
|
||||
int dither_location = glGetUniformLocation(m_program, "dither_enabled");
|
||||
glUniform1i(dither_location, nDither);
|
||||
|
||||
if ((m_nInputs & (1<<NOISE)) + nDither > 0) {
|
||||
int time_location = glGetUniformLocationARB(m_programObject, "time");
|
||||
glUniform1fARB(time_location, (float)(rand()&255));
|
||||
int time_location = glGetUniformLocation(m_program, "time");
|
||||
glUniform1f(time_location, (float)(rand()&255));
|
||||
}
|
||||
|
||||
int fog_location = glGetUniformLocationARB(m_programObject, "fog_enabled");
|
||||
glUniform1iARB(fog_location, (gSP.geometryMode & G_FOG) > 0 ? 1 : 0);
|
||||
int fog_location = glGetUniformLocation(m_program, "fog_enabled");
|
||||
glUniform1i(fog_location, (gSP.geometryMode & G_FOG) > 0 ? 1 : 0);
|
||||
|
||||
int fb8bit_location = glGetUniformLocationARB(m_programObject, "fb_8bit_mode");
|
||||
glUniform1iARB(fb8bit_location, 0);
|
||||
int fb8bit_location = glGetUniformLocation(m_program, "fb_8bit_mode");
|
||||
glUniform1i(fb8bit_location, 0);
|
||||
|
||||
}
|
||||
|
||||
|
@ -581,10 +567,10 @@ void GLSLCombiner::UpdateFBInfo() {
|
|||
nFbFixedAlpha |= 2;
|
||||
}
|
||||
}
|
||||
int fb8bit_location = glGetUniformLocationARB(m_programObject, "fb_8bit_mode");
|
||||
glUniform1iARB(fb8bit_location, nFb8bitMode);
|
||||
int fbFixedAlpha_location = glGetUniformLocationARB(m_programObject, "fb_fixed_alpha");
|
||||
glUniform1iARB(fbFixedAlpha_location, nFbFixedAlpha);
|
||||
int fb8bit_location = glGetUniformLocation(m_program, "fb_8bit_mode");
|
||||
glUniform1i(fb8bit_location, nFb8bitMode);
|
||||
int fbFixedAlpha_location = glGetUniformLocation(m_program, "fb_fixed_alpha");
|
||||
glUniform1i(fbFixedAlpha_location, nFbFixedAlpha);
|
||||
}
|
||||
|
||||
void GLSLCombiner::UpdateDepthInfo() {
|
||||
|
@ -594,22 +580,22 @@ void GLSLCombiner::UpdateDepthInfo() {
|
|||
if (frameBuffer.top == NULL || frameBuffer.top->depth_texture == NULL)
|
||||
return;
|
||||
int nDepthEnabled = (gSP.geometryMode & G_ZBUFFER) > 0 ? 1 : 0;
|
||||
int depth_enabled_location = glGetUniformLocationARB(m_programObject, "depthEnabled");
|
||||
glUniform1iARB(depth_enabled_location, nDepthEnabled);
|
||||
int depth_enabled_location = glGetUniformLocation(m_program, "depthEnabled");
|
||||
glUniform1i(depth_enabled_location, nDepthEnabled);
|
||||
if (nDepthEnabled == 0)
|
||||
return;
|
||||
|
||||
int depth_compare_location = glGetUniformLocationARB(m_programObject, "depthCompareEnabled");
|
||||
glUniform1iARB(depth_compare_location, gDP.otherMode.depthCompare);
|
||||
int depth_update_location = glGetUniformLocationARB(m_programObject, "depthUpdateEnabled");
|
||||
glUniform1iARB(depth_update_location, gDP.otherMode.depthUpdate);
|
||||
int depth_polygon_offset = glGetUniformLocationARB(m_programObject, "depthPolygonOffset");
|
||||
int depth_compare_location = glGetUniformLocation(m_program, "depthCompareEnabled");
|
||||
glUniform1i(depth_compare_location, gDP.otherMode.depthCompare);
|
||||
int depth_update_location = glGetUniformLocation(m_program, "depthUpdateEnabled");
|
||||
glUniform1i(depth_update_location, gDP.otherMode.depthUpdate);
|
||||
int depth_polygon_offset = glGetUniformLocation(m_program, "depthPolygonOffset");
|
||||
if (g_bUseFloatDepthTexture) {
|
||||
float fPlygonOffset = gDP.otherMode.depthMode == ZMODE_DEC ? 0.005 : 0.0f;
|
||||
glUniform1fARB(depth_polygon_offset, fPlygonOffset);
|
||||
float fPlygonOffset = gDP.otherMode.depthMode == ZMODE_DEC ? 0.005f : 0.0f;
|
||||
glUniform1f(depth_polygon_offset, fPlygonOffset);
|
||||
} else {
|
||||
int iPlygonOffset = gDP.otherMode.depthMode == ZMODE_DEC ? 5 : 0;
|
||||
glUniform1iARB(depth_polygon_offset, iPlygonOffset);
|
||||
glUniform1i(depth_polygon_offset, iPlygonOffset);
|
||||
}
|
||||
|
||||
GLuint texture = frameBuffer.top->depth_texture->glName;
|
||||
|
@ -654,17 +640,17 @@ void GLSL_ClearDepthBuffer() {
|
|||
}
|
||||
|
||||
void GLSLCombiner::UpdateAlphaTestInfo() {
|
||||
int at_enabled_location = glGetUniformLocationARB(m_programObject, "alphaTestEnabled");
|
||||
int at_value_location = glGetUniformLocationARB(m_programObject, "alphaTestValue");
|
||||
int at_enabled_location = glGetUniformLocation(m_program, "alphaTestEnabled");
|
||||
int at_value_location = glGetUniformLocation(m_program, "alphaTestValue");
|
||||
if ((gDP.otherMode.alphaCompare == G_AC_THRESHOLD) && !(gDP.otherMode.alphaCvgSel)) {
|
||||
glUniform1iARB(at_enabled_location, 1);
|
||||
glUniform1fARB(at_value_location, gDP.blendColor.a);
|
||||
glUniform1i(at_enabled_location, 1);
|
||||
glUniform1f(at_value_location, gDP.blendColor.a);
|
||||
} else if (gDP.otherMode.cvgXAlpha) {
|
||||
glUniform1iARB(at_enabled_location, 1);
|
||||
glUniform1fARB(at_value_location, 0.5f);
|
||||
glUniform1i(at_enabled_location, 1);
|
||||
glUniform1f(at_value_location, 0.5f);
|
||||
} else {
|
||||
glUniform1iARB(at_enabled_location, 0);
|
||||
glUniform1fARB(at_value_location, 0.0f);
|
||||
glUniform1i(at_enabled_location, 0);
|
||||
glUniform1f(at_value_location, 0.0f);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -756,7 +742,7 @@ void GLS_SetShadowMapCombiner() {
|
|||
glTexSubImage1D(GL_TEXTURE_1D, 0, 0, 256, GL_RED, GL_UNSIGNED_SHORT, pData);
|
||||
glBindTexture(GL_TEXTURE_1D, 0);
|
||||
*/
|
||||
glUseProgramObjectARB(g_draw_shadow_map_program);
|
||||
glUseProgram(g_draw_shadow_map_program);
|
||||
|
||||
glBindImageTexture(TlutImageUnit, g_tlut_tex, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R16UI);
|
||||
GLenum depthTexFormat = g_bUseFloatDepthTexture ? GL_R32F : GL_R16UI;
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
class GLSLCombiner : public OGLCombiner {
|
||||
public:
|
||||
GLSLCombiner(Combiner *_color, Combiner *_alpha);
|
||||
virtual ~GLSLCombiner();
|
||||
virtual void Set();
|
||||
virtual void UpdateColors();
|
||||
virtual void UpdateFBInfo();
|
||||
|
@ -11,9 +12,8 @@ public:
|
|||
virtual void UpdateAlphaTestInfo();
|
||||
|
||||
private:
|
||||
GLhandleARB m_vertexShaderObject;
|
||||
GLhandleARB m_fragmentShaderObject;
|
||||
GLhandleARB m_programObject;
|
||||
GLuint m_aShaders[8];
|
||||
GLuint m_program;
|
||||
int m_nInputs;
|
||||
};
|
||||
|
||||
|
|
76
OpenGL.cpp
76
OpenGL.cpp
|
@ -15,21 +15,25 @@ GLInfo OGL;
|
|||
|
||||
#ifndef __LINUX__
|
||||
// GLSL functions
|
||||
PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
|
||||
PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
|
||||
PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
|
||||
PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
|
||||
PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
|
||||
PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
|
||||
PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
|
||||
PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
|
||||
PFNGLUNIFORM1IARBPROC glUniform1iARB;
|
||||
PFNGLUNIFORM4IARBPROC glUniform4iARB;
|
||||
PFNGLUNIFORM4FARBPROC glUniform4fARB;
|
||||
PFNGLUNIFORM1FARBPROC glUniform1fARB;
|
||||
PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
|
||||
PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
|
||||
PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
|
||||
PFNGLCREATESHADERPROC glCreateShader;
|
||||
PFNGLCOMPILESHADERPROC glCompileShader;
|
||||
PFNGLSHADERSOURCEPROC glShaderSource;
|
||||
PFNGLCREATEPROGRAMPROC glCreateProgram;
|
||||
PFNGLATTACHSHADERPROC glAttachShader;
|
||||
PFNGLLINKPROGRAMPROC glLinkProgram;
|
||||
PFNGLUSEPROGRAMPROC glUseProgram;
|
||||
PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
|
||||
PFNGLUNIFORM1IPROC glUniform1i;
|
||||
PFNGLUNIFORM1FPROC glUniform1f;
|
||||
PFNGLUNIFORM4FPROC glUniform4f;
|
||||
PFNGLDETACHSHADERPROC glDetachShader;
|
||||
PFNGLDELETESHADERPROC glDeleteShader;
|
||||
PFNGLDELETEPROGRAMPROC glDeleteProgram;
|
||||
PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog;
|
||||
PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog;
|
||||
PFNGLGETSHADERIVPROC glGetShaderiv;
|
||||
PFNGLGETPROGRAMIVPROC glGetProgramiv;
|
||||
|
||||
PFNGLSECONDARYCOLOR3FPROC glSecondaryColor3f;
|
||||
|
||||
// NV_register_combiners functions
|
||||
|
@ -148,31 +152,29 @@ void OGL_InitExtensions()
|
|||
const char *version = reinterpret_cast<const char*>(glGetString(GL_VERSION));
|
||||
u32 uVersion = atol(version);
|
||||
|
||||
if (OGL.GLSL = isExtensionSupported("GL_ARB_shading_language_100") &&
|
||||
isExtensionSupported("GL_ARB_shader_objects") &&
|
||||
isExtensionSupported("GL_ARB_fragment_shader") &&
|
||||
isExtensionSupported("GL_ARB_vertex_shader"))
|
||||
{
|
||||
OGL.GLSL = TRUE;
|
||||
#ifndef __LINUX__
|
||||
glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)wglGetProcAddress("glCreateShaderObjectARB");
|
||||
glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)wglGetProcAddress("glShaderSourceARB");
|
||||
glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)wglGetProcAddress("glCompileShaderARB");
|
||||
glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)wglGetProcAddress("glCreateProgramObjectARB");
|
||||
glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)wglGetProcAddress("glAttachObjectARB");
|
||||
glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)wglGetProcAddress("glLinkProgramARB");
|
||||
glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)wglGetProcAddress("glUseProgramObjectARB");
|
||||
glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)wglGetProcAddress("glGetUniformLocationARB");
|
||||
glUniform1iARB = (PFNGLUNIFORM1IARBPROC)wglGetProcAddress("glUniform1iARB");
|
||||
glUniform4iARB = (PFNGLUNIFORM4IARBPROC)wglGetProcAddress("glUniform4iARB");
|
||||
glUniform4fARB = (PFNGLUNIFORM4FARBPROC)wglGetProcAddress("glUniform4fARB");
|
||||
glUniform1fARB = (PFNGLUNIFORM1FARBPROC)wglGetProcAddress("glUniform1fARB");
|
||||
glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)wglGetProcAddress("glDeleteObjectARB");
|
||||
glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)wglGetProcAddress("glGetInfoLogARB");
|
||||
glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)wglGetProcAddress("glGetObjectParameterivARB");
|
||||
glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader");
|
||||
glCompileShader = (PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader");
|
||||
glShaderSource = (PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource");
|
||||
glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
|
||||
glAttachShader = (PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader");
|
||||
glLinkProgram = (PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram");
|
||||
glUseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram");
|
||||
glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)wglGetProcAddress("glGetUniformLocation");
|
||||
glUniform1i = (PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i");
|
||||
glUniform1f = (PFNGLUNIFORM1FPROC)wglGetProcAddress("glUniform1f");
|
||||
glUniform4f = (PFNGLUNIFORM4FPROC)wglGetProcAddress("glUniform4f");
|
||||
glDetachShader = (PFNGLDETACHSHADERPROC)wglGetProcAddress("glDetachShader");
|
||||
glDeleteShader = (PFNGLDELETESHADERPROC)wglGetProcAddress("glDeleteShader");
|
||||
glDeleteProgram = (PFNGLDELETEPROGRAMPROC)wglGetProcAddress("glDeleteProgram");
|
||||
glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)wglGetProcAddress("glGetProgramInfoLog");
|
||||
glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)wglGetProcAddress("glGetShaderInfoLog");
|
||||
glGetShaderiv = (PFNGLGETSHADERIVPROC)wglGetProcAddress("glGetShaderiv");
|
||||
glGetProgramiv = (PFNGLGETPROGRAMIVPROC)wglGetProcAddress("glGetProgramiv");
|
||||
|
||||
glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)wglGetProcAddress("glSecondaryColor3f");
|
||||
glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)wglGetProcAddress("glSecondaryColor3f");
|
||||
#endif // __LINUX__
|
||||
}
|
||||
|
||||
|
||||
if (OGL.NV_register_combiners = isExtensionSupported( "GL_NV_register_combiners" ))
|
||||
|
|
34
OpenGL.h
34
OpenGL.h
|
@ -101,21 +101,25 @@ struct GLcolor
|
|||
};
|
||||
|
||||
#ifndef __LINUX__
|
||||
extern PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
|
||||
extern PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
|
||||
extern PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
|
||||
extern PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
|
||||
extern PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
|
||||
extern PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
|
||||
extern PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
|
||||
extern PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
|
||||
extern PFNGLUNIFORM1IARBPROC glUniform1iARB;
|
||||
extern PFNGLUNIFORM4IARBPROC glUniform4iARB;
|
||||
extern PFNGLUNIFORM4FARBPROC glUniform4fARB;
|
||||
extern PFNGLUNIFORM1FARBPROC glUniform1fARB;
|
||||
extern PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
|
||||
extern PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
|
||||
extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
|
||||
extern PFNGLCREATESHADERPROC glCreateShader;
|
||||
extern PFNGLCOMPILESHADERPROC glCompileShader;
|
||||
extern PFNGLSHADERSOURCEPROC glShaderSource;
|
||||
extern PFNGLCREATEPROGRAMPROC glCreateProgram;
|
||||
extern PFNGLATTACHSHADERPROC glAttachShader;
|
||||
extern PFNGLLINKPROGRAMPROC glLinkProgram;
|
||||
extern PFNGLUSEPROGRAMPROC glUseProgram;
|
||||
extern PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
|
||||
extern PFNGLUNIFORM1IPROC glUniform1i;
|
||||
extern PFNGLUNIFORM1FPROC glUniform1f;
|
||||
extern PFNGLUNIFORM4FPROC glUniform4f;
|
||||
extern PFNGLDETACHSHADERPROC glDetachShader;
|
||||
extern PFNGLDELETESHADERPROC glDeleteShader;
|
||||
extern PFNGLDELETEPROGRAMPROC glDeleteProgram;
|
||||
extern PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog;
|
||||
extern PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog;
|
||||
extern PFNGLGETSHADERIVPROC glGetShaderiv;
|
||||
extern PFNGLGETPROGRAMIVPROC glGetProgramiv;
|
||||
|
||||
extern PFNGLSECONDARYCOLOR3FPROC glSecondaryColor3f;
|
||||
|
||||
extern PFNGLCOMBINERPARAMETERFVNVPROC glCombinerParameterfvNV;
|
||||
|
|
Loading…
Reference in New Issue
Block a user