From de38963904140259ca1b398234e04931f545bbf8 Mon Sep 17 00:00:00 2001 From: Gregory Hainaut Date: Sat, 23 Apr 2016 12:06:58 +0200 Subject: [PATCH] gsdx ogl: plug the new depth sampling in the renderer Note: When source format is depth, integral texture coordinate must be used => depth_fmt 1/2/3 --- plugins/GSdx/GSRendererHW.cpp | 2 +- plugins/GSdx/GSRendererOGL.cpp | 23 ++++++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/plugins/GSdx/GSRendererHW.cpp b/plugins/GSdx/GSRendererHW.cpp index 8ae13d321e..5a1afec1e4 100644 --- a/plugins/GSdx/GSRendererHW.cpp +++ b/plugins/GSdx/GSRendererHW.cpp @@ -415,7 +415,7 @@ void GSRendererHW::Draw() GetTextureMinMax(r, context->TEX0, context->CLAMP, m_vt.IsLinear()); - tex = m_tc->LookupSource(context->TEX0, env.TEXA, r); + tex = tex_psm.depth ? m_tc->LookupDepthSource(context->TEX0, env.TEXA, r) : m_tc->LookupSource(context->TEX0, env.TEXA, r); if(!tex) { GL_POP(); diff --git a/plugins/GSdx/GSRendererOGL.cpp b/plugins/GSdx/GSRendererOGL.cpp index 6863007e6e..1b575065a6 100644 --- a/plugins/GSdx/GSRendererOGL.cpp +++ b/plugins/GSdx/GSRendererOGL.cpp @@ -876,13 +876,16 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour const GSLocalMemory::psm_t &psm = GSLocalMemory::m_psm[m_context->TEX0.PSM]; const GSLocalMemory::psm_t &cpsm = psm.pal > 0 ? GSLocalMemory::m_psm[m_context->TEX0.CPSM] : psm; bool bilinear = m_filter == 2 ? m_vt.IsLinear() : m_filter != 0; - bool simple_sample = !tex->m_palette && cpsm.fmt == 0 && m_context->CLAMP.WMS < 2 && m_context->CLAMP.WMT < 2; + bool simple_sample = !tex->m_palette && cpsm.fmt == 0 && m_context->CLAMP.WMS < 2 && m_context->CLAMP.WMT < 2 && !psm.depth; // Don't force extra filtering on sprite (it creates various upscaling issue) bilinear &= !((m_vt.m_primclass == GS_SPRITE_CLASS) && m_userhacks_round_sprite_offset && !m_vt.IsLinear()); ps_sel.wms = m_context->CLAMP.WMS; ps_sel.wmt = m_context->CLAMP.WMT; + // Depth + bilinear filtering isn't done yet (And I'm not sure we need it anyway but a game will prove me wrong) + ASSERT(!(psm.depth && m_vt.IsLinear())); + // Performance note: // 1/ Don't set 0 as it is the default value // 2/ Only keep aem when it is useful (avoid useless shader permutation) @@ -892,6 +895,11 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour ps_sel.aem = m_env.TEXA.AEM; ASSERT(tex->m_target); + // Require a float conversion if the texure is a depth otherwise uses Integral scaling + if (psm.depth) { + ps_sel.depth_fmt = (tex->m_texture->GetType() != GSTexture::DepthStencil) ? 3 : 1; + } + // Shuffle is a 16 bits format, so aem is always required GSVector4 ta(m_env.TEXA & GSVector4i::x000000ff()); ta /= 255.0f; @@ -899,8 +907,8 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour ps_cb.TA_Af.x = ta.x; ps_cb.TA_Af.y = ta.y; - // FIXME: it is likely a bad idea to do the bilinear interpolation here - // bilinear &= m_vt.IsLinear(); + // The purpose of texture shuffle is to move color channel. Extra interpolation is likely a bad idea. + bilinear &= m_vt.IsLinear(); } else if (tex->m_target) { // Use an old target. AEM and index aren't resolved it must be done @@ -935,6 +943,15 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour bilinear &= m_vt.IsLinear(); } + // Depth format + if (psm.depth) { + // Require a float conversion if the texure is a depth otherwise uses Integral scaling + ps_sel.depth_fmt = (tex->m_texture->GetType() != GSTexture::DepthStencil) ? 3 : + (psm.bpp == 16) ? 2 : 1; + // Don't force interpolation on depth format + bilinear &= m_vt.IsLinear(); + } + } else if (tex->m_palette) { // Use a standard 8 bits texture. AEM is already done on the CLUT // Therefore you only need to set the index