mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2026-03-28 22:49:42 -06:00
49 lines
2.3 KiB
C++
49 lines
2.3 KiB
C++
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#include <algorithm>
|
|
#include "video_core/amdgpu/resource.h"
|
|
#include "video_core/renderer_vulkan/liverpool_to_vk.h"
|
|
#include "video_core/renderer_vulkan/vk_instance.h"
|
|
#include "video_core/texture_cache/sampler.h"
|
|
|
|
namespace VideoCore {
|
|
|
|
Sampler::Sampler(const Vulkan::Instance& instance, const AmdGpu::Sampler& sampler) {
|
|
if (sampler.force_degamma) {
|
|
LOG_WARNING(Render_Vulkan, "Texture requires gamma correction");
|
|
}
|
|
using namespace Vulkan;
|
|
const bool anisotropyEnable = instance.IsAnisotropicFilteringSupported() &&
|
|
(AmdGpu::IsAnisoFilter(sampler.xy_mag_filter) ||
|
|
AmdGpu::IsAnisoFilter(sampler.xy_min_filter));
|
|
const float maxAnisotropy =
|
|
anisotropyEnable ? std::clamp(sampler.MaxAniso(), 1.0f, instance.MaxSamplerAnisotropy())
|
|
: 1.0f;
|
|
const vk::SamplerCreateInfo sampler_ci = {
|
|
.magFilter = LiverpoolToVK::Filter(sampler.xy_mag_filter),
|
|
.minFilter = LiverpoolToVK::Filter(sampler.xy_min_filter),
|
|
.mipmapMode = LiverpoolToVK::MipFilter(sampler.mip_filter),
|
|
.addressModeU = LiverpoolToVK::ClampMode(sampler.clamp_x),
|
|
.addressModeV = LiverpoolToVK::ClampMode(sampler.clamp_y),
|
|
.addressModeW = LiverpoolToVK::ClampMode(sampler.clamp_z),
|
|
.mipLodBias = std::min(sampler.LodBias(), instance.MaxSamplerLodBias()),
|
|
.anisotropyEnable = anisotropyEnable,
|
|
.maxAnisotropy = maxAnisotropy,
|
|
.compareEnable = sampler.depth_compare_func != AmdGpu::DepthCompare::Never,
|
|
.compareOp = LiverpoolToVK::DepthCompare(sampler.depth_compare_func),
|
|
.minLod = sampler.MinLod(),
|
|
.maxLod = sampler.MaxLod(),
|
|
.borderColor = LiverpoolToVK::BorderColor(sampler.border_color_type),
|
|
.unnormalizedCoordinates = false, // Handled in shader due to Vulkan limitations.
|
|
};
|
|
auto [sampler_result, smplr] = instance.GetDevice().createSamplerUnique(sampler_ci);
|
|
ASSERT_MSG(sampler_result == vk::Result::eSuccess, "Failed to create sampler: {}",
|
|
vk::to_string(sampler_result));
|
|
handle = std::move(smplr);
|
|
}
|
|
|
|
Sampler::~Sampler() = default;
|
|
|
|
} // namespace VideoCore
|