ImageDescriptor.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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/RHI.Reflect/ImageDescriptor.h>
  9. #include <AzCore/Serialization/SerializeContext.h>
  10. #include <AzCore/std/algorithm.h>
  11. #include <AzCore/Utils/TypeHash.h>
  12. namespace AZ::RHI
  13. {
  14. ImageBindFlags GetImageBindFlags(ScopeAttachmentUsage usage, ScopeAttachmentAccess access)
  15. {
  16. switch (usage)
  17. {
  18. case ScopeAttachmentUsage::RenderTarget:
  19. return ImageBindFlags::Color;
  20. case ScopeAttachmentUsage::DepthStencil:
  21. return ImageBindFlags::DepthStencil;
  22. case ScopeAttachmentUsage::Shader:
  23. switch (access)
  24. {
  25. case ScopeAttachmentAccess::ReadWrite:
  26. return ImageBindFlags::ShaderReadWrite;
  27. case ScopeAttachmentAccess::Read:
  28. return ImageBindFlags::ShaderRead;
  29. case ScopeAttachmentAccess::Write:
  30. return ImageBindFlags::ShaderWrite;
  31. }
  32. break;
  33. case ScopeAttachmentUsage::Copy:
  34. switch (access)
  35. {
  36. case ScopeAttachmentAccess::Read:
  37. return ImageBindFlags::CopyRead;
  38. case ScopeAttachmentAccess::Write:
  39. return ImageBindFlags::CopyWrite;
  40. }
  41. break;
  42. case ScopeAttachmentUsage::Resolve:
  43. return ImageBindFlags::CopyWrite;
  44. case ScopeAttachmentUsage::ShadingRate:
  45. return ImageBindFlags::ShadingRate;
  46. case ScopeAttachmentUsage::Predication:
  47. case ScopeAttachmentUsage::Indirect:
  48. case ScopeAttachmentUsage::SubpassInput:
  49. case ScopeAttachmentUsage::InputAssembly:
  50. case ScopeAttachmentUsage::Uninitialized:
  51. break;
  52. default:
  53. break;
  54. }
  55. return ImageBindFlags::None;
  56. }
  57. void ImageDescriptor::Reflect(AZ::ReflectContext* context)
  58. {
  59. if (auto* serializeContext = azrtti_cast<SerializeContext*>(context))
  60. {
  61. serializeContext->Class<ImageDescriptor>()
  62. ->Version(2)
  63. ->Field("BindFlags", &ImageDescriptor::m_bindFlags)
  64. ->Field("Dimension", &ImageDescriptor::m_dimension)
  65. ->Field("Size", &ImageDescriptor::m_size)
  66. ->Field("ArraySize", &ImageDescriptor::m_arraySize)
  67. ->Field("MipLevels", &ImageDescriptor::m_mipLevels)
  68. ->Field("Format", &ImageDescriptor::m_format)
  69. ->Field("MultisampleState", &ImageDescriptor::m_multisampleState)
  70. ->Field("SharedQueueMask", &ImageDescriptor::m_sharedQueueMask)
  71. ->Field("IsCubemap", &ImageDescriptor::m_isCubemap)
  72. ;
  73. }
  74. }
  75. HashValue64 ImageDescriptor::GetHash(HashValue64 seed /* = 0 */) const
  76. {
  77. return TypeHash64(*this, seed);
  78. }
  79. ImageDescriptor ImageDescriptor::Create1D(
  80. ImageBindFlags bindFlags,
  81. uint32_t width,
  82. Format format)
  83. {
  84. ImageDescriptor descriptor;
  85. descriptor.m_bindFlags = bindFlags;
  86. descriptor.m_dimension = ImageDimension::Image1D;
  87. descriptor.m_size.m_width = width;
  88. descriptor.m_format = format;
  89. return descriptor;
  90. }
  91. ImageDescriptor ImageDescriptor::Create1DArray(
  92. ImageBindFlags bindFlags,
  93. uint32_t width,
  94. uint16_t arraySize,
  95. Format format)
  96. {
  97. ImageDescriptor descriptor;
  98. descriptor.m_bindFlags = bindFlags;
  99. descriptor.m_dimension = ImageDimension::Image1D;
  100. descriptor.m_size.m_width = width;
  101. descriptor.m_arraySize = arraySize;
  102. descriptor.m_format = format;
  103. return descriptor;
  104. }
  105. ImageDescriptor ImageDescriptor::Create2D(
  106. ImageBindFlags bindFlags,
  107. uint32_t width,
  108. uint32_t height,
  109. Format format)
  110. {
  111. ImageDescriptor descriptor;
  112. descriptor.m_bindFlags = bindFlags;
  113. descriptor.m_size.m_width = width;
  114. descriptor.m_size.m_height = height;
  115. descriptor.m_format = format;
  116. return descriptor;
  117. }
  118. ImageDescriptor ImageDescriptor::Create2DArray(
  119. ImageBindFlags bindFlags,
  120. uint32_t width,
  121. uint32_t height,
  122. uint16_t arraySize,
  123. Format format)
  124. {
  125. ImageDescriptor descriptor;
  126. descriptor.m_bindFlags = bindFlags;
  127. descriptor.m_size.m_width = width;
  128. descriptor.m_size.m_height = height;
  129. descriptor.m_arraySize = arraySize;
  130. descriptor.m_format = format;
  131. return descriptor;
  132. }
  133. ImageDescriptor ImageDescriptor::CreateCubemap(
  134. ImageBindFlags bindFlags,
  135. uint32_t width,
  136. Format format)
  137. {
  138. ImageDescriptor descriptor;
  139. descriptor.m_bindFlags = bindFlags;
  140. descriptor.m_size.m_width = width;
  141. descriptor.m_size.m_height = width;
  142. descriptor.m_arraySize = NumCubeMapSlices;
  143. descriptor.m_format = format;
  144. descriptor.m_isCubemap = true;
  145. return descriptor;
  146. }
  147. ImageDescriptor ImageDescriptor::CreateCubemapArray(
  148. ImageBindFlags bindFlags,
  149. uint32_t width,
  150. uint16_t arraySize,
  151. Format format)
  152. {
  153. ImageDescriptor descriptor;
  154. descriptor.m_bindFlags = bindFlags;
  155. descriptor.m_size.m_width = width;
  156. descriptor.m_size.m_height = width;
  157. descriptor.m_arraySize = NumCubeMapSlices * arraySize;
  158. descriptor.m_format = format;
  159. descriptor.m_isCubemap = true;
  160. return descriptor;
  161. }
  162. ImageDescriptor ImageDescriptor::Create3D(
  163. ImageBindFlags bindFlags,
  164. uint32_t width,
  165. uint32_t height,
  166. uint32_t depth,
  167. Format format)
  168. {
  169. ImageDescriptor descriptor;
  170. descriptor.m_bindFlags = bindFlags;
  171. descriptor.m_dimension = ImageDimension::Image3D;
  172. descriptor.m_size.m_width = width;
  173. descriptor.m_size.m_height = height;
  174. descriptor.m_size.m_depth = depth;
  175. descriptor.m_format = format;
  176. return descriptor;
  177. }
  178. }