RenderComponent.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. // Copyright (C) 2009-2022, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Scene/Components/RenderComponent.h>
  6. #include <AnKi/Scene/SceneNode.h>
  7. #include <AnKi/Resource/ImageResource.h>
  8. #include <AnKi/Resource/ResourceManager.h>
  9. #include <AnKi/Util/Logger.h>
  10. #include <AnKi/Shaders/Include/GpuSceneTypes.h>
  11. namespace anki {
  12. ANKI_SCENE_COMPONENT_STATICS(RenderComponent)
  13. RenderComponent::RenderComponent(SceneNode* node)
  14. : SceneComponent(node, getStaticClassId())
  15. {
  16. getExternalSubsystems(*node).m_gpuSceneMemoryPool->allocate(sizeof(RenderableGpuView2), sizeof(U32),
  17. m_gpuSceneRenderableGpuView);
  18. }
  19. void RenderComponent::allocateAndSetupUniforms(const MaterialResourcePtr& mtl, const RenderQueueDrawContext& ctx,
  20. ConstWeakArray<Mat3x4> transforms, ConstWeakArray<Mat3x4> prevTransforms,
  21. StagingGpuMemoryPool& alloc, const Vec4& positionScaleAndTranslation)
  22. {
  23. ANKI_ASSERT(transforms.getSize() <= kMaxInstanceCount);
  24. ANKI_ASSERT(prevTransforms.getSize() == transforms.getSize());
  25. CommandBufferPtr cmdb = ctx.m_commandBuffer;
  26. const U32 set = kMaterialSetLocal;
  27. // Fill the RenderableGpuView
  28. const U32 renderableGpuViewsUboSize = sizeof(RenderableGpuView) * transforms.getSize();
  29. if(renderableGpuViewsUboSize)
  30. {
  31. StagingGpuMemoryToken token;
  32. RenderableGpuView* renderableGpuViews = static_cast<RenderableGpuView*>(
  33. alloc.allocateFrame(renderableGpuViewsUboSize, StagingGpuMemoryType::kUniform, token));
  34. ANKI_ASSERT(isAligned(alignof(RenderableGpuView), renderableGpuViews));
  35. cmdb->bindUniformBuffer(set, kMaterialBindingRenderableGpuView, token.m_buffer, token.m_offset, token.m_range);
  36. for(U32 i = 0; i < transforms.getSize(); ++i)
  37. {
  38. memcpy(&renderableGpuViews->m_worldTransform, &transforms[i], sizeof(renderableGpuViews->m_worldTransform));
  39. memcpy(&renderableGpuViews->m_previousWorldTransform, &prevTransforms[i],
  40. sizeof(renderableGpuViews->m_previousWorldTransform));
  41. renderableGpuViews->m_positionScaleF32AndTranslationVec3 = positionScaleAndTranslation;
  42. ++renderableGpuViews;
  43. }
  44. }
  45. // Local uniforms
  46. const U32 localUniformsUboSize = U32(mtl->getPrefilledLocalUniforms().getSizeInBytes());
  47. StagingGpuMemoryToken token;
  48. U8* const localUniformsBegin =
  49. (localUniformsUboSize != 0)
  50. ? static_cast<U8*>(alloc.allocateFrame(localUniformsUboSize, StagingGpuMemoryType::kStorage, token))
  51. : nullptr;
  52. if(localUniformsUboSize)
  53. {
  54. cmdb->bindStorageBuffer(set, kMaterialBindingLocalUniforms, token.m_buffer, token.m_offset, token.m_range);
  55. }
  56. // Iterate variables
  57. for(const MaterialVariable& mvar : mtl->getVariables())
  58. {
  59. switch(mvar.getDataType())
  60. {
  61. case ShaderVariableDataType::kU32:
  62. {
  63. const U32 val = mvar.getValue<U32>();
  64. memcpy(localUniformsBegin + mvar.getOffsetInLocalUniforms(), &val, sizeof(val));
  65. break;
  66. }
  67. case ShaderVariableDataType::kF32:
  68. {
  69. const F32 val = mvar.getValue<F32>();
  70. memcpy(localUniformsBegin + mvar.getOffsetInLocalUniforms(), &val, sizeof(val));
  71. break;
  72. }
  73. case ShaderVariableDataType::kVec2:
  74. {
  75. const Vec2 val = mvar.getValue<Vec2>();
  76. memcpy(localUniformsBegin + mvar.getOffsetInLocalUniforms(), &val, sizeof(val));
  77. break;
  78. }
  79. case ShaderVariableDataType::kVec3:
  80. {
  81. const Vec3 val = mvar.getValue<Vec3>();
  82. memcpy(localUniformsBegin + mvar.getOffsetInLocalUniforms(), &val, sizeof(val));
  83. break;
  84. }
  85. case ShaderVariableDataType::kVec4:
  86. {
  87. const Vec4 val = mvar.getValue<Vec4>();
  88. memcpy(localUniformsBegin + mvar.getOffsetInLocalUniforms(), &val, sizeof(val));
  89. break;
  90. }
  91. case ShaderVariableDataType::kTexture2D:
  92. case ShaderVariableDataType::kTexture2DArray:
  93. case ShaderVariableDataType::kTexture3D:
  94. case ShaderVariableDataType::kTextureCube:
  95. {
  96. cmdb->bindTexture(set, mvar.getTextureBinding(), mvar.getValue<ImageResourcePtr>()->getTextureView());
  97. break;
  98. }
  99. default:
  100. ANKI_ASSERT(0);
  101. } // end switch
  102. }
  103. }
  104. void RenderComponent::onDestroy(SceneNode& node)
  105. {
  106. getExternalSubsystems(node).m_gpuSceneMemoryPool->free(m_gpuSceneRenderableGpuView);
  107. }
  108. } // end namespace anki