diff options
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_texture_cache.cpp | 13 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 11 | 
3 files changed, 16 insertions, 10 deletions
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index b047e7b3d..d3eabd686 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp @@ -112,13 +112,17 @@ GLenum ImageTarget(Shader::TextureType type, int num_samples = 1) {      return GL_NONE;  } -GLenum TextureMode(PixelFormat format, bool is_first) { +GLenum TextureMode(PixelFormat format, std::array<SwizzleSource, 4> swizzle) { +    bool any_r = +        std::ranges::any_of(swizzle, [](SwizzleSource s) { return s == SwizzleSource::R; });      switch (format) {      case PixelFormat::D24_UNORM_S8_UINT:      case PixelFormat::D32_FLOAT_S8_UINT: -        return is_first ? GL_DEPTH_COMPONENT : GL_STENCIL_INDEX; +        // R = depth, G = stencil +        return any_r ? GL_DEPTH_COMPONENT : GL_STENCIL_INDEX;      case PixelFormat::S8_UINT_D24_UNORM: -        return is_first ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT; +        // R = stencil, G = depth +        return any_r ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT;      default:          ASSERT(false);          return GL_DEPTH_COMPONENT; @@ -208,8 +212,7 @@ void ApplySwizzle(GLuint handle, PixelFormat format, std::array<SwizzleSource, 4      case PixelFormat::D32_FLOAT_S8_UINT:      case PixelFormat::S8_UINT_D24_UNORM:          UNIMPLEMENTED_IF(swizzle[0] != SwizzleSource::R && swizzle[0] != SwizzleSource::G); -        glTextureParameteri(handle, GL_DEPTH_STENCIL_TEXTURE_MODE, -                            TextureMode(format, swizzle[0] == SwizzleSource::R)); +        glTextureParameteri(handle, GL_DEPTH_STENCIL_TEXTURE_MODE, TextureMode(format, swizzle));          std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed);          break;      case PixelFormat::A5B5G5R1_UNORM: { diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index f085d53a1..25965b684 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -1294,7 +1294,7 @@ void RasterizerVulkan::UpdateDepthBoundsTestEnable(Tegra::Engines::Maxwell3D::Re          LOG_WARNING(Render_Vulkan, "Depth bounds is enabled but not supported");          enabled = false;      } -    scheduler.Record([enable = regs.depth_bounds_enable](vk::CommandBuffer cmdbuf) { +    scheduler.Record([enable = enabled](vk::CommandBuffer cmdbuf) {          cmdbuf.SetDepthBoundsTestEnableEXT(enable);      });  } diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 8a204f93f..e013d1c60 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -189,13 +189,16 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) {      if (info.IsRenderTarget()) {          return ImageAspectMask(info.format);      } -    const bool is_first = info.Swizzle()[0] == SwizzleSource::R; +    bool any_r = +        std::ranges::any_of(info.Swizzle(), [](SwizzleSource s) { return s == SwizzleSource::R; });      switch (info.format) {      case PixelFormat::D24_UNORM_S8_UINT:      case PixelFormat::D32_FLOAT_S8_UINT: -        return is_first ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_STENCIL_BIT; +        // R = depth, G = stencil +        return any_r ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_STENCIL_BIT;      case PixelFormat::S8_UINT_D24_UNORM: -        return is_first ? VK_IMAGE_ASPECT_STENCIL_BIT : VK_IMAGE_ASPECT_DEPTH_BIT; +        // R = stencil, G = depth +        return any_r ? VK_IMAGE_ASPECT_STENCIL_BIT : VK_IMAGE_ASPECT_DEPTH_BIT;      case PixelFormat::D16_UNORM:      case PixelFormat::D32_FLOAT:          return VK_IMAGE_ASPECT_DEPTH_BIT; @@ -1769,7 +1772,7 @@ Sampler::Sampler(TextureCacheRuntime& runtime, const Tegra::Texture::TSCEntry& t          .minLod = tsc.mipmap_filter == TextureMipmapFilter::None ? 0.0f : tsc.MinLod(),          .maxLod = tsc.mipmap_filter == TextureMipmapFilter::None ? 0.25f : tsc.MaxLod(),          .borderColor = -            arbitrary_borders ? VK_BORDER_COLOR_INT_CUSTOM_EXT : ConvertBorderColor(color), +            arbitrary_borders ? VK_BORDER_COLOR_FLOAT_CUSTOM_EXT : ConvertBorderColor(color),          .unnormalizedCoordinates = VK_FALSE,      });  }  | 
