gsdx-ogl: use a local ALPHA register

It would allow to easy tune the parameter to support 24 bits format
This commit is contained in:
Gregory Hainaut 2015-05-26 15:36:48 +02:00
parent d31bd97d59
commit 9ee3a173d0
3 changed files with 22 additions and 20 deletions

View File

@ -619,7 +619,7 @@ class GSDeviceOGL : public GSDevice
GLuint CreateSampler(bool bilinear, bool tau, bool tav); GLuint CreateSampler(bool bilinear, bool tau, bool tav);
GLuint CreateSampler(PSSamplerSelector sel); GLuint CreateSampler(PSSamplerSelector sel);
GSDepthStencilOGL* CreateDepthStencil(OMDepthStencilSelector dssel); GSDepthStencilOGL* CreateDepthStencil(OMDepthStencilSelector dssel);
GSBlendStateOGL* CreateBlend(OMBlendSelector bsel, uint8 afix); GSBlendStateOGL* CreateBlend(OMBlendSelector bsel, float afix);
void SetupIA(const void* vertex, int vertex_count, const uint32* index, int index_count, int prim); void SetupIA(const void* vertex, int vertex_count, const uint32* index, int index_count, int prim);
@ -628,7 +628,7 @@ class GSDeviceOGL : public GSDevice
void SetupPS(PSSelector sel); void SetupPS(PSSelector sel);
void SetupCB(const VSConstantBuffer* vs_cb, const PSConstantBuffer* ps_cb); void SetupCB(const VSConstantBuffer* vs_cb, const PSConstantBuffer* ps_cb);
void SetupSampler(PSSamplerSelector ssel); void SetupSampler(PSSamplerSelector ssel);
void SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, uint8 afix, bool sw_blending = false); void SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, float afix, bool sw_blending = false);
GLuint GetSamplerID(PSSamplerSelector ssel); GLuint GetSamplerID(PSSamplerSelector ssel);
GLuint GetPaletteSamplerID(); GLuint GetPaletteSamplerID();

View File

@ -252,16 +252,19 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour
// Format of the output // Format of the output
ps_sel.dfmt = GSLocalMemory::m_psm[context->FRAME.PSM].fmt; ps_sel.dfmt = GSLocalMemory::m_psm[context->FRAME.PSM].fmt;
GIFRegALPHA ALPHA = context->ALPHA;
float afix = (float)context->ALPHA.FIX / 0x80;
// Blend // Blend
if (!IsOpaque()) if (!IsOpaque())
{ {
om_bsel.abe = PRIM->ABE || PRIM->AA1 && m_vt.m_primclass == GS_LINE_CLASS; om_bsel.abe = PRIM->ABE || PRIM->AA1 && m_vt.m_primclass == GS_LINE_CLASS;
om_bsel.a = context->ALPHA.A; om_bsel.a = ALPHA.A;
om_bsel.b = context->ALPHA.B; om_bsel.b = ALPHA.B;
om_bsel.c = context->ALPHA.C; om_bsel.c = ALPHA.C;
om_bsel.d = context->ALPHA.D; om_bsel.d = ALPHA.D;
if (env.PABE.PABE) if (env.PABE.PABE)
{ {
@ -439,25 +442,25 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour
bool colclip_wrap = env.COLCLAMP.CLAMP == 0 && !tex && PRIM->PRIM != GS_POINTLIST && !m_accurate_colclip; bool colclip_wrap = env.COLCLAMP.CLAMP == 0 && !tex && PRIM->PRIM != GS_POINTLIST && !m_accurate_colclip;
bool acc_colclip_wrap = env.COLCLAMP.CLAMP == 0 && m_accurate_colclip; bool acc_colclip_wrap = env.COLCLAMP.CLAMP == 0 && m_accurate_colclip;
if (context->ALPHA.A == context->ALPHA.B) { // Optimize-away colclip if (ALPHA.A == ALPHA.B) { // Optimize-away colclip
// No addition neither substraction so no risk of overflow the [0:255] range. // No addition neither substraction so no risk of overflow the [0:255] range.
colclip_wrap = false; colclip_wrap = false;
acc_colclip_wrap = false; acc_colclip_wrap = false;
#ifdef ENABLE_OGL_DEBUG #ifdef ENABLE_OGL_DEBUG
if (colclip_wrap || acc_colclip_wrap) { if (colclip_wrap || acc_colclip_wrap) {
const char *col[3] = {"Cs", "Cd", "0"}; const char *col[3] = {"Cs", "Cd", "0"};
GL_INS("COLCLIP: DISABLED: blending is a plain copy of %s", col[context->ALPHA.D]); GL_INS("COLCLIP: DISABLED: blending is a plain copy of %s", col[ALPHA.D]);
} }
#endif #endif
} }
if (colclip_wrap) { if (colclip_wrap) {
ps_sel.colclip = 1; ps_sel.colclip = 1;
GL_INS("COLCLIP ENABLED (blending is %d/%d/%d/%d)", context->ALPHA.A, context->ALPHA.B, context->ALPHA.C, context->ALPHA.D); GL_INS("COLCLIP ENABLED (blending is %d/%d/%d/%d)", ALPHA.A, ALPHA.B, ALPHA.C, ALPHA.D);
} else if (acc_colclip_wrap) { } else if (acc_colclip_wrap) {
ps_sel.colclip = 3; ps_sel.colclip = 3;
GL_INS("COLCLIP SW ENABLED (blending is %d/%d/%d/%d)", context->ALPHA.A, context->ALPHA.B, context->ALPHA.C, context->ALPHA.D); GL_INS("COLCLIP SW ENABLED (blending is %d/%d/%d/%d)", ALPHA.A, ALPHA.B, ALPHA.C, ALPHA.D);
} else if (env.COLCLAMP.CLAMP == 0 && (context->ALPHA.A != context->ALPHA.B)) { } else if (env.COLCLAMP.CLAMP == 0 && (ALPHA.A != ALPHA.B)) {
GL_INS("COLCLIP NOT SUPPORTED (blending is %d/%d/%d/%d)", context->ALPHA.A, context->ALPHA.B, context->ALPHA.C, context->ALPHA.D); GL_INS("COLCLIP NOT SUPPORTED (blending is %d/%d/%d/%d)", ALPHA.A, ALPHA.B, ALPHA.C, ALPHA.D);
} }
ps_sel.fba = context->FBA.FBA; ps_sel.fba = context->FBA.FBA;
@ -613,8 +616,8 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour
dev->PSSetShaderResource(3, rt); dev->PSSetShaderResource(3, rt);
// Require the fix alpha vlaue // Require the fix alpha vlaue
if (context->ALPHA.C == 2) { if (ALPHA.C == 2) {
ps_cb.AlphaCoeff = GSVector4((float)(int)context->ALPHA.FIX / 0x80); ps_cb.AlphaCoeff = GSVector4(afix);
} }
// No need to flush for every primitive // No need to flush for every primitive
@ -632,7 +635,6 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour
dev->SetupPS(ps_sel); dev->SetupPS(ps_sel);
// rs // rs
uint8 afix = context->ALPHA.FIX;
GSVector4i scissor = GSVector4i(GSVector4(rtscale).xyxy() * context->scissor.in).rintersect(GSVector4i(rtsize).zwxy()); GSVector4i scissor = GSVector4i(GSVector4(rtscale).xyxy() * context->scissor.in).rintersect(GSVector4i(rtsize).zwxy());

View File

@ -100,7 +100,7 @@ GSDepthStencilOGL* GSDeviceOGL::CreateDepthStencil(OMDepthStencilSelector dssel)
return dss; return dss;
} }
GSBlendStateOGL* GSDeviceOGL::CreateBlend(OMBlendSelector bsel, uint8 afix) GSBlendStateOGL* GSDeviceOGL::CreateBlend(OMBlendSelector bsel, float afix)
{ {
GSBlendStateOGL* bs = new GSBlendStateOGL(); GSBlendStateOGL* bs = new GSBlendStateOGL();
@ -119,7 +119,7 @@ GSBlendStateOGL* GSDeviceOGL::CreateBlend(OMBlendSelector bsel, uint8 afix)
bs->SetRGB(m_blendMapD3D9[i].op, m_blendMapD3D9[i].src, GL_ONE); bs->SetRGB(m_blendMapD3D9[i].op, m_blendMapD3D9[i].src, GL_ONE);
} }
const string afixstr = format("%d >> 7", afix); const string afixstr = format("%f", afix);
const char *col[3] = {"Cs", "Cd", "0"}; const char *col[3] = {"Cs", "Cd", "0"};
const char *alpha[3] = {"As", "Ad", afixstr.c_str()}; const char *alpha[3] = {"As", "Ad", afixstr.c_str()};
fprintf(stderr, "Impossible blend for D3D: (%s - %s) * %s + %s\n", col[bsel.a], col[bsel.b], alpha[bsel.c], col[bsel.d]); fprintf(stderr, "Impossible blend for D3D: (%s - %s) * %s + %s\n", col[bsel.a], col[bsel.b], alpha[bsel.c], col[bsel.d]);
@ -235,7 +235,7 @@ GLuint GSDeviceOGL::GetPaletteSamplerID()
return m_palette_ss; return m_palette_ss;
} }
void GSDeviceOGL::SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, uint8 afix, bool sw_blending) void GSDeviceOGL::SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, float afix, bool sw_blending)
{ {
GSDepthStencilOGL* dss = m_om_dss[dssel]; GSDepthStencilOGL* dss = m_om_dss[dssel];
@ -267,5 +267,5 @@ void GSDeviceOGL::SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, ui
// ************************************************************* // *************************************************************
// Dynamic // Dynamic
// ************************************************************* // *************************************************************
OMSetBlendState(bs, (float)(int)afix / 0x80); OMSetBlendState(bs, afix);
} }