Skip to content

Commit

Permalink
GSdx: only enable AMD hack for AMD GPU. Remove the older geometry sha…
Browse files Browse the repository at this point in the history
…der 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
  • Loading branch information
gregory.hainaut committed Oct 28, 2012
1 parent 059346b commit a9020c6
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 38 deletions.
2 changes: 0 additions & 2 deletions plugins/GSdx/CMakeLists.txt
Expand Up @@ -20,8 +20,6 @@ set(CommonFlags
-std=c++0x
-fno-strict-aliasing
#-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
Expand Down
36 changes: 17 additions & 19 deletions plugins/GSdx/GSDeviceOGL.cpp
Expand Up @@ -39,6 +39,7 @@ GSDeviceOGL::GSDeviceOGL()
, m_pipeline(0)
, m_fbo(0)
, m_fbo_read(0)
, m_AMD_gpu(false)
, m_enable_shader_AMD_hack(false)
, m_vb_sr(NULL)
, m_srv_changed(false)
Expand Down Expand Up @@ -148,8 +149,10 @@ bool GSDeviceOGL::Create(GSWnd* wnd)
{
if (m_window == NULL) {
// 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.
// 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 :
// 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.
// 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 ...
glewExperimental=true;
const int glew_ok = glewInit();
Expand All @@ -168,7 +171,10 @@ bool GSDeviceOGL::Create(GSWnd* wnd)
const GLubyte* s;
s = glGetString(GL_VERSION);
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;
while (s[dot] != '\0' && s[dot] != '.') dot++;
Expand Down Expand Up @@ -379,7 +385,9 @@ bool GSDeviceOGL::Create(GSWnd* wnd)
// ****************************************************************
// HW renderer shader
// ****************************************************************
m_enable_shader_AMD_hack = true; // ....
if (m_AMD_gpu) {
m_enable_shader_AMD_hack = true; // ....
}
CreateTextureFX();

// ****************************************************************
Expand Down Expand Up @@ -779,11 +787,8 @@ void GSDeviceOGL::CopyRect(GSTexture* st, GSTexture* dt, const GSVector4i& r)
return;
}

// GL_NV_copy_image seem like the good extension but not supported on AMD...
// Maybe opengl 4.3 !
// FIXME: the extension was integrated in opengl 4.3 (now we need driver that support OGL4.3)
// 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(
// uint srcName, enum srcTarget, int srcLevel, int srcX, int srcY, int srcZ,
// uint dstName, enum dstTarget, int dstLevel, int dstX, int dstY, int dstZ,
Expand Down Expand Up @@ -880,11 +885,7 @@ void GSDeviceOGL::StretchRect(GSTexture* st, const GSVector4& sr, GSTexture* dt,
// gs
// ************************************

#ifdef AMD_DRIVER_WORKAROUND
GSSetShader(m_convert.gs);
#else
GSSetShader(0);
#endif

// ************************************
// ps
Expand Down Expand Up @@ -992,12 +993,7 @@ void GSDeviceOGL::SetupDATE(GSTexture* rt, GSTexture* ds, const GSVertexPT1* ver

// gs

#ifdef AMD_DRIVER_WORKAROUND
GSSetShader(m_convert.gs);
#else
GSSetShader(0);
#endif


// ps

Expand Down Expand Up @@ -1360,8 +1356,10 @@ void GSDeviceOGL::CompileShaderFromSource(const std::string& glsl_file, const st
header_str[header.size()] = '\0';

// ... See below to test that index is correctly set by driver
//*program = glCreateShaderProgramv(type, 2, sources_array);
*program = glCreateShaderProgramv_AMD_BUG_WORKAROUND(type, 2, sources_array);
if (m_AMD_gpu)
*program = glCreateShaderProgramv_AMD_BUG_WORKAROUND(type, 2, sources_array);
else
*program = glCreateShaderProgramv(type, 2, sources_array);

// DEBUG AMD failure...
// GLint index = -1;
Expand Down
1 change: 1 addition & 0 deletions plugins/GSdx/GSDeviceOGL.h
Expand Up @@ -486,6 +486,7 @@ class GSDeviceOGL : public GSDevice
GSVertexBufferStateOGL* m_vb_sr; // vb_state for StretchRect

bool m_enable_shader_AMD_hack;
bool m_AMD_gpu;

struct {
GLuint ps[2]; // program object
Expand Down
4 changes: 0 additions & 4 deletions plugins/GSdx/GSTextureFXOGL.cpp
Expand Up @@ -107,11 +107,7 @@ void GSDeviceOGL::SetupGS(GSSelector sel)
// Static
// *************************************************************
GLuint gs = 0;
#ifdef AMD_DRIVER_WORKAROUND
if (true)
#else
if(sel.prim > 0 && (sel.iip == 0 || sel.prim == 3))
#endif
{
auto i = m_gs.find(sel);

Expand Down
24 changes: 15 additions & 9 deletions plugins/zzogl-pg/opengl/GLWinX11.cpp
Expand Up @@ -121,7 +121,7 @@ bool GLWindow::ReleaseContext()
if (glxContext)
{
if (!glXMakeCurrent(NativeDisplay, None, NULL)) {
ZZLog::Error_Log("Could not release drawing context.");
ZZLog::Error_Log("GLX: Could not release drawing context.");
status = false;
}

Expand Down Expand Up @@ -197,8 +197,8 @@ void GLWindow::PrintProtocolVersion()
ZZLog::Error_Log("glX-Version %d.%d with Indirect Rendering !!! It will be slow", glxMajorVersion, glxMinorVersion);
#endif
#ifdef EGL_API
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: %s : %s", eglQueryString(eglDisplay, EGL_VENDOR) , eglQueryString(eglDisplay, EGL_VERSION) );
ZZLog::Error_Log("EGL: extensions supported: %s", eglQueryString(eglDisplay, EGL_EXTENSIONS));
#endif
}

Expand Down Expand Up @@ -251,7 +251,10 @@ bool GLWindow::CreateContextGL(int major, int minor)
PFNGLXCHOOSEFBCONFIGPROC glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC)GetProcAddress("glXChooseFBConfig");
int fbcount = 0;
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");
if (!glXCreateContextAttribsARB) return false;
Expand All @@ -272,7 +275,10 @@ bool GLWindow::CreateContextGL(int major, int minor)
};

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);

Expand Down Expand Up @@ -335,21 +341,21 @@ bool GLWindow::CreateContextGL(int major, int minor)

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;
}

eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, NativeWindow, NULL);
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;
}

eglContext = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, contextAttribs );
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());
return EGL_FALSE;
}
Expand Down Expand Up @@ -438,7 +444,7 @@ void GLWindow::InitVsync(bool extension)
swapinterval(0);
vsync_supported = true;
} 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),");
}
}

Expand Down
28 changes: 24 additions & 4 deletions plugins/zzogl-pg/opengl/linux_replay.cpp
Expand Up @@ -35,10 +35,30 @@ void help()

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]);
}

0 comments on commit a9020c6

Please sign in to comment.