BasicRHIComponent.h 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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. #pragma once
  9. #include <AtomSampleComponent.h>
  10. #include <AzCore/std/smart_ptr/shared_ptr.h>
  11. #include <Atom/RPI.Public/Image/StreamingImage.h>
  12. #include <Atom/RHI/RHISystemInterface.h>
  13. #include <Atom/RPI.Public/Pass/RenderPass.h>
  14. #include <Atom/RPI.Public/Shader/Shader.h>
  15. #include <Atom/RPI.Public/Shader/ShaderResourceGroup.h>
  16. #include <Atom/RPI.Public/WindowContext.h>
  17. #include <Atom/RHI/Factory.h>
  18. #include <Atom/RHI/FrameScheduler.h>
  19. #include <Atom/RHI/ScopeProducer.h>
  20. #include <Atom/RHI.Reflect/Format.h>
  21. #include <AtomCore/Instance/InstanceId.h>
  22. #include <AzCore/Math/Matrix4x4.h>
  23. #include <AzCore/Math/Vector3.h>
  24. #include <AzCore/Math/Vector4.h>
  25. namespace AZ
  26. {
  27. class AssetCollectionAsyncLoader;
  28. namespace RHI
  29. {
  30. class Device;
  31. }
  32. namespace RPI
  33. {
  34. class PipelineStateCache;
  35. }
  36. }
  37. namespace AtomSampleViewer
  38. {
  39. class BasicRHIComponent;
  40. // Using RenderPass instead of Pass so we can have a scope to clear RenderTarget
  41. class RHISamplePass
  42. : public AZ::RPI::RenderPass
  43. {
  44. using Base = AZ::RPI::RenderPass;
  45. AZ_RPI_PASS(RHISamplePass);
  46. public:
  47. AZ_RTTI(RHISamplePass, "{7F70BF4C-F5B3-453A-AEC4-3F5599BAFC16}", Pass);
  48. AZ_CLASS_ALLOCATOR(RHISamplePass, AZ::SystemAllocator, 0);
  49. virtual ~RHISamplePass();
  50. //! Creates a new pass without a PassTemplate
  51. static AZ::RPI::Ptr<RHISamplePass> Create(const AZ::RPI::PassDescriptor& descriptor);
  52. void SetRHISample(BasicRHIComponent* sample);
  53. // Pass overrides
  54. const AZ::RPI::PipelineViewTag& GetPipelineViewTag() const override;
  55. // Return the view index of the pass
  56. uint32_t GetViewIndex() const;
  57. void SetViewIndex(const uint32_t viewIndex);
  58. protected:
  59. explicit RHISamplePass(const AZ::RPI::PassDescriptor& descriptor);
  60. // --- Pass Behaviour Overrides ---
  61. void BuildInternal() override; // build attachment
  62. void FrameBeginInternal(FramePrepareParams params) override; // import scopes
  63. BasicRHIComponent* m_rhiSample = nullptr;
  64. AZ::RPI::Ptr<AZ::RPI::PassAttachment> m_outputAttachment;
  65. AZ::RPI::PipelineViewTag m_pipelineViewTag;
  66. // Used to determine view index for XR sample
  67. uint32_t m_viewIndex = 0;
  68. };
  69. class BasicRHIComponent
  70. : public AtomSampleComponent
  71. , public AZ::RHI::RHISystemNotificationBus::Handler
  72. {
  73. friend class RHISamplePass;
  74. public:
  75. AZ_RTTI(BasicRHIComponent, "{FAB340E4-2D91-48CD-A7BC-81ED25721415}", AtomSampleComponent);
  76. BasicRHIComponent() = default;
  77. ~BasicRHIComponent() override = default;
  78. // Creates a 3D image from 2D images. All 2D images are required to have the same format and layout
  79. static void CreateImage3dData(
  80. AZStd::vector<uint8_t>& data,
  81. AZ::RHI::DeviceImageSubresourceLayout& layout,
  82. AZ::RHI::Format& format,
  83. AZStd::vector<const char*>&& imageAssetPaths);
  84. void SetOutputInfo(uint32_t width, uint32_t height, AZ::RHI::Format format, AZ::RHI::AttachmentId attachmentId);
  85. bool IsSupportedRHISamplePipeline();
  86. float GetViewportWidth();
  87. float GetViewportHeight();
  88. void SetViewIndex(const uint32_t viewIndex);
  89. protected:
  90. AZ_DISABLE_COPY(BasicRHIComponent);
  91. struct VertexPosition;
  92. struct VertexColor;
  93. struct VertexU;
  94. struct VertexUV;
  95. struct VertexUVW;
  96. struct VertexUVWX;
  97. struct VertexNormal;
  98. // Component
  99. virtual void Activate() override = 0;
  100. virtual void Deactivate() override = 0;
  101. virtual bool ReadInConfig(const AZ::ComponentConfig* baseConfig) override;
  102. // RHISystemNotificationBus::Handler
  103. virtual void OnFramePrepare(AZ::RHI::FrameGraphBuilder& frameGraphBuilder) override;
  104. // virtual function which is called by OnFramePrepare
  105. virtual void FrameBeginInternal([[maybe_unused]] AZ::RHI::FrameGraphBuilder& frameGraphBuilder) {};
  106. // Buffer Setting
  107. void SetVertexPosition(VertexPosition* positionBuffer, int bufferIndex, float x, float y, float z);
  108. void SetVertexPosition(VertexPosition* positionBuffer, int bufferIndex, const AZ::Vector3& position);
  109. void SetVertexPosition(VertexPosition* positionBuffer, int bufferIndex, const VertexPosition& position);
  110. void SetVertexColor(VertexColor* colorBuffer, int bufferIndex, float r, float g, float b, float a);
  111. void SetVertexColor(VertexColor* colorBuffer, int bufferIndex, const AZ::Vector4& color);
  112. void SetVertexColor(VertexColor* colorBuffer, int bufferIndex, const VertexColor& color);
  113. void SetVertexIndex(uint16_t* indexBuffer, int bufferIndex, const uint16_t index);
  114. void SetVertexU(VertexU* uBuffer, int bufferIndex, float u);
  115. void SetVertexUV(VertexUV* uvBuffer, int bufferIndex, float u, float v);
  116. void SetVertexUVW(VertexUVW* uvwBuffer, int bufferIndex, float u, float v, float w);
  117. void SetVertexUVW(VertexUVW* uvwBuffer, int bufferIndex, const AZ::Vector3& uvw);
  118. void SetVertexUVWX(VertexUVWX* uvwxBuffer, int bufferIndex, float u, float v, float w, float x);
  119. void SetVertexNormal(VertexNormal* normalBuffer, int bufferIndex, float nx, float ny, float nz);
  120. void SetVertexNormal(VertexNormal* normalBuffer, int bufferIndex, const AZ::Vector3& normal);
  121. void SetVertexIndexIncreasing(uint16_t* indexBuffer, size_t bufferSize);
  122. void SetFullScreenRect(VertexPosition* positionBuffer, VertexUV* uvBuffer, uint16_t* indexBuffer);
  123. void SetCube(VertexPosition* positionBuffer, VertexColor* colorBuffer, VertexNormal* normalBuffer, uint16_t* indexBuffer);
  124. AZ::Matrix4x4 CreateViewMatrix(AZ::Vector3 eye, AZ::Vector3 up, AZ::Vector3 lookAt);
  125. // Shader
  126. AZ::Data::Instance<AZ::RPI::Shader> LoadShader(const char* shaderFilePath, const char* sampleName, const AZ::Name* supervariantName = nullptr);
  127. AZ::Data::Instance<AZ::RPI::Shader> LoadShader(const AZ::AssetCollectionAsyncLoader& assetLoadMgr, const char* shaderFilePath, const char* sampleName);
  128. static AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> CreateShaderResourceGroup(AZ::Data::Instance<AZ::RPI::Shader> shader, const char* shaderResourceGroupId, const char* sampleName);
  129. void FindShaderInputIndex(
  130. AZ::RHI::ShaderInputConstantIndex* shaderInputConstIndex,
  131. AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> shaderResourceGroup,
  132. const AZ::Name& shaderInputName,
  133. const char* componentName
  134. );
  135. void FindShaderInputIndex(
  136. AZ::RHI::ShaderInputImageIndex* shaderInputImageIndex,
  137. AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> shaderResourceGroup,
  138. const AZ::Name& shaderInputName,
  139. const char* componentName
  140. );
  141. void FindShaderInputIndex(
  142. AZ::RHI::ShaderInputBufferIndex* shaderInputBufferIndex,
  143. AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> shaderResourceGroup,
  144. const AZ::Name& shaderInputName,
  145. const char* componentName
  146. );
  147. void FindShaderInputIndex(
  148. AZ::RHI::ShaderInputSamplerIndex* shaderInputSamplerIndex,
  149. AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> shaderResourceGroup,
  150. const AZ::Name& shaderInputName,
  151. const char* componentName
  152. );
  153. // set output info from m_windowContext
  154. void SetOutputInfoFromWindowContext();
  155. // setup viewport and scissor from output width and height
  156. void UpdateViewportAndScissor();
  157. // Texture
  158. AZ::Data::Instance<AZ::RPI::StreamingImage> LoadStreamingImage(const char* textureFilePath, const char* sampleName);
  159. // Input Assembly Data
  160. struct VertexPosition
  161. {
  162. float m_position[3];
  163. };
  164. struct VertexColor
  165. {
  166. float m_color[4];
  167. };
  168. struct VertexNormal
  169. {
  170. float m_normal[3];
  171. };
  172. struct VertexU
  173. {
  174. float m_u;
  175. };
  176. struct VertexUV
  177. {
  178. float m_uv[2];
  179. };
  180. struct VertexUVW
  181. {
  182. float m_uvw[3];
  183. };
  184. struct VertexUVWX
  185. {
  186. float m_uvwx[4];
  187. };
  188. // Variables
  189. AZStd::shared_ptr<AZ::RPI::WindowContext> m_windowContext;
  190. AZStd::vector<AZStd::shared_ptr<AZ::RHI::ScopeProducer>> m_scopeProducers;
  191. // The output (render target) info
  192. uint32_t m_outputWidth = 1920;
  193. uint32_t m_outputHeight = 1080;
  194. AZ::RHI::Format m_outputFormat;
  195. AZ::RHI::AttachmentId m_outputAttachmentId;
  196. AZ::RHI::Viewport m_viewport;
  197. AZ::RHI::Scissor m_scissor;
  198. // whether this sample supports RHI sample render pipeline or not
  199. bool m_supportRHISamplePipeline = false;
  200. // view index. Used by XR related samples
  201. uint32_t m_viewIndex = 0;
  202. };
  203. } // namespace AtomSampleViewer