BsVulkanSamplerState.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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 BansheeEngine
  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. VulkanSamplerStateCore::VulkanSamplerStateCore(const SAMPLER_STATE_DESC& desc, GpuDeviceFlags deviceMask)
  17. :SamplerStateCore(desc, deviceMask), mSamplers(), mDeviceMask(deviceMask)
  18. { }
  19. VulkanSamplerStateCore::~VulkanSamplerStateCore()
  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 VulkanSamplerStateCore::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&>(RenderAPICore::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. void VulkanSamplerStateCore::getHandles(GpuDeviceFlags mask, VkSampler(&handles)[BS_MAX_LINKED_DEVICES],
  70. UINT32& numHandles)
  71. {
  72. numHandles = 0;
  73. for (UINT32 i = 0; i < BS_MAX_DEVICES; i++)
  74. {
  75. UINT32 deviceMask = 1 << i;
  76. if ((mask & deviceMask) == 0 || mSamplers[i] == nullptr)
  77. continue;
  78. handles[numHandles++] = mSamplers[i]->getHandle();
  79. if (numHandles >= BS_MAX_LINKED_DEVICES)
  80. break;
  81. }
  82. }
  83. }