BsVulkanSamplerState.cpp 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsVulkanSamplerState.h"
  4. #include "BsVulkanDevice.h"
  5. #include "BsVulkanUtility.h"
  6. #include "BsVulkanRenderAPI.h"
  7. namespace bs { namespace ct
  8. {
  9. VulkanSampler::VulkanSampler(VulkanResourceManager* owner, VkSampler sampler)
  10. :VulkanResource(owner, true), mSampler(sampler)
  11. { }
  12. VulkanSampler::~VulkanSampler()
  13. {
  14. vkDestroySampler(mOwner->getDevice().getLogical(), mSampler, gVulkanAllocator);
  15. }
  16. VulkanSamplerState::VulkanSamplerState(const SAMPLER_STATE_DESC& desc, GpuDeviceFlags deviceMask)
  17. :SamplerState(desc, deviceMask), mSamplers(), mDeviceMask(deviceMask)
  18. { }
  19. VulkanSamplerState::~VulkanSamplerState()
  20. {
  21. for(UINT32 i = 0; i < BS_MAX_DEVICES; i++)
  22. {
  23. if (mSamplers[i] == nullptr)
  24. return;
  25. mSamplers[i]->destroy();
  26. }
  27. }
  28. void VulkanSamplerState::createInternal()
  29. {
  30. FilterOptions minFilter = getProperties().getTextureFiltering(FT_MIN);
  31. FilterOptions magFilter = getProperties().getTextureFiltering(FT_MAG);
  32. FilterOptions mipFilter = getProperties().getTextureFiltering(FT_MIP);
  33. bool anisotropy = minFilter == FO_ANISOTROPIC || magFilter == FO_ANISOTROPIC || mipFilter == FO_ANISOTROPIC;
  34. const UVWAddressingMode& addressMode = getProperties().getTextureAddressingMode();
  35. CompareFunction compareFunc = getProperties().getComparisonFunction();
  36. VkSamplerCreateInfo samplerInfo;
  37. samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
  38. samplerInfo.flags = 0;
  39. samplerInfo.pNext = nullptr;
  40. samplerInfo.magFilter = VulkanUtility::getFilter(magFilter);
  41. samplerInfo.minFilter = VulkanUtility::getFilter(minFilter);
  42. samplerInfo.mipmapMode = VulkanUtility::getMipFilter(mipFilter);
  43. samplerInfo.addressModeU = VulkanUtility::getAddressingMode(addressMode.u);
  44. samplerInfo.addressModeV = VulkanUtility::getAddressingMode(addressMode.v);
  45. samplerInfo.addressModeW = VulkanUtility::getAddressingMode(addressMode.w);
  46. samplerInfo.mipLodBias = getProperties().getTextureMipmapBias();
  47. samplerInfo.anisotropyEnable = anisotropy;
  48. samplerInfo.maxAnisotropy = (float)getProperties().getTextureAnisotropy();
  49. samplerInfo.compareEnable = compareFunc != CMPF_ALWAYS_PASS;
  50. samplerInfo.compareOp = VulkanUtility::getCompareOp(compareFunc);
  51. samplerInfo.minLod = mProperties.getMinimumMip();
  52. samplerInfo.maxLod = mProperties.getMaximumMip();
  53. samplerInfo.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
  54. samplerInfo.unnormalizedCoordinates = false;
  55. VulkanRenderAPI& rapi = static_cast<VulkanRenderAPI&>(RenderAPI::instance());
  56. VulkanDevice* devices[BS_MAX_DEVICES];
  57. VulkanUtility::getDevices(rapi, mDeviceMask, devices);
  58. // Allocate samplers per-device
  59. for (UINT32 i = 0; i < BS_MAX_DEVICES; i++)
  60. {
  61. if (devices[i] == nullptr)
  62. break;
  63. VkSampler sampler;
  64. VkResult result = vkCreateSampler(devices[i]->getLogical(), &samplerInfo, gVulkanAllocator, &sampler);
  65. assert(result == VK_SUCCESS);
  66. mSamplers[i] = devices[i]->getResourceManager().create<VulkanSampler>(sampler);
  67. }
  68. }
  69. }}