3
0

ImageMipChainAsset.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <Atom/RPI.Reflect/Image/ImageMipChainAsset.h>
  9. #include <AzCore/Serialization/SerializeContext.h>
  10. namespace AZ
  11. {
  12. namespace RPI
  13. {
  14. const char* ImageMipChainAsset::DisplayName = "ImageMipChain";
  15. const char* ImageMipChainAsset::Group = "Image";
  16. const char* ImageMipChainAsset::Extension = "imagemipchain";
  17. void ImageMipChainAsset::Reflect(ReflectContext* context)
  18. {
  19. if (auto* serializeContext = azrtti_cast<SerializeContext*>(context))
  20. {
  21. serializeContext->Class<ImageMipChainAsset, Data::AssetData>()
  22. ->Version(0)
  23. ->Field("m_mipLevels", &ImageMipChainAsset::m_mipLevels)
  24. ->Field("m_arraySize", &ImageMipChainAsset::m_arraySize)
  25. ->Field("m_mipToSubImageOffset", &ImageMipChainAsset::m_mipToSubImageOffset)
  26. ->Field("m_subImageLayouts", &ImageMipChainAsset::m_subImageLayouts)
  27. ->Field("m_subImageDataOffsets", &ImageMipChainAsset::m_subImageDataOffsets)
  28. ->Field("m_imageData", &ImageMipChainAsset::m_imageData)
  29. ;
  30. }
  31. }
  32. uint16_t ImageMipChainAsset::GetMipLevelCount() const
  33. {
  34. return m_mipLevels;
  35. }
  36. uint16_t ImageMipChainAsset::GetArraySize() const
  37. {
  38. return m_arraySize;
  39. }
  40. size_t ImageMipChainAsset::GetSubImageCount() const
  41. {
  42. return m_subImageDatas.size();
  43. }
  44. AZStd::span<const uint8_t> ImageMipChainAsset::GetSubImageData(uint32_t mipSlice, uint32_t arraySlice) const
  45. {
  46. return GetSubImageData(mipSlice * m_arraySize + arraySlice);
  47. }
  48. AZStd::span<const uint8_t> ImageMipChainAsset::GetSubImageData(uint32_t subImageIndex) const
  49. {
  50. AZ_Assert(subImageIndex < m_subImageDataOffsets.size() && subImageIndex < m_subImageDatas.size(), "subImageIndex is out of range");
  51. // The offset vector contains an extra sentinel value.
  52. const size_t dataSize = m_subImageDataOffsets[subImageIndex + 1] - m_subImageDataOffsets[subImageIndex];
  53. return AZStd::span<const uint8_t>(reinterpret_cast<const uint8_t*>(m_subImageDatas[subImageIndex].m_data), dataSize);
  54. }
  55. const RHI::ImageSubresourceLayout& ImageMipChainAsset::GetSubImageLayout(uint32_t mipSlice) const
  56. {
  57. return m_subImageLayouts[mipSlice];
  58. }
  59. const ImageMipChainAsset::MipSliceList& ImageMipChainAsset::GetMipSlices() const
  60. {
  61. return m_mipSlices;
  62. }
  63. size_t ImageMipChainAsset::GetImageDataSize() const
  64. {
  65. return m_imageData.size();
  66. }
  67. void ImageMipChainAsset::CopyFrom(const ImageMipChainAsset& source)
  68. {
  69. m_mipLevels = source.m_mipLevels;
  70. m_arraySize = source.m_arraySize;
  71. m_mipToSubImageOffset = source.m_mipToSubImageOffset;
  72. m_subImageLayouts = source.m_subImageLayouts;
  73. m_subImageDataOffsets = source.m_subImageDataOffsets;
  74. m_imageData = source.m_imageData;
  75. Init();
  76. }
  77. void ImageMipChainAsset::Init()
  78. {
  79. const size_t subImageCount = m_mipLevels * m_arraySize;
  80. AZ_Assert(m_status != AssetStatus::Ready, "ImageMipChainAsset has already been initialized!");
  81. AZ_Assert(m_subImageDataOffsets.size() == subImageCount + 1, "Expected image data offsets vector to be subImageCount + 1");
  82. AZ_Assert(m_subImageDatas.empty(), "Expected sub-image data to be empty");
  83. m_subImageDatas.resize(subImageCount);
  84. for (size_t subImageIndex = 0; subImageIndex < subImageCount; ++subImageIndex)
  85. {
  86. const uintptr_t ptrOffset = m_subImageDataOffsets[subImageIndex];
  87. const uintptr_t ptrBase = reinterpret_cast<uintptr_t>(m_imageData.data());
  88. m_subImageDatas[subImageIndex].m_data = reinterpret_cast<const void*>(ptrBase + ptrOffset);
  89. }
  90. for (uint16_t mipSliceIndex = 0; mipSliceIndex < m_mipLevels; ++mipSliceIndex)
  91. {
  92. RHI::StreamingImageMipSlice mipSlice;
  93. mipSlice.m_subresources = AZStd::span<const RHI::StreamingImageSubresourceData>(&m_subImageDatas[m_arraySize * mipSliceIndex], m_arraySize);
  94. mipSlice.m_subresourceLayout = m_subImageLayouts[mipSliceIndex];
  95. m_mipSlices.push_back(mipSlice);
  96. }
  97. }
  98. void ImageMipChainAsset::SetReady()
  99. {
  100. m_status = AssetStatus::Ready;
  101. }
  102. Data::AssetHandler::LoadResult ImageMipChainAssetHandler::LoadAssetData(
  103. const Data::Asset<Data::AssetData>& asset,
  104. AZStd::shared_ptr<Data::AssetDataStream> stream,
  105. const Data::AssetFilterCB& assetLoadFilterCB)
  106. {
  107. Data::AssetHandler::LoadResult result = Base::LoadAssetData(asset, stream, assetLoadFilterCB);
  108. if (result == Data::AssetHandler::LoadResult::LoadComplete)
  109. {
  110. asset.GetAs<ImageMipChainAsset>()->Init();
  111. }
  112. return result;
  113. }
  114. }
  115. }