mirror of https://github.com/PCSX2/pcsx2.git
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:
parent
d6e7ea4a4e
commit
16a1fded96
|
@ -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
|
||||||
|
|
|
@ -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"))
|
||||||
{
|
{
|
||||||
|
|
|
@ -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,7 +534,8 @@ 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++) {
|
for (auto i = 0 ; i < 3 ; i++) {
|
||||||
if (m_state.ps_srv[i] != NULL) {
|
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));
|
m_state.ps_srv[i]->Save(format("/tmp/in_f%d__d%d__%d.bmp", g_frame_count, g_draw_count, i));
|
||||||
|
@ -520,7 +550,6 @@ void GSDeviceOGL::DebugInput()
|
||||||
m_state.bs->debug();
|
m_state.bs->debug();
|
||||||
m_state.dss->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 == 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));
|
m_state.rtv->Save(format("/tmp/out_f%d__d%d__back.bmp", g_frame_count, g_draw_count));
|
||||||
} else {
|
} 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.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));
|
//if (m_state.dsv != NULL) m_state.dsv->Save(format("/tmp/ds_out_%d.bmp", g_draw_count));
|
||||||
|
|
||||||
fprintf(stderr, "\n");
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue