Check all swizzle components for red, not just [0], pass float border color rather than int
This commit is contained in:
parent
97f7a560f3
commit
a7fb80e612
3 changed files with 16 additions and 10 deletions
|
@ -112,13 +112,17 @@ GLenum ImageTarget(Shader::TextureType type, int num_samples = 1) {
|
||||||
return GL_NONE;
|
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) {
|
switch (format) {
|
||||||
case PixelFormat::D24_UNORM_S8_UINT:
|
case PixelFormat::D24_UNORM_S8_UINT:
|
||||||
case PixelFormat::D32_FLOAT_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:
|
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:
|
default:
|
||||||
ASSERT(false);
|
ASSERT(false);
|
||||||
return GL_DEPTH_COMPONENT;
|
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::D32_FLOAT_S8_UINT:
|
||||||
case PixelFormat::S8_UINT_D24_UNORM:
|
case PixelFormat::S8_UINT_D24_UNORM:
|
||||||
UNIMPLEMENTED_IF(swizzle[0] != SwizzleSource::R && swizzle[0] != SwizzleSource::G);
|
UNIMPLEMENTED_IF(swizzle[0] != SwizzleSource::R && swizzle[0] != SwizzleSource::G);
|
||||||
glTextureParameteri(handle, GL_DEPTH_STENCIL_TEXTURE_MODE,
|
glTextureParameteri(handle, GL_DEPTH_STENCIL_TEXTURE_MODE, TextureMode(format, swizzle));
|
||||||
TextureMode(format, swizzle[0] == SwizzleSource::R));
|
|
||||||
std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed);
|
std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed);
|
||||||
break;
|
break;
|
||||||
case PixelFormat::A5B5G5R1_UNORM: {
|
case PixelFormat::A5B5G5R1_UNORM: {
|
||||||
|
|
|
@ -1064,7 +1064,7 @@ void RasterizerVulkan::UpdateDepthBoundsTestEnable(Tegra::Engines::Maxwell3D::Re
|
||||||
LOG_WARNING(Render_Vulkan, "Depth bounds is enabled but not supported");
|
LOG_WARNING(Render_Vulkan, "Depth bounds is enabled but not supported");
|
||||||
enabled = false;
|
enabled = false;
|
||||||
}
|
}
|
||||||
scheduler.Record([enable = regs.depth_bounds_enable](vk::CommandBuffer cmdbuf) {
|
scheduler.Record([enable = enabled](vk::CommandBuffer cmdbuf) {
|
||||||
cmdbuf.SetDepthBoundsTestEnableEXT(enable);
|
cmdbuf.SetDepthBoundsTestEnableEXT(enable);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -189,13 +189,16 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) {
|
||||||
if (info.IsRenderTarget()) {
|
if (info.IsRenderTarget()) {
|
||||||
return ImageAspectMask(info.format);
|
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) {
|
switch (info.format) {
|
||||||
case PixelFormat::D24_UNORM_S8_UINT:
|
case PixelFormat::D24_UNORM_S8_UINT:
|
||||||
case PixelFormat::D32_FLOAT_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:
|
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::D16_UNORM:
|
||||||
case PixelFormat::D32_FLOAT:
|
case PixelFormat::D32_FLOAT:
|
||||||
return VK_IMAGE_ASPECT_DEPTH_BIT;
|
return VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||||
|
@ -1763,7 +1766,7 @@ Sampler::Sampler(TextureCacheRuntime& runtime, const Tegra::Texture::TSCEntry& t
|
||||||
.minLod = tsc.mipmap_filter == TextureMipmapFilter::None ? 0.0f : tsc.MinLod(),
|
.minLod = tsc.mipmap_filter == TextureMipmapFilter::None ? 0.0f : tsc.MinLod(),
|
||||||
.maxLod = tsc.mipmap_filter == TextureMipmapFilter::None ? 0.25f : tsc.MaxLod(),
|
.maxLod = tsc.mipmap_filter == TextureMipmapFilter::None ? 0.25f : tsc.MaxLod(),
|
||||||
.borderColor =
|
.borderColor =
|
||||||
arbitrary_borders ? VK_BORDER_COLOR_INT_CUSTOM_EXT : ConvertBorderColor(color),
|
arbitrary_borders ? VK_BORDER_COLOR_FLOAT_CUSTOM_EXT : ConvertBorderColor(color),
|
||||||
.unnormalizedCoordinates = VK_FALSE,
|
.unnormalizedCoordinates = VK_FALSE,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue