mirror of https://github.com/PCSX2/pcsx2.git
gsdx-ogl-wnd: Make the HW renderer "work" on the opensource driver
* replace most OGL_FREE_DRIVER with a dynamic detection. Remains the context creation. Closed drivers need 3.3 * Add the CopySubImage fallback git-svn-id: http://pcsx2.googlecode.com/svn/branches/gsdx-ogl-wnd@5647 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
75418aba43
commit
acaf1ac8d5
|
@ -103,6 +103,7 @@ namespace GLLoader {
|
||||||
bool found_geometry_shader = true;
|
bool found_geometry_shader = true;
|
||||||
bool found_GL_NV_copy_image = false;
|
bool found_GL_NV_copy_image = false;
|
||||||
bool found_GL_ARB_copy_image = false;
|
bool found_GL_ARB_copy_image = false;
|
||||||
|
bool found_only_gl30 = false;
|
||||||
|
|
||||||
bool check_gl_version(uint32 major, uint32 minor) {
|
bool check_gl_version(uint32 major, uint32 minor) {
|
||||||
|
|
||||||
|
@ -129,6 +130,10 @@ namespace GLLoader {
|
||||||
found_geometry_shader = !!theApp.GetConfig("override_geometry_shader", -1);
|
found_geometry_shader = !!theApp.GetConfig("override_geometry_shader", -1);
|
||||||
fprintf(stderr, "Override geometry shaders detection\n");
|
fprintf(stderr, "Override geometry shaders detection\n");
|
||||||
}
|
}
|
||||||
|
if ( (major_gl == 3) && minor_gl < 3) {
|
||||||
|
// Opensource driver spotted
|
||||||
|
found_only_gl30 = true;
|
||||||
|
}
|
||||||
|
|
||||||
if ( (major_gl < major) || ( major_gl == major && minor_gl < minor ) ) {
|
if ( (major_gl < major) || ( major_gl == major && minor_gl < minor ) ) {
|
||||||
fprintf(stderr, "OPENGL %d.%d is not supported\n", major, minor);
|
fprintf(stderr, "OPENGL %d.%d is not supported\n", major, minor);
|
||||||
|
@ -263,6 +268,13 @@ namespace GLLoader {
|
||||||
found_GL_ARB_separate_shader_objects = !!theApp.GetConfig("override_GL_ARB_separate_shader_objects", -1);
|
found_GL_ARB_separate_shader_objects = !!theApp.GetConfig("override_GL_ARB_separate_shader_objects", -1);
|
||||||
fprintf(stderr, "Override GL_ARB_separate_shader_objects detection\n");
|
fprintf(stderr, "Override GL_ARB_separate_shader_objects detection\n");
|
||||||
}
|
}
|
||||||
|
if (theApp.GetConfig("ovveride_GL_ARB_copy_image", -1) != -1) {
|
||||||
|
// Same extension so override both
|
||||||
|
found_GL_ARB_copy_image = !!theApp.GetConfig("override_GL_ARB_copy_image", -1);
|
||||||
|
found_GL_NV_copy_image = !!theApp.GetConfig("override_GL_ARB_copy_image", -1);
|
||||||
|
fprintf(stderr, "Override GL_ARB_copy_image detection\n");
|
||||||
|
fprintf(stderr, "Override GL_NV_copy_image detection\n");
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,4 +133,5 @@ namespace GLLoader {
|
||||||
extern bool found_GL_NV_copy_image;
|
extern bool found_GL_NV_copy_image;
|
||||||
extern bool found_geometry_shader;
|
extern bool found_geometry_shader;
|
||||||
extern bool fglrx_buggy_driver;
|
extern bool fglrx_buggy_driver;
|
||||||
|
extern bool found_only_gl30;
|
||||||
}
|
}
|
||||||
|
|
|
@ -181,11 +181,7 @@ bool GSDeviceOGL::Create(GSWnd* wnd)
|
||||||
if (m_window == NULL) {
|
if (m_window == NULL) {
|
||||||
GLLoader::init_gl_function();
|
GLLoader::init_gl_function();
|
||||||
|
|
||||||
#ifdef OGL_FREE_DRIVER
|
|
||||||
if (!GLLoader::check_gl_version(3, 0)) return false;
|
if (!GLLoader::check_gl_version(3, 0)) return false;
|
||||||
#else
|
|
||||||
if (!GLLoader::check_gl_version(3, 3)) return false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!GLLoader::check_gl_supported_extension()) return false;
|
if (!GLLoader::check_gl_supported_extension()) return false;
|
||||||
}
|
}
|
||||||
|
@ -884,7 +880,17 @@ void GSDeviceOGL::CopyRect(GSTexture* st, GSTexture* dt, const GSVector4i& r)
|
||||||
r.width(), r.height(), 1);
|
r.width(), r.height(), 1);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
// FIXME fallback for open source driver
|
|
||||||
|
GSTextureOGL* st_ogl = (GSTextureOGL*) st;
|
||||||
|
GSTextureOGL* dt_ogl = (GSTextureOGL*) dt;
|
||||||
|
|
||||||
|
gl_BindFramebuffer(GL_READ_FRAMEBUFFER, m_fbo_read);
|
||||||
|
|
||||||
|
st_ogl->AttachRead(GL_COLOR_ATTACHMENT0);
|
||||||
|
dt_ogl->EnableUnit(0);
|
||||||
|
glCopyTexSubImage2D(dt_ogl->GetTarget(), 0, r.x, r.y, r.x, r.y, r.width(), r.height());
|
||||||
|
|
||||||
|
gl_BindFramebuffer(GL_READ_FRAMEBUFFER, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -1346,11 +1352,12 @@ void GSDeviceOGL::CompileShaderFromSource(const std::string& glsl_file, const st
|
||||||
// Build a header string
|
// Build a header string
|
||||||
// *****************************************************
|
// *****************************************************
|
||||||
// First select the version (must be the first line so we need to generate it
|
// First select the version (must be the first line so we need to generate it
|
||||||
#ifdef OGL_FREE_DRIVER
|
std::string version;
|
||||||
std::string version = "#version 130\n";
|
if (GLLoader::found_only_gl30) {
|
||||||
#else
|
version = "#version 130\n";
|
||||||
std::string version = "#version 330\n";
|
} else {
|
||||||
#endif
|
version = "#version 330\n";
|
||||||
|
}
|
||||||
if (GLLoader::found_GL_ARB_shading_language_420pack) {
|
if (GLLoader::found_GL_ARB_shading_language_420pack) {
|
||||||
version += "#extension GL_ARB_shading_language_420pack: require\n";
|
version += "#extension GL_ARB_shading_language_420pack: require\n";
|
||||||
} else {
|
} else {
|
||||||
|
@ -1363,14 +1370,13 @@ void GSDeviceOGL::CompileShaderFromSource(const std::string& glsl_file, const st
|
||||||
// version += "#define NO_STRUCT 1\n";
|
// version += "#define NO_STRUCT 1\n";
|
||||||
//}
|
//}
|
||||||
} else {
|
} else {
|
||||||
#ifdef OGL_FREE_DRIVER
|
if (GLLoader::found_only_gl30)
|
||||||
version += "#define DISABLE_SSO\n";
|
version += "#define DISABLE_SSO\n";
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#ifdef OGL_FREE_DRIVER
|
if (GLLoader::found_only_gl30) {
|
||||||
version += "#extension GL_ARB_explicit_attrib_location : require\n";
|
version += "#extension GL_ARB_explicit_attrib_location : require\n";
|
||||||
version += "#extension GL_ARB_uniform_buffer_object : require\n";
|
version += "#extension GL_ARB_uniform_buffer_object : require\n";
|
||||||
#endif
|
}
|
||||||
|
|
||||||
// Allow to puts several shader in 1 files
|
// Allow to puts several shader in 1 files
|
||||||
std::string shader_type;
|
std::string shader_type;
|
||||||
|
|
|
@ -149,6 +149,12 @@ void GSTextureOGL::Attach(GLenum attachment)
|
||||||
//fprintf(stderr, "FB status %x\n", gl_CheckFramebufferStatus(GL_FRAMEBUFFER));
|
//fprintf(stderr, "FB status %x\n", gl_CheckFramebufferStatus(GL_FRAMEBUFFER));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GSTextureOGL::AttachRead(GLenum attachment)
|
||||||
|
{
|
||||||
|
gl_FramebufferTexture2D(GL_READ_FRAMEBUFFER, attachment, m_texture_target, m_texture_id, 0);
|
||||||
|
glReadBuffer(attachment);
|
||||||
|
}
|
||||||
|
|
||||||
bool GSTextureOGL::Update(const GSVector4i& r, const void* data, int pitch)
|
bool GSTextureOGL::Update(const GSVector4i& r, const void* data, int pitch)
|
||||||
{
|
{
|
||||||
if (m_type == GSTexture::DepthStencil || m_type == GSTexture::Offscreen) ASSERT(0);
|
if (m_type == GSTexture::DepthStencil || m_type == GSTexture::Offscreen) ASSERT(0);
|
||||||
|
|
|
@ -44,6 +44,7 @@ class GSTextureOGL : public GSTexture
|
||||||
|
|
||||||
void EnableUnit(uint32 unit);
|
void EnableUnit(uint32 unit);
|
||||||
void Attach(GLenum attachment);
|
void Attach(GLenum attachment);
|
||||||
|
void AttachRead(GLenum attachment);
|
||||||
|
|
||||||
bool IsBackbuffer() { return (m_type == GSTexture::Backbuffer); }
|
bool IsBackbuffer() { return (m_type == GSTexture::Backbuffer); }
|
||||||
bool IsDss() { return (m_type == GSTexture::DepthStencil); }
|
bool IsDss() { return (m_type == GSTexture::DepthStencil); }
|
||||||
|
|
|
@ -41,6 +41,5 @@
|
||||||
#define ENABLE_OGL_DEBUG // Create a debug context and check opengl command status. Allow also to dump various textures/states.
|
#define ENABLE_OGL_DEBUG // Create a debug context and check opengl command status. Allow also to dump various textures/states.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef EGL_API
|
// Allow to create only a 3.0 context for opensource driver
|
||||||
#define OGL_FREE_DRIVER
|
//#define OGL_FREE_DRIVER
|
||||||
#endif
|
|
||||||
|
|
Loading…
Reference in New Issue