14 const vk::Device& device,
16 const std::shared_ptr<YUVConversionVK>& yuv_conversion) {
26 vk::StructureChain<vk::SamplerCreateInfo,
28 vk::SamplerYcbcrConversionInfo>
31 auto& sampler_info = sampler_chain.get();
33 sampler_info.magFilter = mag_filter;
34 sampler_info.minFilter = min_filter;
35 sampler_info.addressModeU = address_mode_u;
36 sampler_info.addressModeV = address_mode_v;
37 sampler_info.addressModeW = address_mode_w;
38 sampler_info.borderColor = vk::BorderColor::eFloatTransparentBlack;
39 sampler_info.mipmapMode = mip_map;
41 if (yuv_conversion && yuv_conversion->IsValid()) {
42 sampler_chain.get<vk::SamplerYcbcrConversionInfo>().conversion =
43 yuv_conversion->GetConversion();
64 sampler_info.magFilter = vk::Filter::eNearest;
65 sampler_info.minFilter = vk::Filter::eNearest;
74 sampler_info.addressModeU = vk::SamplerAddressMode::eClampToEdge;
75 sampler_info.addressModeV = vk::SamplerAddressMode::eClampToEdge;
76 sampler_info.addressModeW = vk::SamplerAddressMode::eClampToEdge;
77 sampler_info.anisotropyEnable =
false;
78 sampler_info.unnormalizedCoordinates =
false;
80 sampler_chain.unlink<vk::SamplerYcbcrConversionInfo>();
83 auto sampler = device.createSamplerUnique(sampler_chain.get());
84 if (sampler.result != vk::Result::eSuccess) {
86 << vk::to_string(sampler.result);
90 if (!desc.
label.empty()) {
94 return std::move(sampler.value);
99 std::shared_ptr<YUVConversionVK> yuv_conversion)
104 yuv_conversion_(
std::move(yuv_conversion)) {
105 is_valid_ = sampler_ && !!sampler_->Get();
115 std::shared_ptr<YUVConversionVK> conversion)
const {
116 if (!conversion || !is_valid_) {
119 return std::make_shared<SamplerVK>(device_,
desc_, std::move(conversion));
123 return yuv_conversion_;