mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-08-10 09:44:13 +02:00
Update to v093 release.
byuu says: Changelog: - added Cocoa target: higan can now be compiled for OS X Lion [Cydrak, byuu] - SNES/accuracy profile hires color blending improvements - fixes Marvelous text [AWJ] - fixed a slight bug in SNES/SA-1 VBR support caused by a typo - added support for multi-pass shaders that can load external textures (requires OpenGL 3.2+) - added game library path (used by ananke->Import Game) to Settings->Advanced - system profiles, shaders and cheats database can be stored in "all users" shared folders now (eg /usr/share on Linux) - all configuration files are in BML format now, instead of XML (much easier to read and edit this way) - main window supports drag-and-drop of game folders (but not game files / ZIP archives) - audio buffer clears when entering a modal loop on Windows (prevents audio repetition with DirectSound driver) - a substantial amount of code clean-up (probably the biggest refactoring to date) One highly desired target for this release was to default to the optimal drivers instead of the safest drivers, but because AMD drivers don't seem to like my OpenGL 3.2 driver, I've decided to postpone that. AMD has too big a market share. Hopefully with v093 officially released, we can get some public input on what AMD doesn't like.
This commit is contained in:
104
ruby/video/opengl/utility.hpp
Normal file
104
ruby/video/opengl/utility.hpp
Normal file
@@ -0,0 +1,104 @@
|
||||
static unsigned glrSize(unsigned size) {
|
||||
return size;
|
||||
//return bit::round(size); //return nearest power of two
|
||||
}
|
||||
|
||||
static GLuint glrFormat(const string& format) {
|
||||
if(format == "rgba8" ) return GL_RGBA8;
|
||||
if(format == "rgb10a2") return GL_RGB10_A2;
|
||||
if(format == "rgba12" ) return GL_RGBA12;
|
||||
if(format == "rgba16" ) return GL_RGBA16;
|
||||
if(format == "rgba16f") return GL_RGBA16F;
|
||||
if(format == "rgba32f") return GL_RGBA32F;
|
||||
return GL_RGBA8;
|
||||
}
|
||||
|
||||
static GLuint glrFilter(const string& filter) {
|
||||
if(filter == "nearest") return GL_NEAREST;
|
||||
if(filter == "linear" ) return GL_LINEAR;
|
||||
return GL_LINEAR;
|
||||
}
|
||||
|
||||
static GLuint glrWrap(const string& wrap) {
|
||||
if(wrap == "border") return GL_CLAMP_TO_BORDER;
|
||||
if(wrap == "edge" ) return GL_CLAMP_TO_EDGE;
|
||||
if(wrap == "repeat") return GL_REPEAT;
|
||||
return GL_CLAMP_TO_BORDER;
|
||||
}
|
||||
|
||||
static unsigned glrModulo(unsigned modulo) {
|
||||
if(modulo) return modulo;
|
||||
return 300; //divisible by 2, 3, 4, 5, 6, 10, 12, 15, 20, 25, 30, 50, 60, 100, 150
|
||||
}
|
||||
|
||||
static GLuint glrProgram() {
|
||||
GLuint program = 0;
|
||||
glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&program);
|
||||
return program;
|
||||
}
|
||||
|
||||
static void glrUniform1i(const string& name, GLint value) {
|
||||
GLint location = glGetUniformLocation(glrProgram(), name);
|
||||
glUniform1i(location, value);
|
||||
}
|
||||
|
||||
static void glrUniform4f(const string& name, GLfloat value0, GLfloat value1, GLfloat value2, GLfloat value3) {
|
||||
GLint location = glGetUniformLocation(glrProgram(), name);
|
||||
glUniform4f(location, value0, value1, value2, value3);
|
||||
}
|
||||
|
||||
static void glrUniformMatrix4fv(const string& name, GLfloat *values) {
|
||||
GLint location = glGetUniformLocation(glrProgram(), name);
|
||||
glUniformMatrix4fv(location, 1, GL_FALSE, values);
|
||||
}
|
||||
|
||||
static void glrParameters(GLuint filter, GLuint wrap) {
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap);
|
||||
}
|
||||
|
||||
static GLuint glrCreateShader(GLuint program, GLuint type, const char* source) {
|
||||
GLuint shader = glCreateShader(type);
|
||||
glShaderSource(shader, 1, &source, 0);
|
||||
glCompileShader(shader);
|
||||
GLint result = GL_FALSE;
|
||||
glGetShaderiv(shader, GL_COMPILE_STATUS, &result);
|
||||
if(result == GL_FALSE) {
|
||||
GLint length = 0;
|
||||
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
|
||||
char text[length + 1];
|
||||
glGetShaderInfoLog(shader, length, &length, text);
|
||||
text[length] = 0;
|
||||
print("[ruby::OpenGL: shader compiler error]\n", (const char*)text, "\n\n");
|
||||
return 0;
|
||||
}
|
||||
glAttachShader(program, shader);
|
||||
return shader;
|
||||
}
|
||||
|
||||
static void glrLinkProgram(GLuint program) {
|
||||
glLinkProgram(program);
|
||||
GLint result = GL_FALSE;
|
||||
glGetProgramiv(program, GL_LINK_STATUS, &result);
|
||||
if(result == GL_FALSE) {
|
||||
GLint length = 0;
|
||||
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length);
|
||||
char text[length + 1];
|
||||
glGetProgramInfoLog(program, length, &length, text);
|
||||
text[length] = 0;
|
||||
print("[ruby::OpenGL: shader linker error]\n", (const char*)text, "\n\n");
|
||||
}
|
||||
glValidateProgram(program);
|
||||
result = GL_FALSE;
|
||||
glGetProgramiv(program, GL_VALIDATE_STATUS, &result);
|
||||
if(result == GL_FALSE) {
|
||||
GLint length = 0;
|
||||
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length);
|
||||
char text[length + 1];
|
||||
glGetProgramInfoLog(program, length, &length, text);
|
||||
text[length] = 0;
|
||||
print("[ruby::OpenGL: shader validation error]\n", (const char*)text, "\n\n");
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user