diff options
| -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 { | 
