PrimaryNonRenderableVisibility.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // Copyright (C) 2009-2023, 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/Renderer/PrimaryNonRenderableVisibility.h>
  6. #include <AnKi/Renderer/Renderer.h>
  7. #include <AnKi/Scene/GpuSceneArray.h>
  8. #include <AnKi/Shaders/Include/GpuSceneFunctions.h>
  9. namespace anki {
  10. void PrimaryNonRenderableVisibility::populateRenderGraph(RenderingContext& ctx)
  11. {
  12. RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
  13. m_runCtx = {};
  14. for(GpuSceneNonRenderableObjectType type : EnumIterable<GpuSceneNonRenderableObjectType>())
  15. {
  16. U32 objCount = 0;
  17. switch(type)
  18. {
  19. case GpuSceneNonRenderableObjectType::kLight:
  20. objCount = GpuSceneArrays::Light::getSingleton().getElementCount();
  21. break;
  22. case GpuSceneNonRenderableObjectType::kDecal:
  23. objCount = GpuSceneArrays::Decal::getSingleton().getElementCount();
  24. break;
  25. case GpuSceneNonRenderableObjectType::kFogDensityVolume:
  26. objCount = GpuSceneArrays::FogDensityVolume::getSingleton().getElementCount();
  27. break;
  28. case GpuSceneNonRenderableObjectType::kReflectionProbe:
  29. objCount = GpuSceneArrays::ReflectionProbe::getSingleton().getElementCount();
  30. break;
  31. case GpuSceneNonRenderableObjectType::kGlobalIlluminationProbe:
  32. objCount = GpuSceneArrays::GlobalIlluminationProbe::getSingleton().getElementCount();
  33. break;
  34. default:
  35. ANKI_ASSERT(0);
  36. }
  37. if(objCount == 0)
  38. {
  39. continue;
  40. }
  41. GpuVisibilityNonRenderablesInput in;
  42. in.m_passesName = "NonRenderableVisibility";
  43. in.m_objectType = type;
  44. in.m_viewProjectionMat = ctx.m_matrices.m_viewProjection;
  45. in.m_hzbRt = nullptr; // TODO
  46. in.m_rgraph = &rgraph;
  47. const GpuSceneNonRenderableObjectTypeWithFeedback feedbackType = toGpuSceneNonRenderableObjectTypeWithFeedback(type);
  48. if(feedbackType != GpuSceneNonRenderableObjectTypeWithFeedback::kCount)
  49. {
  50. // Read feedback UUIDs from the GPU
  51. DynamicArray<U32, MemoryPoolPtrWrapper<StackMemoryPool>> readbackData(ctx.m_tempPool);
  52. getRenderer().getReadbackManager().readMostRecentData(m_readbacks[feedbackType], readbackData);
  53. if(readbackData.getSize())
  54. {
  55. ANKI_ASSERT(readbackData.getSize() > 1);
  56. const U32 uuidCount = readbackData[0];
  57. if(uuidCount)
  58. {
  59. m_runCtx.m_uuids[feedbackType] = WeakArray<U32>(&readbackData[1], readbackData[0]);
  60. // Transfer ownership
  61. WeakArray<U32> dummy;
  62. readbackData.moveAndReset(dummy);
  63. }
  64. }
  65. // Allocate feedback buffer for this frame
  66. in.m_cpuFeedbackBuffer.m_range = (objCount + 1) * sizeof(U32);
  67. getRenderer().getReadbackManager().allocateData(m_readbacks[feedbackType], in.m_cpuFeedbackBuffer.m_range,
  68. in.m_cpuFeedbackBuffer.m_buffer, in.m_cpuFeedbackBuffer.m_offset);
  69. }
  70. GpuVisibilityNonRenderablesOutput out;
  71. getRenderer().getGpuVisibilityNonRenderables().populateRenderGraph(in, out);
  72. m_runCtx.m_visOutBufferHandle[type] = out.m_visiblesBufferHandle;
  73. }
  74. }
  75. } // end namespace anki