mirror of https://github.com/PCSX2/pcsx2.git
GSdx: only enable AMD hack for AMD GPU. Remove the older geometry shader hack fixed since 6 monthes
ZZogl: support xdg for the replayer git-svn-id: http://pcsx2.googlecode.com/svn/trunk@5441 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
059346b5f2
commit
a9020c6065
|
@ -20,8 +20,6 @@ set(CommonFlags
|
||||||
-std=c++0x
|
-std=c++0x
|
||||||
-fno-strict-aliasing
|
-fno-strict-aliasing
|
||||||
#-DOGL_DEBUG # FIXME remove me when code is ready
|
#-DOGL_DEBUG # FIXME remove me when code is ready
|
||||||
# Unload of Geometry shader was fixed in Cat 12.3 (ie OpenGL version string: 4.2.11554)
|
|
||||||
#-DAMD_DRIVER_WORKAROUND
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set(OptimizationFlags
|
set(OptimizationFlags
|
||||||
|
|
|
@ -39,6 +39,7 @@ GSDeviceOGL::GSDeviceOGL()
|
||||||
, m_pipeline(0)
|
, m_pipeline(0)
|
||||||
, m_fbo(0)
|
, m_fbo(0)
|
||||||
, m_fbo_read(0)
|
, m_fbo_read(0)
|
||||||
|
, m_AMD_gpu(false)
|
||||||
, m_enable_shader_AMD_hack(false)
|
, m_enable_shader_AMD_hack(false)
|
||||||
, m_vb_sr(NULL)
|
, m_vb_sr(NULL)
|
||||||
, m_srv_changed(false)
|
, m_srv_changed(false)
|
||||||
|
@ -148,8 +149,10 @@ bool GSDeviceOGL::Create(GSWnd* wnd)
|
||||||
{
|
{
|
||||||
if (m_window == NULL) {
|
if (m_window == NULL) {
|
||||||
// FIXME......
|
// FIXME......
|
||||||
// GLEW's problem is that it calls glGetString(GL_EXTENSIONS) which causes GL_INVALID_ENUM on GL 3.2 forward compatible context as soon as glewInit() is called. It also doesn't fetch the function pointers. The solution is for GLEW to use glGetStringi instead.
|
// GLEW's problem is that it calls glGetString(GL_EXTENSIONS) which causes GL_INVALID_ENUM
|
||||||
// The current version of GLEW is 1.7.0 but they still haven't corrected it. The only fix is to use glewExperimental for now :
|
// on GL 3.2 forward compatible context as soon as glewInit() is called. It also doesn't fetch
|
||||||
|
// the function pointers. The solution is for GLEW to use glGetStringi instead.
|
||||||
|
// The current version of GLEW is 1.9.0 but they still haven't corrected it. The only fix is to use glewExperimental for now :
|
||||||
//NOTE: I'm not sure experimental work on 1.6 ...
|
//NOTE: I'm not sure experimental work on 1.6 ...
|
||||||
glewExperimental=true;
|
glewExperimental=true;
|
||||||
const int glew_ok = glewInit();
|
const int glew_ok = glewInit();
|
||||||
|
@ -168,7 +171,10 @@ bool GSDeviceOGL::Create(GSWnd* wnd)
|
||||||
const GLubyte* s;
|
const GLubyte* s;
|
||||||
s = glGetString(GL_VERSION);
|
s = glGetString(GL_VERSION);
|
||||||
if (s == NULL) return false;
|
if (s == NULL) return false;
|
||||||
fprintf(stderr, "Supported Opengl version: %s\n", s);
|
fprintf(stderr, "Supported Opengl version: %s on GPU: %s. Vendor: %s\n", s, glGetString(GL_RENDERER), glGetString(GL_VENDOR));
|
||||||
|
if ( strcmp((const char*)glGetString(GL_VENDOR), "ATI Technologies Inc.") == 0 ) {
|
||||||
|
m_AMD_gpu = true;
|
||||||
|
}
|
||||||
|
|
||||||
GLuint dot = 0;
|
GLuint dot = 0;
|
||||||
while (s[dot] != '\0' && s[dot] != '.') dot++;
|
while (s[dot] != '\0' && s[dot] != '.') dot++;
|
||||||
|
@ -379,7 +385,9 @@ bool GSDeviceOGL::Create(GSWnd* wnd)
|
||||||
// ****************************************************************
|
// ****************************************************************
|
||||||
// HW renderer shader
|
// HW renderer shader
|
||||||
// ****************************************************************
|
// ****************************************************************
|
||||||
m_enable_shader_AMD_hack = true; // ....
|
if (m_AMD_gpu) {
|
||||||
|
m_enable_shader_AMD_hack = true; // ....
|
||||||
|
}
|
||||||
CreateTextureFX();
|
CreateTextureFX();
|
||||||
|
|
||||||
// ****************************************************************
|
// ****************************************************************
|
||||||
|
@ -779,11 +787,8 @@ void GSDeviceOGL::CopyRect(GSTexture* st, GSTexture* dt, const GSVector4i& r)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// GL_NV_copy_image seem like the good extension but not supported on AMD...
|
// FIXME: the extension was integrated in opengl 4.3 (now we need driver that support OGL4.3)
|
||||||
// Maybe opengl 4.3 !
|
|
||||||
// FIXME check those function work as expected
|
// FIXME check those function work as expected
|
||||||
// FIXME: it is an NVIDIA extension. Hopefully lastest AMD driver support it too.
|
|
||||||
// An EXT extensions might be release later.
|
|
||||||
// void CopyImageSubDataNV(
|
// void CopyImageSubDataNV(
|
||||||
// uint srcName, enum srcTarget, int srcLevel, int srcX, int srcY, int srcZ,
|
// uint srcName, enum srcTarget, int srcLevel, int srcX, int srcY, int srcZ,
|
||||||
// uint dstName, enum dstTarget, int dstLevel, int dstX, int dstY, int dstZ,
|
// uint dstName, enum dstTarget, int dstLevel, int dstX, int dstY, int dstZ,
|
||||||
|
@ -880,11 +885,7 @@ void GSDeviceOGL::StretchRect(GSTexture* st, const GSVector4& sr, GSTexture* dt,
|
||||||
// gs
|
// gs
|
||||||
// ************************************
|
// ************************************
|
||||||
|
|
||||||
#ifdef AMD_DRIVER_WORKAROUND
|
|
||||||
GSSetShader(m_convert.gs);
|
|
||||||
#else
|
|
||||||
GSSetShader(0);
|
GSSetShader(0);
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************
|
// ************************************
|
||||||
// ps
|
// ps
|
||||||
|
@ -992,12 +993,7 @@ void GSDeviceOGL::SetupDATE(GSTexture* rt, GSTexture* ds, const GSVertexPT1* ver
|
||||||
|
|
||||||
// gs
|
// gs
|
||||||
|
|
||||||
#ifdef AMD_DRIVER_WORKAROUND
|
|
||||||
GSSetShader(m_convert.gs);
|
|
||||||
#else
|
|
||||||
GSSetShader(0);
|
GSSetShader(0);
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// ps
|
// ps
|
||||||
|
|
||||||
|
@ -1360,8 +1356,10 @@ void GSDeviceOGL::CompileShaderFromSource(const std::string& glsl_file, const st
|
||||||
header_str[header.size()] = '\0';
|
header_str[header.size()] = '\0';
|
||||||
|
|
||||||
// ... See below to test that index is correctly set by driver
|
// ... See below to test that index is correctly set by driver
|
||||||
//*program = glCreateShaderProgramv(type, 2, sources_array);
|
if (m_AMD_gpu)
|
||||||
*program = glCreateShaderProgramv_AMD_BUG_WORKAROUND(type, 2, sources_array);
|
*program = glCreateShaderProgramv_AMD_BUG_WORKAROUND(type, 2, sources_array);
|
||||||
|
else
|
||||||
|
*program = glCreateShaderProgramv(type, 2, sources_array);
|
||||||
|
|
||||||
// DEBUG AMD failure...
|
// DEBUG AMD failure...
|
||||||
// GLint index = -1;
|
// GLint index = -1;
|
||||||
|
|
|
@ -486,6 +486,7 @@ class GSDeviceOGL : public GSDevice
|
||||||
GSVertexBufferStateOGL* m_vb_sr; // vb_state for StretchRect
|
GSVertexBufferStateOGL* m_vb_sr; // vb_state for StretchRect
|
||||||
|
|
||||||
bool m_enable_shader_AMD_hack;
|
bool m_enable_shader_AMD_hack;
|
||||||
|
bool m_AMD_gpu;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
GLuint ps[2]; // program object
|
GLuint ps[2]; // program object
|
||||||
|
|
|
@ -107,11 +107,7 @@ void GSDeviceOGL::SetupGS(GSSelector sel)
|
||||||
// Static
|
// Static
|
||||||
// *************************************************************
|
// *************************************************************
|
||||||
GLuint gs = 0;
|
GLuint gs = 0;
|
||||||
#ifdef AMD_DRIVER_WORKAROUND
|
|
||||||
if (true)
|
|
||||||
#else
|
|
||||||
if(sel.prim > 0 && (sel.iip == 0 || sel.prim == 3))
|
if(sel.prim > 0 && (sel.iip == 0 || sel.prim == 3))
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
auto i = m_gs.find(sel);
|
auto i = m_gs.find(sel);
|
||||||
|
|
||||||
|
|
|
@ -121,7 +121,7 @@ bool GLWindow::ReleaseContext()
|
||||||
if (glxContext)
|
if (glxContext)
|
||||||
{
|
{
|
||||||
if (!glXMakeCurrent(NativeDisplay, None, NULL)) {
|
if (!glXMakeCurrent(NativeDisplay, None, NULL)) {
|
||||||
ZZLog::Error_Log("Could not release drawing context.");
|
ZZLog::Error_Log("GLX: Could not release drawing context.");
|
||||||
status = false;
|
status = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,8 +197,8 @@ void GLWindow::PrintProtocolVersion()
|
||||||
ZZLog::Error_Log("glX-Version %d.%d with Indirect Rendering !!! It will be slow", glxMajorVersion, glxMinorVersion);
|
ZZLog::Error_Log("glX-Version %d.%d with Indirect Rendering !!! It will be slow", glxMajorVersion, glxMinorVersion);
|
||||||
#endif
|
#endif
|
||||||
#ifdef EGL_API
|
#ifdef EGL_API
|
||||||
ZZLog::Error_Log("Egl: %s : %s", eglQueryString(eglDisplay, EGL_VENDOR) , eglQueryString(eglDisplay, EGL_VERSION) );
|
ZZLog::Error_Log("EGL: %s : %s", eglQueryString(eglDisplay, EGL_VENDOR) , eglQueryString(eglDisplay, EGL_VERSION) );
|
||||||
ZZLog::Error_Log("Egl: extensions supported: %s", eglQueryString(eglDisplay, EGL_EXTENSIONS));
|
ZZLog::Error_Log("EGL: extensions supported: %s", eglQueryString(eglDisplay, EGL_EXTENSIONS));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,7 +251,10 @@ bool GLWindow::CreateContextGL(int major, int minor)
|
||||||
PFNGLXCHOOSEFBCONFIGPROC glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC)GetProcAddress("glXChooseFBConfig");
|
PFNGLXCHOOSEFBCONFIGPROC glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC)GetProcAddress("glXChooseFBConfig");
|
||||||
int fbcount = 0;
|
int fbcount = 0;
|
||||||
GLXFBConfig *fbc = glXChooseFBConfig(NativeDisplay, DefaultScreen(NativeDisplay), attrListDbl, &fbcount);
|
GLXFBConfig *fbc = glXChooseFBConfig(NativeDisplay, DefaultScreen(NativeDisplay), attrListDbl, &fbcount);
|
||||||
if (!fbc || fbcount < 1) return false;
|
if (!fbc || fbcount < 1) {
|
||||||
|
ZZLog::Error_Log("GLX: failed to find a framebuffer");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)GetProcAddress("glXCreateContextAttribsARB");
|
PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)GetProcAddress("glXCreateContextAttribsARB");
|
||||||
if (!glXCreateContextAttribsARB) return false;
|
if (!glXCreateContextAttribsARB) return false;
|
||||||
|
@ -272,7 +275,10 @@ bool GLWindow::CreateContextGL(int major, int minor)
|
||||||
};
|
};
|
||||||
|
|
||||||
glxContext = glXCreateContextAttribsARB(NativeDisplay, fbc[0], 0, true, context_attribs);
|
glxContext = glXCreateContextAttribsARB(NativeDisplay, fbc[0], 0, true, context_attribs);
|
||||||
if (!glxContext) return false;
|
if (!glxContext) {
|
||||||
|
ZZLog::Error_Log("GLX: failed to create an opengl context");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
XSync( NativeDisplay, false);
|
XSync( NativeDisplay, false);
|
||||||
|
|
||||||
|
@ -335,21 +341,21 @@ bool GLWindow::CreateContextGL(int major, int minor)
|
||||||
|
|
||||||
if ( !eglChooseConfig(eglDisplay, attrList, &eglConfig, 1, &numConfigs) )
|
if ( !eglChooseConfig(eglDisplay, attrList, &eglConfig, 1, &numConfigs) )
|
||||||
{
|
{
|
||||||
ZZLog::Error_Log("Failed to get a frame buffer config!");
|
ZZLog::Error_Log("EGL: Failed to get a frame buffer config!");
|
||||||
return EGL_FALSE;
|
return EGL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, NativeWindow, NULL);
|
eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, NativeWindow, NULL);
|
||||||
if ( eglSurface == EGL_NO_SURFACE )
|
if ( eglSurface == EGL_NO_SURFACE )
|
||||||
{
|
{
|
||||||
ZZLog::Error_Log("Failed to get a window surface");
|
ZZLog::Error_Log("EGL: Failed to get a window surface");
|
||||||
return EGL_FALSE;
|
return EGL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
eglContext = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, contextAttribs );
|
eglContext = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, contextAttribs );
|
||||||
if ( eglContext == EGL_NO_CONTEXT )
|
if ( eglContext == EGL_NO_CONTEXT )
|
||||||
{
|
{
|
||||||
ZZLog::Error_Log("Failed to create the context");
|
ZZLog::Error_Log("EGL: Failed to create the context");
|
||||||
ZZLog::Error_Log("EGL STATUS: %x", eglGetError());
|
ZZLog::Error_Log("EGL STATUS: %x", eglGetError());
|
||||||
return EGL_FALSE;
|
return EGL_FALSE;
|
||||||
}
|
}
|
||||||
|
@ -438,7 +444,7 @@ void GLWindow::InitVsync(bool extension)
|
||||||
swapinterval(0);
|
swapinterval(0);
|
||||||
vsync_supported = true;
|
vsync_supported = true;
|
||||||
} else {
|
} else {
|
||||||
ZZLog::Error_Log("No support for SwapInterval (framerate clamped to monitor refresh rate),");
|
ZZLog::Error_Log("GLX: No support for SwapInterval (framerate clamped to monitor refresh rate),");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,10 +35,30 @@ void help()
|
||||||
|
|
||||||
int main ( int argc, char *argv[] )
|
int main ( int argc, char *argv[] )
|
||||||
{
|
{
|
||||||
if ( argc < 2 ) help();
|
GSsetLogDir("/tmp");
|
||||||
|
if ( argc == 3) {
|
||||||
|
GSsetSettingsDir(argv[1]);
|
||||||
|
GSReplay(argv[2]);
|
||||||
|
} else if ( argc == 2) {
|
||||||
|
#ifdef XDG_STD
|
||||||
|
std::string home("HOME");
|
||||||
|
char * val = getenv( home.c_str() );
|
||||||
|
if (val == NULL) {
|
||||||
|
fprintf(stderr, "Failed to get the home dir\n");
|
||||||
|
help();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string ini_dir(val);
|
||||||
|
ini_dir += "/.config/pcsx2/inis";
|
||||||
|
|
||||||
|
GSsetSettingsDir(ini_dir.c_str());
|
||||||
|
GSReplay(argv[1]);
|
||||||
|
#else
|
||||||
|
fprintf(stderr, "default ini dir only supported on XDG\n");
|
||||||
|
help();
|
||||||
|
#endif
|
||||||
|
} else
|
||||||
|
help();
|
||||||
|
|
||||||
GSsetSettingsDir(argv[1]);
|
|
||||||
GSsetLogDir("/tmp");
|
|
||||||
GSReplay(argv[2]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue