FVulkanSamplerState::FVulkanSamplerState(const FSamplerStateInitializerRHI& Initializer, FVulkanDevice& InDevice) : Sampler(VK_NULL_HANDLE), Device(InDevice) { VkSamplerCreateInfo SamplerInfo; FMemory::Memzero(SamplerInfo); SamplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; SamplerInfo.magFilter = TranslateMagFilterMode(Initializer.Filter); SamplerInfo.minFilter = TranslateMinFilterMode(Initializer.Filter); SamplerInfo.mipmapMode = TranslateMipFilterMode(Initializer.Filter); SamplerInfo.addressModeU = TranslateWrapMode(Initializer.AddressU); SamplerInfo.addressModeV = TranslateWrapMode(Initializer.AddressV); SamplerInfo.addressModeW = TranslateWrapMode(Initializer.AddressW); SamplerInfo.mipLodBias = Initializer.MipBias; SamplerInfo.maxAnisotropy = GetMaxAnisotropy(Initializer.Filter, Initializer.MaxAnisotropy); SamplerInfo.anisotropyEnable = SamplerInfo.maxAnisotropy > 1; // FPlatformMisc::LowLevelOutputDebugStringf(TEXT("Using LOD Group %d / %d, MaxAniso = %f \n"), (int32)Initializer.Filter, Initializer.MaxAnisotropy, SamplerInfo.maxAnisotropy); SamplerInfo.compareOp = TranslateSamplerCompareFunction(Initializer.SamplerComparisonFunction); SamplerInfo.minLod = Initializer.MinMipLevel; SamplerInfo.maxLod = Initializer.MaxMipLevel; SamplerInfo.borderColor = Initializer.BorderColor == 0 ? VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK : VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE; VERIFYVULKANRESULT(VulkanRHI::vkCreateSampler(Device.GetInstanceHandle(), &SamplerInfo, nullptr, &Sampler)); }
FSamplerStateRHIRef FD3D11DynamicRHI::RHICreateSamplerState(const FSamplerStateInitializerRHI& Initializer) { D3D11_SAMPLER_DESC SamplerDesc; FMemory::Memzero(&SamplerDesc,sizeof(D3D11_SAMPLER_DESC)); int32 MaxAnisotropyCVar = GetCachedScalabilityCVars().MaxAnisotropy; SamplerDesc.AddressU = TranslateAddressMode(Initializer.AddressU); SamplerDesc.AddressV = TranslateAddressMode(Initializer.AddressV); SamplerDesc.AddressW = TranslateAddressMode(Initializer.AddressW); SamplerDesc.MipLODBias = Initializer.MipBias; SamplerDesc.MaxAnisotropy = FMath::Clamp(Initializer.MaxAnisotropy > 0 ? Initializer.MaxAnisotropy : MaxAnisotropyCVar,1,16); SamplerDesc.MinLOD = Initializer.MinMipLevel; SamplerDesc.MaxLOD = Initializer.MaxMipLevel; // Determine whether we should use one of the comparison modes const bool bComparisonEnabled = Initializer.SamplerComparisonFunction != SCF_Never; switch(Initializer.Filter) { case SF_AnisotropicLinear: case SF_AnisotropicPoint: if (SamplerDesc.MaxAnisotropy == 1) { SamplerDesc.Filter = bComparisonEnabled ? D3D11_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR : D3D11_FILTER_MIN_MAG_MIP_LINEAR; } else { // D3D11 doesn't allow using point filtering for mip filter when using anisotropic filtering SamplerDesc.Filter = bComparisonEnabled ? D3D11_FILTER_COMPARISON_ANISOTROPIC : D3D11_FILTER_ANISOTROPIC; } break; case SF_Trilinear: SamplerDesc.Filter = bComparisonEnabled ? D3D11_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR : D3D11_FILTER_MIN_MAG_MIP_LINEAR; break; case SF_Bilinear: SamplerDesc.Filter = bComparisonEnabled ? D3D11_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT : D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT; break; case SF_Point: SamplerDesc.Filter = bComparisonEnabled ? D3D11_FILTER_COMPARISON_MIN_MAG_MIP_POINT : D3D11_FILTER_MIN_MAG_MIP_POINT; break; } const FLinearColor LinearBorderColor = FColor(Initializer.BorderColor); SamplerDesc.BorderColor[0] = LinearBorderColor.R; SamplerDesc.BorderColor[1] = LinearBorderColor.G; SamplerDesc.BorderColor[2] = LinearBorderColor.B; SamplerDesc.BorderColor[3] = LinearBorderColor.A; SamplerDesc.ComparisonFunc = TranslateSamplerCompareFunction(Initializer.SamplerComparisonFunction); #if LOCK_GSamplerStateCache QUICK_SCOPE_CYCLE_COUNTER(FD3D11DynamicRHI_RHICreateSamplerState_LockAndCreate); FScopeLock Lock(&GSamplerStateCacheLock); #endif // D3D11 will return the same pointer if the particular state description was already created TRefCountPtr<ID3D11SamplerState> SamplerStateHandle; VERIFYD3D11RESULT(Direct3DDevice->CreateSamplerState(&SamplerDesc, SamplerStateHandle.GetInitReference())); FD3D11SamplerState** Found = GSamplerStateCache.Find(SamplerStateHandle); if (Found) { return *Found; } FD3D11SamplerState* SamplerState = new FD3D11SamplerState; SamplerState->Resource = SamplerStateHandle; // Manually add reference as we control the creation/destructions SamplerState->AddRef(); GSamplerStateCache.Add(SamplerStateHandle.GetReference(), SamplerState); return SamplerState; }