BsVulkanRenderTexture.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsVulkanRenderTexture.h"
  4. #include "BsVulkanFramebuffer.h"
  5. #include "BsVulkanTexture.h"
  6. #include "BsVulkanUtility.h"
  7. #include "BsVulkanRenderAPI.h"
  8. #include "BsVulkanDevice.h"
  9. namespace bs
  10. {
  11. VulkanRenderTextureCore::VulkanRenderTextureCore(const RENDER_TEXTURE_DESC_CORE& desc, UINT32 deviceIdx)
  12. :RenderTextureCore(desc, deviceIdx), mProperties(desc, false), mDeviceIdx(deviceIdx), mFramebuffer(nullptr)
  13. {
  14. }
  15. VulkanRenderTextureCore::~VulkanRenderTextureCore()
  16. {
  17. mFramebuffer->destroy();
  18. }
  19. void VulkanRenderTextureCore::initialize()
  20. {
  21. RenderTextureCore::initialize();
  22. VULKAN_FRAMEBUFFER_DESC fbDesc;
  23. fbDesc.width = mProperties.getWidth();
  24. fbDesc.height = mProperties.getHeight();
  25. fbDesc.layers = mProperties.getNumSlices();
  26. fbDesc.numSamples = mProperties.getMultisampleCount() > 1 ? mProperties.getMultisampleCount() : 1;
  27. fbDesc.offscreen = true;
  28. for (UINT32 i = 0; i < BS_MAX_MULTIPLE_RENDER_TARGETS; ++i)
  29. {
  30. if (mColorSurfaces[i] == nullptr)
  31. continue;
  32. const SPtr<TextureView>& view = mColorSurfaces[i];
  33. VulkanTextureCore* texture = static_cast<VulkanTextureCore*>(view->getTexture().get());
  34. VulkanImage* image = texture->getResource(mDeviceIdx);
  35. if (image == nullptr)
  36. continue;
  37. TextureSurface surface;
  38. surface.arraySlice = view->getFirstArraySlice();
  39. surface.numArraySlices = view->getNumArraySlices();
  40. surface.mipLevel = view->getMostDetailedMip();
  41. surface.numMipLevels = view->getNumMips();
  42. fbDesc.color[i].image = image;
  43. fbDesc.color[i].view = image->getView(surface);
  44. fbDesc.color[i].format = VulkanUtility::getPixelFormat(texture->getProperties().getFormat());
  45. fbDesc.color[i].baseLayer = view->getFirstArraySlice();
  46. }
  47. if(mDepthStencilSurface != nullptr)
  48. {
  49. const SPtr<TextureView>& view = mDepthStencilSurface;
  50. VulkanTextureCore* texture = static_cast<VulkanTextureCore*>(view->getTexture().get());
  51. VulkanImage* image = texture->getResource(mDeviceIdx);
  52. if (image != nullptr)
  53. {
  54. TextureSurface surface;
  55. surface.arraySlice = view->getFirstArraySlice();
  56. surface.numArraySlices = view->getNumArraySlices();
  57. surface.mipLevel = view->getMostDetailedMip();
  58. surface.numMipLevels = view->getNumMips();
  59. fbDesc.depth.image = image;
  60. fbDesc.depth.view = image->getView(surface);
  61. fbDesc.depth.format = VulkanUtility::getPixelFormat(texture->getProperties().getFormat());
  62. fbDesc.depth.baseLayer = view->getFirstArraySlice();
  63. }
  64. }
  65. VulkanRenderAPI& rapi = static_cast<VulkanRenderAPI&>(RenderAPICore::instance());
  66. SPtr<VulkanDevice> device = rapi._getDevice(mDeviceIdx);
  67. mFramebuffer = device->getResourceManager().create<VulkanFramebuffer>(fbDesc);
  68. }
  69. void VulkanRenderTextureCore::getCustomAttribute(const String& name, void* data) const
  70. {
  71. if (name == "FB")
  72. {
  73. VulkanFramebuffer** fb = (VulkanFramebuffer**)data;
  74. *fb = mFramebuffer;
  75. return;
  76. }
  77. }
  78. VulkanRenderTexture::VulkanRenderTexture(const RENDER_TEXTURE_DESC& desc)
  79. :RenderTexture(desc), mProperties(desc, false)
  80. {
  81. }
  82. }