diff options
| author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2020-01-26 17:11:49 -0300 | 
|---|---|---|
| committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2020-01-26 21:44:08 -0300 | 
| commit | d17dfa610418e2057e65b2fd3ab28a46249f4b83 (patch) | |
| tree | 9d6e927970f1ee4d8a49a9932f5d439b3fb61d38 | |
| parent | 05df4a8c9452269a340fdd8490eeb064696ccb10 (diff) | |
gl_texture_cache: Properly implement depth/stencil sampling
This addresses the long standing issue of compatibility vs. core
profiles on OpenGL, properly implementing depth vs. stencil sampling
depending on the texture swizzle.
| -rw-r--r-- | src/video_core/renderer_opengl/gl_texture_cache.cpp | 31 | 
1 files changed, 27 insertions, 4 deletions
| diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index e95eb069e..d9aae6dff 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp @@ -176,6 +176,19 @@ GLint GetSwizzleSource(SwizzleSource source) {      return GL_NONE;  } +GLenum GetComponent(PixelFormat format, bool is_first) { +    switch (format) { +    case PixelFormat::Z24S8: +    case PixelFormat::Z32FS8: +        return is_first ? GL_DEPTH_COMPONENT : GL_STENCIL_INDEX; +    case PixelFormat::S8Z24: +        return is_first ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT; +    default: +        UNREACHABLE(); +        return GL_DEPTH_COMPONENT; +    } +} +  void ApplyTextureDefaults(const SurfaceParams& params, GLuint texture) {      if (params.IsBuffer()) {          return; @@ -416,11 +429,21 @@ void CachedSurfaceView::ApplySwizzle(SwizzleSource x_source, SwizzleSource y_sou      if (new_swizzle == swizzle)          return;      swizzle = new_swizzle; -    const std::array<GLint, 4> gl_swizzle = {GetSwizzleSource(x_source), GetSwizzleSource(y_source), -                                             GetSwizzleSource(z_source), -                                             GetSwizzleSource(w_source)}; +    const std::array gl_swizzle = {GetSwizzleSource(x_source), GetSwizzleSource(y_source), +                                   GetSwizzleSource(z_source), GetSwizzleSource(w_source)};      const GLuint handle = GetTexture(); -    glTextureParameteriv(handle, GL_TEXTURE_SWIZZLE_RGBA, gl_swizzle.data()); +    const PixelFormat format = surface.GetSurfaceParams().pixel_format; +    switch (format) { +    case PixelFormat::Z24S8: +    case PixelFormat::Z32FS8: +    case PixelFormat::S8Z24: +        glTextureParameteri(handle, GL_DEPTH_STENCIL_TEXTURE_MODE, +                            GetComponent(format, x_source == SwizzleSource::R)); +        break; +    default: +        glTextureParameteriv(handle, GL_TEXTURE_SWIZZLE_RGBA, gl_swizzle.data()); +        break; +    }  }  OGLTextureView CachedSurfaceView::CreateTextureView() const { | 
