diff --git a/filament/src/LightData.cpp b/filament/src/LightData.cpp index a067ad5754..d5ce793dc2 100644 --- a/filament/src/LightData.cpp +++ b/filament/src/LightData.cpp @@ -18,10 +18,9 @@ #include "details/Engine.h" -#include +#include -#include -#include +#include namespace filament { @@ -30,24 +29,28 @@ using namespace driver; namespace details { LightData::LightData(FEngine& engine) noexcept - : mEngine(engine), - mLightUib(UibGenerator::getLightsUib()), - mLightsUb(mLightUib) -{ - DriverApi& driverApi = mEngine.getDriverApi(); - mLightUbh = driverApi.createUniformBuffer(mLightUib.getSize()); + : mLightsUb(UibGenerator::getLightsUib()) { + DriverApi& driverApi = engine.getDriverApi(); + mLightUbh = driverApi.createUniformBuffer(mLightsUb.getSize()); driverApi.bindUniforms(BindingPoints::LIGHTS, mLightUbh); } LightData::~LightData() noexcept = default; -void LightData::terminate() { - DriverApi& driverApi = mEngine.getDriverApi(); +void LightData::terminate(FEngine& engine) { + DriverApi& driverApi = engine.getDriverApi(); driverApi.destroyUniformBuffer(mLightUbh); } -void LightData::commitSlow() noexcept { - DriverApi& driverApi = mEngine.getDriverApi(); +void LightData::commit(FEngine& engine) noexcept { + if (UTILS_UNLIKELY(mLightsUb.isDirty())) { + commitSlow(engine); + } + engine.getDriverApi().bindUniforms(BindingPoints::LIGHTS, mLightUbh); +} + +void LightData::commitSlow(FEngine& engine) noexcept { + DriverApi& driverApi = engine.getDriverApi(); driverApi.updateUniformBuffer(mLightUbh, UniformBuffer(mLightsUb)); mLightsUb.clean(); } diff --git a/filament/src/Scene.cpp b/filament/src/Scene.cpp index 276d70de48..6494c90e89 100644 --- a/filament/src/Scene.cpp +++ b/filament/src/Scene.cpp @@ -41,9 +41,9 @@ namespace details { // ------------------------------------------------------------------------------------------------ FScene::FScene(FEngine& engine) : - mEngine(engine) { - mGpuLightData = std::make_unique(engine); - mIndirectLight = engine.getDefaultIndirectLight(); + mEngine(engine), + mIndirectLight(engine.getDefaultIndirectLight()), + mGpuLightData(engine) { } FScene::~FScene() noexcept = default; @@ -164,12 +164,13 @@ void FScene::updateUBOs(utils::Range visibleRenderables) const noexcep } void FScene::terminate(FEngine& engine) { - mGpuLightData->terminate(); // free-up the lights buffer + // free-up the lights buffer + mGpuLightData.terminate(engine); } void FScene::prepareLights(const CameraInfo& camera) noexcept { FLightManager& lcm = mEngine.getLightManager(); - LightData* const gpuLightData = mGpuLightData.get(); + LightData& gpuLightData = mGpuLightData; FScene::LightSoa& lightData = getLightData(); /* @@ -213,7 +214,7 @@ void FScene::prepareLights(const CameraInfo& camera) noexcept { auto const* UTILS_RESTRICT instances = lightData.data(); for (size_t i = DIRECTIONAL_LIGHTS_COUNT, c = lightData.size(); i < c; ++i) { LightData::LightIndex gpuIndex = LightData::LightIndex(i - DIRECTIONAL_LIGHTS_COUNT); - LightData::LightParameters& lp = gpuLightData->getLightParameters(gpuIndex); + LightData::LightParameters& lp = gpuLightData.getLightParameters(gpuIndex); auto li = instances[i]; lp.positionFalloff = { positions[i].xyz, lcm.getSquaredFalloffInv(li) }; lp.colorIntensity = { lcm.getColor(li), lcm.getIntensity(li) }; @@ -221,8 +222,8 @@ void FScene::prepareLights(const CameraInfo& camera) noexcept { lp.spotScaleOffset.xy = { lcm.getSpotParams(li).scaleOffset }; } - gpuLightData->invalidate(0, lightData.size()); - gpuLightData->commit(); + gpuLightData.invalidate(0, lightData.size()); + gpuLightData.commit(mEngine); } void FScene::addEntity(Entity entity) { diff --git a/filament/src/details/LightData.h b/filament/src/details/LightData.h index 6b28cf5c81..e00e8c6364 100644 --- a/filament/src/details/LightData.h +++ b/filament/src/details/LightData.h @@ -17,23 +17,11 @@ #ifndef TNT_FILAMENT_DETAILS_LIGHTDATA_H #define TNT_FILAMENT_DETAILS_LIGHTDATA_H - -#include "details/Engine.h" - -#include -#include - -#include - #include #include -#include - #include -#include - namespace filament { namespace details { @@ -52,15 +40,9 @@ public: explicit LightData(FEngine& engine) noexcept; - void commit() noexcept { - if (UTILS_UNLIKELY(mLightsUb.isDirty())) { - commitSlow(); - } - mEngine.getDriverApi().bindUniforms(BindingPoints::LIGHTS, mLightUbh); - } - - void terminate(); + void commit(FEngine& engine) noexcept; + void terminate(FEngine& engine); LightData(LightData const& rhs) = delete; LightData(LightData&& rhs) = delete; @@ -68,7 +50,7 @@ public: LightData& operator=(LightData&& rhs) = delete; ~LightData() noexcept; - LightParameters& getLightParameters(LightIndex h) { + LightParameters& getLightParameters(LightIndex h) noexcept { // This assumes the layout of the LightsUniforms uniform buffer // it is defined in UibGenerator.cpp LightParameters* lights = (LightParameters *)mLightsUb.getBuffer(); @@ -80,10 +62,7 @@ public: } private: - void commitSlow() noexcept; - - FEngine& mEngine; - UniformInterfaceBlock& mLightUib; + void commitSlow(FEngine& engine) noexcept; Handle mLightUbh; mutable UniformBuffer mLightsUb; }; diff --git a/filament/src/details/Scene.h b/filament/src/details/Scene.h index 31ef1d078b..cdd86cdda6 100644 --- a/filament/src/details/Scene.h +++ b/filament/src/details/Scene.h @@ -23,6 +23,7 @@ #include "components/TransformManager.h" #include "details/Culler.h" +#include "details/LightData.h" #include #include @@ -161,7 +162,7 @@ private: FEngine& mEngine; FSkybox const* mSkybox = nullptr; FIndirectLight const* mIndirectLight = nullptr; - std::unique_ptr mGpuLightData; + LightData mGpuLightData; // list of Entities in the scene. We use a robin_set<> so we can do efficient removes // (a vector<> could work, but removes would be O(n)). robin_set<> iterates almost as