RenderComponent.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. void RenderComponent::allocateAndSetupUniforms(const MaterialResourcePtr& mtl, const RenderQueueDrawContext& ctx,
  14. ConstWeakArray<Mat3x4> transforms, ConstWeakArray<Mat3x4> prevTransforms,
  15. StagingGpuMemoryPool& alloc)
  16. {
  17. ANKI_ASSERT(transforms.getSize() <= MAX_INSTANCE_COUNT);
  18. ANKI_ASSERT(prevTransforms.getSize() == transforms.getSize());
  19. CommandBufferPtr cmdb = ctx.m_commandBuffer;
  20. const U32 set = MATERIAL_SET_EXTERNAL;
  21. cmdb->bindSampler(set, MATERIAL_BINDING_GLOBAL_SAMPLER, ctx.m_sampler);
  22. cmdb->bindUniformBuffer(set, MATERIAL_BINDING_GLOBAL_UNIFORMS, ctx.m_globalUniforms.m_buffer,
  23. ctx.m_globalUniforms.m_offset, ctx.m_globalUniforms.m_range);
  24. // Fill the RenderableGpuView
  25. const U32 renderableGpuViewsUboSize = sizeof(RenderableGpuView) * transforms.getSize();
  26. if(renderableGpuViewsUboSize)
  27. {
  28. StagingGpuMemoryToken token;
  29. RenderableGpuView* renderableGpuViews = static_cast<RenderableGpuView*>(
  30. alloc.allocateFrame(renderableGpuViewsUboSize, StagingGpuMemoryType::UNIFORM, token));
  31. ANKI_ASSERT(isAligned(alignof(RenderableGpuView), renderableGpuViews));
  32. cmdb->bindUniformBuffer(set, MATERIAL_BINDING_RENDERABLE_GPU_VIEW, token.m_buffer, token.m_offset,
  33. token.m_range);
  34. for(U32 i = 0; i < transforms.getSize(); ++i)
  35. {
  36. memcpy(&renderableGpuViews->m_worldTransform, &transforms[i], sizeof(renderableGpuViews->m_worldTransform));
  37. memcpy(&renderableGpuViews->m_previousWorldTransform, &prevTransforms[i],
  38. sizeof(renderableGpuViews->m_previousWorldTransform));
  39. renderableGpuViews->m_worldRotation = transforms[i].getRotationPart();
  40. ++renderableGpuViews;
  41. }
  42. }
  43. // Local uniforms
  44. const U32 localUniformsUboSize = U32(mtl->getPrefilledLocalUniforms().getSizeInBytes());
  45. StagingGpuMemoryToken token;
  46. U8* const localUniformsBegin =
  47. (localUniformsUboSize != 0)
  48. ? static_cast<U8*>(alloc.allocateFrame(localUniformsUboSize, StagingGpuMemoryType::UNIFORM, token))
  49. : nullptr;
  50. if(localUniformsUboSize)
  51. {
  52. cmdb->bindUniformBuffer(set, MATERIAL_BINDING_LOCAL_UNIFORMS, token.m_buffer, token.m_offset, token.m_range);
  53. }
  54. // Iterate variables
  55. for(const MaterialVariable& mvar : mtl->getVariables())
  56. {
  57. switch(mvar.getDataType())
  58. {
  59. case ShaderVariableDataType::F32:
  60. {
  61. const F32 val = mvar.getValue<F32>();
  62. memcpy(localUniformsBegin + mvar.getOffsetInLocalUniforms(), &val, sizeof(val));
  63. break;
  64. }
  65. case ShaderVariableDataType::VEC2:
  66. {
  67. const Vec2 val = mvar.getValue<Vec2>();
  68. memcpy(localUniformsBegin + mvar.getOffsetInLocalUniforms(), &val, sizeof(val));
  69. break;
  70. }
  71. case ShaderVariableDataType::VEC3:
  72. {
  73. const Vec3 val = mvar.getValue<Vec3>();
  74. memcpy(localUniformsBegin + mvar.getOffsetInLocalUniforms(), &val, sizeof(val));
  75. break;
  76. }
  77. case ShaderVariableDataType::VEC4:
  78. {
  79. const Vec4 val = mvar.getValue<Vec4>();
  80. memcpy(localUniformsBegin + mvar.getOffsetInLocalUniforms(), &val, sizeof(val));
  81. break;
  82. }
  83. case ShaderVariableDataType::TEXTURE_2D:
  84. case ShaderVariableDataType::TEXTURE_2D_ARRAY:
  85. case ShaderVariableDataType::TEXTURE_3D:
  86. case ShaderVariableDataType::TEXTURE_CUBE:
  87. {
  88. cmdb->bindTexture(set, mvar.getTextureBinding(), mvar.getValue<ImageResourcePtr>()->getTextureView());
  89. break;
  90. }
  91. default:
  92. ANKI_ASSERT(0);
  93. } // end switch
  94. }
  95. }
  96. } // end namespace anki