gsdx-ogl: LINUX ONLY

* Keep the state of the draw buffer (save few opengl call)
* AMD fix the shader unloading (12.2 and above). So disable the workaround


git-svn-id: http://pcsx2.googlecode.com/svn/branches/gsdx-ogl@5137 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
gregory.hainaut 2012-03-30 19:02:37 +00:00
parent d6e7ea4a4e
commit 16a1fded96
6 changed files with 82 additions and 33 deletions

View File

@ -19,7 +19,8 @@ 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
-DAMD_DRIVER_WORKAROUND # Unload of Geometry shader was fixed in Cat 12.3 (ie OpenGL version string: 4.2.11554)
#-DAMD_DRIVER_WORKAROUND
) )
set(OptimizationFlags set(OptimizationFlags

View File

@ -1269,6 +1269,13 @@ EXPORT_C GSReplay(char* lpszCmdLine, int renderer)
::SetPriorityClass(::GetCurrentProcess(), HIGH_PRIORITY_CLASS); ::SetPriorityClass(::GetCurrentProcess(), HIGH_PRIORITY_CLASS);
#endif #endif
// Allow to easyly switch between SW/HW renderer
renderer = theApp.GetConfig("renderer", 12);
if (renderer != 12 && renderer != 13)
{
fprintf(stderr, "wrong renderer selected %d\n", renderer);
return;
}
if(FILE* fp = fopen(lpszCmdLine, "rb")) if(FILE* fp = fopen(lpszCmdLine, "rb"))
{ {

View File

@ -488,7 +488,9 @@ void GSDeviceOGL::Flip()
{ {
// FIXME: disable it when code is working // FIXME: disable it when code is working
CheckDebugLog(); CheckDebugLog();
m_wnd->Flip(); m_wnd->Flip();
#ifdef PRINT_FRAME_NUMBER #ifdef PRINT_FRAME_NUMBER
fprintf(stderr, "Draw %d (Frame %d)\n", g_draw_count, g_frame_count); fprintf(stderr, "Draw %d (Frame %d)\n", g_draw_count, g_frame_count);
#endif #endif
@ -498,6 +500,33 @@ void GSDeviceOGL::Flip()
#endif #endif
} }
void GSDeviceOGL::DebugBB()
{
bool dump_me = false;
uint32 start = theApp.GetConfig("debug_ogl_dump", 0);
uint32 length = theApp.GetConfig("debug_ogl_dump_length", 5);
if ( (start != 0 && g_frame_count >= start && g_frame_count < (start + length)) ) dump_me = true;
if (!dump_me) return;
GLuint fbo_old = m_state.fbo;
OMSetFBO(m_fbo);
GSVector2i size = m_backbuffer->GetSize();
GSTexture* rt = CreateRenderTarget(size.x, size.y, false);
static_cast<GSTextureOGL*>(rt)->Attach(GL_COLOR_ATTACHMENT0);
glBlitFramebuffer(0, 0, size.x, size.y,
0, 0, size.x, size.y,
GL_COLOR_BUFFER_BIT, GL_NEAREST);
rt->Save(format("/tmp/out_f%d__d%d__bb.bmp", g_frame_count, g_draw_count));
delete rt;
OMSetFBO(fbo_old);
}
void GSDeviceOGL::DebugInput() void GSDeviceOGL::DebugInput()
{ {
bool dump_me = false; bool dump_me = false;
@ -505,21 +534,21 @@ void GSDeviceOGL::DebugInput()
uint32 length = theApp.GetConfig("debug_ogl_dump_length", 5); uint32 length = theApp.GetConfig("debug_ogl_dump_length", 5);
if ( (start != 0 && g_frame_count >= start && g_frame_count < (start + length)) ) dump_me = true; if ( (start != 0 && g_frame_count >= start && g_frame_count < (start + length)) ) dump_me = true;
if ( dump_me ) { if (!dump_me) return;
for (auto i = 0 ; i < 3 ; i++) {
if (m_state.ps_srv[i] != NULL) {
m_state.ps_srv[i]->Save(format("/tmp/in_f%d__d%d__%d.bmp", g_frame_count, g_draw_count, i));
}
}
//if (m_state.rtv != NULL) m_state.rtv->Save(format("/tmp/target_f%d__d%d__tex.bmp", g_frame_count, g_draw_count));
//if (m_state.dsv != NULL) m_state.dsv->Save(format("/tmp/ds_in_%d.bmp", g_draw_count));
fprintf(stderr, "Draw %d (Frame %d)\n", g_draw_count, g_frame_count); for (auto i = 0 ; i < 3 ; i++) {
fprintf(stderr, "vs: %d ; gs: %d ; ps: %d\n", m_state.vs, m_state.gs, m_state.ps); if (m_state.ps_srv[i] != NULL) {
m_state.vb->debug(); m_state.ps_srv[i]->Save(format("/tmp/in_f%d__d%d__%d.bmp", g_frame_count, g_draw_count, i));
m_state.bs->debug(); }
m_state.dss->debug();
} }
//if (m_state.rtv != NULL) m_state.rtv->Save(format("/tmp/target_f%d__d%d__tex.bmp", g_frame_count, g_draw_count));
//if (m_state.dsv != NULL) m_state.dsv->Save(format("/tmp/ds_in_%d.bmp", g_draw_count));
fprintf(stderr, "Draw %d (Frame %d)\n", g_draw_count, g_frame_count);
fprintf(stderr, "vs: %d ; gs: %d ; ps: %d\n", m_state.vs, m_state.gs, m_state.ps);
m_state.vb->debug();
m_state.bs->debug();
m_state.dss->debug();
} }
void GSDeviceOGL::DebugOutput() void GSDeviceOGL::DebugOutput()
@ -531,17 +560,17 @@ void GSDeviceOGL::DebugOutput()
uint32 length = theApp.GetConfig("debug_ogl_dump_length", 5); uint32 length = theApp.GetConfig("debug_ogl_dump_length", 5);
if ( (start != 0 && g_frame_count >= start && g_frame_count < (start + length)) ) dump_me = true; if ( (start != 0 && g_frame_count >= start && g_frame_count < (start + length)) ) dump_me = true;
if ( dump_me ) { if (!dump_me) return;
if (m_state.rtv == m_backbuffer) {
if (m_state.rtv != NULL) m_state.rtv->Save(format("/tmp/out_f%d__d%d__back.bmp", g_frame_count, g_draw_count));
} else {
if (m_state.rtv != NULL) m_state.rtv->Save(format("/tmp/out_f%d__d%d__tex.bmp", g_frame_count, g_draw_count));
}
//if (m_state.dsv != NULL) m_state.dsv->Save(format("/tmp/ds_out_%d.bmp", g_draw_count));
fprintf(stderr, "\n");
if (m_state.rtv == m_backbuffer) {
m_state.rtv->Save(format("/tmp/out_f%d__d%d__back.bmp", g_frame_count, g_draw_count));
} else {
if (m_state.rtv != NULL) m_state.rtv->Save(format("/tmp/out_f%d__d%d__tex.bmp", g_frame_count, g_draw_count));
} }
//if (m_state.dsv != NULL) m_state.dsv->Save(format("/tmp/ds_out_%d.bmp", g_draw_count));
fprintf(stderr, "\n");
//DebugBB();
} }
void GSDeviceOGL::DrawPrimitive() void GSDeviceOGL::DrawPrimitive()
@ -580,6 +609,7 @@ void GSDeviceOGL::DrawIndexedPrimitive(int offset, int count)
#endif #endif
m_state.vb->DrawIndexedPrimitive(offset, count); m_state.vb->DrawIndexedPrimitive(offset, count);
#ifdef OGL_DEBUG #ifdef OGL_DEBUG
DebugOutput(); DebugOutput();
g_draw_count++; g_draw_count++;
@ -601,7 +631,6 @@ void GSDeviceOGL::ClearRenderTarget(GSTexture* t, const GSVector4& c)
// FIXME1 I need to clarify this FBO attachment stuff // FIXME1 I need to clarify this FBO attachment stuff
// I would like to avoid FBO for a basic clean operation // I would like to avoid FBO for a basic clean operation
OMSetFBO(m_fbo); OMSetFBO(m_fbo);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
static_cast<GSTextureOGL*>(t)->Attach(GL_COLOR_ATTACHMENT0); static_cast<GSTextureOGL*>(t)->Attach(GL_COLOR_ATTACHMENT0);
glClearBufferfv(GL_COLOR, 0, c.v); glClearBufferfv(GL_COLOR, 0, c.v);
} }
@ -1088,7 +1117,7 @@ void GSDeviceOGL::PSSetShader(GLuint ps)
} }
} }
void GSDeviceOGL::OMSetFBO(GLuint fbo) void GSDeviceOGL::OMSetFBO(GLuint fbo, GLenum buffer)
{ {
if (m_state.fbo != fbo) { if (m_state.fbo != fbo) {
m_state.fbo = fbo; m_state.fbo = fbo;
@ -1096,6 +1125,12 @@ void GSDeviceOGL::OMSetFBO(GLuint fbo)
// FIXME DEBUG // FIXME DEBUG
//if (fbo) fprintf(stderr, "FB status %x\n", glCheckFramebufferStatus(GL_FRAMEBUFFER)); //if (fbo) fprintf(stderr, "FB status %x\n", glCheckFramebufferStatus(GL_FRAMEBUFFER));
} }
if (m_state.draw != buffer) {
m_state.draw = buffer;
glDrawBuffer(buffer);
}
} }
void GSDeviceOGL::OMSetDepthStencilState(GSDepthStencilOGL* dss, uint8 sref) void GSDeviceOGL::OMSetDepthStencilState(GSDepthStencilOGL* dss, uint8 sref)
@ -1135,20 +1170,19 @@ void GSDeviceOGL::OMSetRenderTargets(GSTexture* rt, GSTexture* ds, const GSVecto
m_state.dsv = static_cast<GSTextureOGL*>(ds); m_state.dsv = static_cast<GSTextureOGL*>(ds);
if (static_cast<GSTextureOGL*>(rt)->IsBackbuffer()) { if (static_cast<GSTextureOGL*>(rt)->IsBackbuffer()) {
assert(ds == NULL); // no depth-stencil without FBO
OMSetFBO(0); OMSetFBO(0);
assert(ds == NULL); // no depth-stencil without FBO
} else { } else {
OMSetFBO(m_fbo);
assert(rt != NULL); // a render target must exists assert(rt != NULL); // a render target must exists
// FIXME DEBUG special case for GL_R16UI // FIXME DEBUG special case for GL_R16UI
if (rt->GetFormat() == GL_R16UI) { if (rt->GetFormat() == GL_R16UI) {
glDrawBuffer(GL_COLOR_ATTACHMENT1); OMSetFBO(m_fbo, GL_COLOR_ATTACHMENT1);
static_cast<GSTextureOGL*>(rt)->Attach(GL_COLOR_ATTACHMENT1); static_cast<GSTextureOGL*>(rt)->Attach(GL_COLOR_ATTACHMENT1);
} else { } else {
glDrawBuffer(GL_COLOR_ATTACHMENT0); OMSetFBO(m_fbo, GL_COLOR_ATTACHMENT0);
static_cast<GSTextureOGL*>(rt)->Attach(GL_COLOR_ATTACHMENT0); static_cast<GSTextureOGL*>(rt)->Attach(GL_COLOR_ATTACHMENT0);
} }

View File

@ -805,6 +805,7 @@ class GSDeviceOGL : public GSDevice
GSTextureOGL* rtv; GSTextureOGL* rtv;
GSTextureOGL* dsv; GSTextureOGL* dsv;
GLuint fbo; GLuint fbo;
+ GLenum draw;
} m_state; } m_state;
bool m_srv_changed; bool m_srv_changed;
@ -840,6 +841,7 @@ class GSDeviceOGL : public GSDevice
static void DebugOutputToFile(unsigned int source, unsigned int type, unsigned int id, unsigned int severity, const char* message); static void DebugOutputToFile(unsigned int source, unsigned int type, unsigned int id, unsigned int severity, const char* message);
void DebugOutput(); void DebugOutput();
void DebugInput(); void DebugInput();
void DebugBB();
bool HasStencil() { return true; } bool HasStencil() { return true; }
bool HasDepth32() { return true; } bool HasDepth32() { return true; }
@ -894,7 +896,7 @@ class GSDeviceOGL : public GSDevice
void PSSetSamplerState(GLuint ss0, GLuint ss1, GLuint ss2 = 0); void PSSetSamplerState(GLuint ss0, GLuint ss1, GLuint ss2 = 0);
void PSSetShader(GLuint ps); void PSSetShader(GLuint ps);
void OMSetFBO(GLuint fbo); void OMSetFBO(GLuint fbo, GLenum buffer = GL_COLOR_ATTACHMENT0);
void OMSetDepthStencilState(GSDepthStencilOGL* dss, uint8 sref); void OMSetDepthStencilState(GSDepthStencilOGL* dss, uint8 sref);
void OMSetBlendState(GSBlendStateOGL* bs, float bf); void OMSetBlendState(GSBlendStateOGL* bs, float bf);
void OMSetRenderTargets(GSTexture* rt, GSTexture* ds, const GSVector4i* scissor = NULL); void OMSetRenderTargets(GSTexture* rt, GSTexture* ds, const GSVector4i* scissor = NULL);

View File

@ -120,6 +120,11 @@ GSTextureOGL::GSTextureOGL(int type, int w, int h, bool msaa, int format, GLuint
// In worst case the HW renderer seems to use 3 texture unit // In worst case the HW renderer seems to use 3 texture unit
// For the moment SW renderer only use 1 so don't bother // For the moment SW renderer only use 1 so don't bother
EnableUnit(0); EnableUnit(0);
// Did we need to setup a default sampler of the texture now?
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
if (m_format == GL_RGBA8) if (m_format == GL_RGBA8)
glTexImage2D(m_texture_target, 0, m_format, m_size.x, m_size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexImage2D(m_texture_target, 0, m_format, m_size.x, m_size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
else if (m_format == GL_R16UI) else if (m_format == GL_R16UI)
@ -144,7 +149,7 @@ GSTextureOGL::~GSTextureOGL()
void GSTextureOGL::Attach(GLenum attachment) void GSTextureOGL::Attach(GLenum attachment)
{ {
//fprintf(stderr, "format %d,%x\n", m_type, m_format); //fprintf(stderr, "format %d,%x\n", m_type, m_format);
glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, m_texture_target, m_texture_id, 0); glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, attachment, m_texture_target, m_texture_id, 0);
// FIXME DEBUG // FIXME DEBUG
//fprintf(stderr, "FB status %x\n", glCheckFramebufferStatus(GL_FRAMEBUFFER)); //fprintf(stderr, "FB status %x\n", glCheckFramebufferStatus(GL_FRAMEBUFFER));
} }

View File

@ -37,5 +37,5 @@ int main ( int argc, char *argv[] )
if ( argc != 3 ) help(); if ( argc != 3 ) help();
GSsetSettingsDir(argv[1]); GSsetSettingsDir(argv[1]);
GSReplay(argv[2], 15); GSReplay(argv[2], 12);
} }