summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.cpp13
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp2
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp11
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) {
112 return GL_NONE; 112 return GL_NONE;
113} 113}
114 114
115GLenum TextureMode(PixelFormat format, bool is_first) { 115GLenum TextureMode(PixelFormat format, std::array<SwizzleSource, 4> swizzle) {
116 bool any_r =
117 std::ranges::any_of(swizzle, [](SwizzleSource s) { return s == SwizzleSource::R; });
116 switch (format) { 118 switch (format) {
117 case PixelFormat::D24_UNORM_S8_UINT: 119 case PixelFormat::D24_UNORM_S8_UINT:
118 case PixelFormat::D32_FLOAT_S8_UINT: 120 case PixelFormat::D32_FLOAT_S8_UINT:
119 return is_first ? GL_DEPTH_COMPONENT : GL_STENCIL_INDEX; 121 // R = depth, G = stencil
122 return any_r ? GL_DEPTH_COMPONENT : GL_STENCIL_INDEX;
120 case PixelFormat::S8_UINT_D24_UNORM: 123 case PixelFormat::S8_UINT_D24_UNORM:
121 return is_first ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT; 124 // R = stencil, G = depth
125 return any_r ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT;
122 default: 126 default:
123 ASSERT(false); 127 ASSERT(false);
124 return GL_DEPTH_COMPONENT; 128 return GL_DEPTH_COMPONENT;
@@ -208,8 +212,7 @@ void ApplySwizzle(GLuint handle, PixelFormat format, std::array<SwizzleSource, 4
208 case PixelFormat::D32_FLOAT_S8_UINT: 212 case PixelFormat::D32_FLOAT_S8_UINT:
209 case PixelFormat::S8_UINT_D24_UNORM: 213 case PixelFormat::S8_UINT_D24_UNORM:
210 UNIMPLEMENTED_IF(swizzle[0] != SwizzleSource::R && swizzle[0] != SwizzleSource::G); 214 UNIMPLEMENTED_IF(swizzle[0] != SwizzleSource::R && swizzle[0] != SwizzleSource::G);
211 glTextureParameteri(handle, GL_DEPTH_STENCIL_TEXTURE_MODE, 215 glTextureParameteri(handle, GL_DEPTH_STENCIL_TEXTURE_MODE, TextureMode(format, swizzle));
212 TextureMode(format, swizzle[0] == SwizzleSource::R));
213 std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed); 216 std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed);
214 break; 217 break;
215 case PixelFormat::A5B5G5R1_UNORM: { 218 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 719edbcfb..4ed0aebf7 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
@@ -1064,7 +1064,7 @@ void RasterizerVulkan::UpdateDepthBoundsTestEnable(Tegra::Engines::Maxwell3D::Re
1064 LOG_WARNING(Render_Vulkan, "Depth bounds is enabled but not supported"); 1064 LOG_WARNING(Render_Vulkan, "Depth bounds is enabled but not supported");
1065 enabled = false; 1065 enabled = false;
1066 } 1066 }
1067 scheduler.Record([enable = regs.depth_bounds_enable](vk::CommandBuffer cmdbuf) { 1067 scheduler.Record([enable = enabled](vk::CommandBuffer cmdbuf) {
1068 cmdbuf.SetDepthBoundsTestEnableEXT(enable); 1068 cmdbuf.SetDepthBoundsTestEnableEXT(enable);
1069 }); 1069 });
1070} 1070}
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index 80adb70eb..69b654994 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) {
189 if (info.IsRenderTarget()) { 189 if (info.IsRenderTarget()) {
190 return ImageAspectMask(info.format); 190 return ImageAspectMask(info.format);
191 } 191 }
192 const bool is_first = info.Swizzle()[0] == SwizzleSource::R; 192 bool any_r =
193 std::ranges::any_of(info.Swizzle(), [](SwizzleSource s) { return s == SwizzleSource::R; });
193 switch (info.format) { 194 switch (info.format) {
194 case PixelFormat::D24_UNORM_S8_UINT: 195 case PixelFormat::D24_UNORM_S8_UINT:
195 case PixelFormat::D32_FLOAT_S8_UINT: 196 case PixelFormat::D32_FLOAT_S8_UINT:
196 return is_first ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_STENCIL_BIT; 197 // R = depth, G = stencil
198 return any_r ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_STENCIL_BIT;
197 case PixelFormat::S8_UINT_D24_UNORM: 199 case PixelFormat::S8_UINT_D24_UNORM:
198 return is_first ? VK_IMAGE_ASPECT_STENCIL_BIT : VK_IMAGE_ASPECT_DEPTH_BIT; 200 // R = stencil, G = depth
201 return any_r ? VK_IMAGE_ASPECT_STENCIL_BIT : VK_IMAGE_ASPECT_DEPTH_BIT;
199 case PixelFormat::D16_UNORM: 202 case PixelFormat::D16_UNORM:
200 case PixelFormat::D32_FLOAT: 203 case PixelFormat::D32_FLOAT:
201 return VK_IMAGE_ASPECT_DEPTH_BIT; 204 return VK_IMAGE_ASPECT_DEPTH_BIT;
@@ -1763,7 +1766,7 @@ Sampler::Sampler(TextureCacheRuntime& runtime, const Tegra::Texture::TSCEntry& t
1763 .minLod = tsc.mipmap_filter == TextureMipmapFilter::None ? 0.0f : tsc.MinLod(), 1766 .minLod = tsc.mipmap_filter == TextureMipmapFilter::None ? 0.0f : tsc.MinLod(),
1764 .maxLod = tsc.mipmap_filter == TextureMipmapFilter::None ? 0.25f : tsc.MaxLod(), 1767 .maxLod = tsc.mipmap_filter == TextureMipmapFilter::None ? 0.25f : tsc.MaxLod(),
1765 .borderColor = 1768 .borderColor =
1766 arbitrary_borders ? VK_BORDER_COLOR_INT_CUSTOM_EXT : ConvertBorderColor(color), 1769 arbitrary_borders ? VK_BORDER_COLOR_FLOAT_CUSTOM_EXT : ConvertBorderColor(color),
1767 .unnormalizedCoordinates = VK_FALSE, 1770 .unnormalizedCoordinates = VK_FALSE,
1768 }); 1771 });
1769} 1772}