gsdx-ogl: LINUX-ONLY

* Enable interlace feature. (note I'm well aware that interlace crashes with SDL)
* remove useless callback debug function
* handle the y axis differently. Move vertex to follow right-hand system (render everything in reverse) then flip the y-axis for the screen rendering


git-svn-id: http://pcsx2.googlecode.com/svn/branches/gsdx-ogl@4987 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
gregory.hainaut 2011-12-11 19:09:08 +00:00
parent be53385e9f
commit fbb224837d
6 changed files with 33 additions and 47 deletions

View File

@ -57,9 +57,9 @@ GSDeviceOGL::GSDeviceOGL()
: m_free_window(false) : m_free_window(false)
, m_window(NULL) , m_window(NULL)
, m_vb(0) , m_vb(0)
, m_pipeline(0)
, m_fbo(0) , m_fbo(0)
, m_sr_vb_offset(0) , m_sr_vb_offset(0)
, m_pipeline(0)
, m_srv_changed(false) , m_srv_changed(false)
, m_ss_changed(false) , m_ss_changed(false)
{ {
@ -164,7 +164,6 @@ bool GSDeviceOGL::Create(GSWnd* wnd)
// FIXME disable it when code is ready // FIXME disable it when code is ready
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB); glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
glDebugMessageCallbackARB(&GSDeviceOGL::DebugCallback, NULL);
m_window = wnd; m_window = wnd;
@ -265,8 +264,6 @@ bool GSDeviceOGL::Create(GSWnd* wnd)
// merge // merge
// **************************************************************** // ****************************************************************
m_merge.cb = new GSUniformBufferOGL(1, sizeof(MergeConstantBuffer)); m_merge.cb = new GSUniformBufferOGL(1, sizeof(MergeConstantBuffer));
//m_merge.cb->index = 1;
//m_merge.cb->byte_size = sizeof(MergeConstantBuffer);
glGenBuffers(1, &m_merge.cb->buffer); glGenBuffers(1, &m_merge.cb->buffer);
glBindBuffer(GL_UNIFORM_BUFFER, m_merge.cb->buffer); glBindBuffer(GL_UNIFORM_BUFFER, m_merge.cb->buffer);
glBufferData(GL_UNIFORM_BUFFER, m_merge.cb->byte_size, NULL, GL_DYNAMIC_DRAW); glBufferData(GL_UNIFORM_BUFFER, m_merge.cb->byte_size, NULL, GL_DYNAMIC_DRAW);
@ -287,8 +284,6 @@ bool GSDeviceOGL::Create(GSWnd* wnd)
// interlace // interlace
// **************************************************************** // ****************************************************************
m_interlace.cb = new GSUniformBufferOGL(2, sizeof(InterlaceConstantBuffer)); m_interlace.cb = new GSUniformBufferOGL(2, sizeof(InterlaceConstantBuffer));
//m_interlace.cb->index = 2;
//m_interlace.cb->byte_size = sizeof(InterlaceConstantBuffer);
glGenBuffers(1, &m_interlace.cb->buffer); glGenBuffers(1, &m_interlace.cb->buffer);
glBindBuffer(GL_UNIFORM_BUFFER, m_interlace.cb->buffer); glBindBuffer(GL_UNIFORM_BUFFER, m_interlace.cb->buffer);
glBufferData(GL_UNIFORM_BUFFER, m_interlace.cb->byte_size, NULL, GL_DYNAMIC_DRAW); glBufferData(GL_UNIFORM_BUFFER, m_interlace.cb->byte_size, NULL, GL_DYNAMIC_DRAW);
@ -694,17 +689,29 @@ void GSDeviceOGL::StretchRect(GSTexture* st, const GSVector4& sr, GSTexture* dt,
// ia // ia
// ************************************ // ************************************
float left = dr.x * 2 / ds.x - 1.0f; float left = dr.x * 2 / ds.x - 1.0f;
float top = 1.0f - dr.y * 2 / ds.y; float top = 1.0f - dr.y * 2 / ds.y;
float right = dr.z * 2 / ds.x - 1.0f; float right = dr.z * 2 / ds.x - 1.0f;
float bottom = 1.0f - dr.w * 2 / ds.y; float bottom = 1.0f - dr.w * 2 / ds.y;
// Flip y axis only when we render in the backbuffer
// By default everything is render in the wrong order (ie dx).
// 1/ consistency between several pass rendering (interlace)
// 2/ in case some GSdx code expect thing in dx order.
// Only flipping the backbuffer is transparent (I hope)...
GSVector4 flip_sr = sr;
if (dt == m_backbuffer) {
flip_sr.y = 1.0f - sr.y;
flip_sr.w = 1.0f - sr.w;
}
GSVertexPT1 vertices[] = GSVertexPT1 vertices[] =
{ {
{GSVector4(left, top, 0.5f, 1.0f), GSVector2(sr.x, sr.y)}, {GSVector4(left, bottom, 0.5f, 1.0f), GSVector2(flip_sr.x, flip_sr.y)},
{GSVector4(right, top, 0.5f, 1.0f), GSVector2(sr.z, sr.y)}, {GSVector4(right, bottom, 0.5f, 1.0f), GSVector2(flip_sr.z, flip_sr.y)},
{GSVector4(left, bottom, 0.5f, 1.0f), GSVector2(sr.x, sr.w)}, {GSVector4(left, top, 0.5f, 1.0f), GSVector2(flip_sr.x, flip_sr.w)},
{GSVector4(right, bottom, 0.5f, 1.0f), GSVector2(sr.z, sr.w)}, {GSVector4(right, top, 0.5f, 1.0f), GSVector2(flip_sr.z, flip_sr.w)},
}; };
IASetVertexArrray(m_convert.va); IASetVertexArrray(m_convert.va);
@ -767,9 +774,7 @@ void GSDeviceOGL::DoMerge(GSTexture* st[2], GSVector4* sr, GSTexture* dt, GSVect
glBindBuffer(GL_UNIFORM_BUFFER, m_merge.cb->buffer); glBindBuffer(GL_UNIFORM_BUFFER, m_merge.cb->buffer);
} }
glBufferSubData(GL_UNIFORM_BUFFER, 0, m_merge.cb->byte_size, &c.v); glBufferSubData(GL_UNIFORM_BUFFER, 0, m_merge.cb->byte_size, &c.v);
#if 0
m_ctx->UpdateSubresource(m_merge.cb, 0, NULL, &c, 0, 0);
#endif
StretchRect(st[0], sr[0], dt, dr[0], m_merge.ps[mmod ? 1 : 0], m_merge.cb, m_merge.bs, true); StretchRect(st[0], sr[0], dt, dr[0], m_merge.ps[mmod ? 1 : 0], m_merge.cb, m_merge.bs, true);
} }
} }
@ -791,9 +796,6 @@ void GSDeviceOGL::DoInterlace(GSTexture* st, GSTexture* dt, int shader, bool lin
glBindBuffer(GL_UNIFORM_BUFFER, m_interlace.cb->buffer); glBindBuffer(GL_UNIFORM_BUFFER, m_interlace.cb->buffer);
} }
glBufferSubData(GL_UNIFORM_BUFFER, 0, m_interlace.cb->byte_size, &cb); glBufferSubData(GL_UNIFORM_BUFFER, 0, m_interlace.cb->byte_size, &cb);
#if 0
m_ctx->UpdateSubresource(m_interlace.cb, 0, NULL, &cb, 0, 0);
#endif
StretchRect(st, sr, dt, dr, m_interlace.ps[shader], m_interlace.cb, linear); StretchRect(st, sr, dt, dr, m_interlace.ps[shader], m_interlace.cb, linear);
} }
@ -1002,7 +1004,7 @@ void GSDeviceOGL::PSSetShader(GLuint ps, GSUniformBufferOGL* ps_cb)
} }
#endif #endif
if(m_state.ps_cb != ps_cb) if(m_state.ps_cb != ps_cb && ps_cb != NULL)
{ {
m_state.ps_cb = ps_cb; m_state.ps_cb = ps_cb;
glBindBufferBase(GL_UNIFORM_BUFFER, ps_cb->index, ps_cb->buffer); glBindBufferBase(GL_UNIFORM_BUFFER, ps_cb->index, ps_cb->buffer);
@ -1208,12 +1210,6 @@ void GSDeviceOGL::CompileShaderFromSource(const std::string& glsl_file, const st
free(log); free(log);
} }
void GSDeviceOGL::DebugCallback(unsigned int source, unsigned int type, unsigned int id, unsigned int severity, int length, const char* message, void* userParam)
{
DebugOutputToFile(source, type, id, severity, message);
}
void GSDeviceOGL::CheckDebugLog() void GSDeviceOGL::CheckDebugLog()
{ {
unsigned int count = 64; // max. num. of messages that will be read from the log unsigned int count = 64; // max. num. of messages that will be read from the log

View File

@ -242,7 +242,6 @@ class GSDeviceOGL : public GSDevice
GSDeviceOGL(); GSDeviceOGL();
virtual ~GSDeviceOGL(); virtual ~GSDeviceOGL();
static void DebugCallback(unsigned int source, unsigned int type, unsigned int id, unsigned int severity, int length, const char* message, void* userParam);
void CheckDebugLog(); void CheckDebugLog();
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);

View File

@ -174,12 +174,8 @@ bool RunLinuxDialog()
} }
} }
#if 0
// I'll put the right variable names in later.
// Crash, for some interlace options
if (gtk_combo_box_get_active(GTK_COMBO_BOX(interlace_combo_box)) != -1) if (gtk_combo_box_get_active(GTK_COMBO_BOX(interlace_combo_box)) != -1)
theApp.SetConfig( "interlace", (int)gtk_combo_box_get_active(GTK_COMBO_BOX(interlace_combo_box)) ); theApp.SetConfig( "interlace", (int)gtk_combo_box_get_active(GTK_COMBO_BOX(interlace_combo_box)) );
#endif
theApp.SetConfig("swthreads", atoi((char*)gtk_entry_get_text(GTK_ENTRY(swthreads_text))) ); theApp.SetConfig("swthreads", atoi((char*)gtk_entry_get_text(GTK_ENTRY(swthreads_text))) );

View File

@ -42,12 +42,12 @@ layout(location = 0) out vec4 SV_Target0;
layout(binding = 0) uniform sampler2D TextureSampler; layout(binding = 0) uniform sampler2D TextureSampler;
vec4 sample_c(vec2 uv) vec4 sample_c()
{ {
return texture(TextureSampler, uv); return texture(TextureSampler, vec2(TEXCOORD0.x,TEXCOORD0.y) );
} }
vec4 ps_crt(vec2 uv, uint i) vec4 ps_crt(uint i)
{ {
vec4 mask[4] = vec4 mask[4] =
{ {
@ -57,17 +57,17 @@ vec4 ps_crt(vec2 uv, uint i)
vec4(1, 1, 1, 0) vec4(1, 1, 1, 0)
}; };
return sample_c(uv) * clamp((mask[i] + 0.5f), 0.0f, 1.0f); return sample_c() * clamp((mask[i] + 0.5f), 0.0f, 1.0f);
} }
void ps_main0() void ps_main0()
{ {
SV_Target0 = sample_c(TEXCOORD0); SV_Target0 = sample_c();
} }
void ps_main7() void ps_main7()
{ {
vec4 c = sample_c(TEXCOORD0); vec4 c = sample_c();
c.a = dot(c.rgb, vec3(0.299, 0.587, 0.114)); c.a = dot(c.rgb, vec3(0.299, 0.587, 0.114));
@ -76,11 +76,9 @@ void ps_main7()
void ps_main5() // triangular void ps_main5() // triangular
{ {
//uint4 p = (uint4)input.p;
highp uvec4 p = uvec4(SV_Position); highp uvec4 p = uvec4(SV_Position);
// output.c = ps_crt(input, ((p.x + (p.y & 1) * 3) >> 1) % 3); vec4 c = ps_crt(((p.x + ((p.y >> 1u) & 1u) * 3u) >> 1u) % 3u);
vec4 c = ps_crt(TEXCOORD0, ((p.x + ((p.y >> 1) & 1) * 3) >> 1) % 3);
SV_Target0 = c; SV_Target0 = c;
} }
@ -89,7 +87,7 @@ void ps_main6() // diagonal
{ {
uvec4 p = uvec4(SV_Position); uvec4 p = uvec4(SV_Position);
vec4 c = ps_crt(TEXCOORD0, (p.x + (p.y % 3)) % 3); vec4 c = ps_crt((p.x + (p.y % 3)) % 3);
SV_Target0 = c; SV_Target0 = c;
} }
@ -110,7 +108,7 @@ void ps_main4()
//void ps_main1() //void ps_main1()
//{ //{
// vec4 c = sample_c(TEXCOORD); // vec4 c = sample_c();
// //
// c.a *= 256.0f / 127; // hm, 0.5 won't give us 1.0 if we just multiply with 2 // c.a *= 256.0f / 127; // hm, 0.5 won't give us 1.0 if we just multiply with 2
// //

View File

@ -6,7 +6,7 @@ layout(location = 1) in vec2 TEXCOORD0;
layout(location = 0) out vec4 SV_Target0; layout(location = 0) out vec4 SV_Target0;
layout(std140, binding = 1) uniform cb0 layout(std140, binding = 2) uniform cb0
{ {
vec2 ZrH; vec2 ZrH;
float hH; float hH;

View File

@ -15,17 +15,14 @@ layout(binding = 0) uniform sampler2D TextureSampler;
void ps_main0() void ps_main0()
{ {
vec4 c = texture(TextureSampler, TEXCOORD0);
vec4 c = texture(TextureSampler, vec2(TEXCOORD0.x, 1.0 -TEXCOORD0.y));
//vec4 c = texture(TextureSampler, TEXCOORD0);
c.a = min(c.a * 2, 1.0); c.a = min(c.a * 2, 1.0);
SV_Target0 = c; SV_Target0 = c;
} }
void ps_main1() void ps_main1()
{ {
vec4 c = texture(TextureSampler, vec2(TEXCOORD0.x, 1.0 -TEXCOORD0.y)); vec4 c = texture(TextureSampler, TEXCOORD0);
//vec4 c = texture(TextureSampler, TEXCOORD0);
c.a = BGColor.a; c.a = BGColor.a;
SV_Target0 = c; SV_Target0 = c;
} }