2026-04-27 23:45:05 +02:00
|
|
|
|
/*
|
|
|
|
|
|
EngineBufferManager(Test) - cover the interface to a central buffer manager
|
|
|
|
|
|
|
|
|
|
|
|
Copyright (C)
|
|
|
|
|
|
2026, Hermann Vosseler <Ichthyostega@web.de>
|
|
|
|
|
|
|
|
|
|
|
|
**Lumiera** is free software; you can redistribute it and/or modify it
|
|
|
|
|
|
under the terms of the GNU General Public License as published by the
|
|
|
|
|
|
Free Software Foundation; either version 2 of the License, or (at your
|
|
|
|
|
|
option) any later version. See the file COPYING for further details.
|
|
|
|
|
|
|
|
|
|
|
|
* *****************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
/** @file engine-buffer-manager-test.cpp
|
|
|
|
|
|
** unit test \ref EngineBufferManager_test
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "test/run.hpp"
|
|
|
|
|
|
#include "test/test-helper.hpp"
|
|
|
|
|
|
//#include "vault/mem/engine-buffer-metadata.hpp"
|
|
|
|
|
|
#include "vault/mem/engine-buffer-manager.hpp"
|
2026-05-08 01:58:36 +02:00
|
|
|
|
#include "vault/mem/engine-buffer-allocator.hpp"
|
2026-04-27 23:45:05 +02:00
|
|
|
|
//#include "lib/depend-inject.hpp"
|
|
|
|
|
|
//#include "lib/thread.hpp"
|
|
|
|
|
|
//#include "lib/error.hpp"
|
2026-05-12 19:40:45 +02:00
|
|
|
|
#include "lib/symbol.hpp"
|
2026-04-27 23:45:05 +02:00
|
|
|
|
#include "test/diagnostic-output.hpp"////////////TODO
|
|
|
|
|
|
|
2026-05-12 19:40:45 +02:00
|
|
|
|
#include <algorithm>
|
2026-04-27 23:45:05 +02:00
|
|
|
|
|
|
|
|
|
|
//using std::this_thread::yield;
|
|
|
|
|
|
//using lib::Thread;
|
2026-05-12 19:40:45 +02:00
|
|
|
|
using lib::Literal;
|
2026-04-27 23:45:05 +02:00
|
|
|
|
|
|
|
|
|
|
namespace vault {
|
|
|
|
|
|
namespace mem {
|
|
|
|
|
|
namespace test {
|
|
|
|
|
|
|
|
|
|
|
|
// using LERR_(LOGIC);
|
|
|
|
|
|
// using LERR_(LIFECYCLE);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace { // Test helper
|
|
|
|
|
|
|
|
|
|
|
|
// template<typename X>
|
|
|
|
|
|
// Buff*
|
|
|
|
|
|
// mark_as_Buffer(X& something)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// return reinterpret_cast<Buff*> (std::addressof(something));
|
|
|
|
|
|
// }
|
|
|
|
|
|
//
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************//**
|
|
|
|
|
|
* @test Show how the central buffer manager of the Render Engine can be accessed.
|
|
|
|
|
|
*/
|
|
|
|
|
|
class EngineBufferManager_test : public Test
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
virtual void
|
|
|
|
|
|
run (Arg)
|
|
|
|
|
|
{
|
|
|
|
|
|
// seedRand();
|
|
|
|
|
|
|
|
|
|
|
|
demonstrate_AllocatorInterface();
|
2026-05-12 19:40:45 +02:00
|
|
|
|
verify_syncRequest();
|
|
|
|
|
|
verify_asyncRequest();
|
2026-04-27 23:45:05 +02:00
|
|
|
|
verify_lulz();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** @test show how to allocate buffer memory
|
|
|
|
|
|
* with the underlying base allocator.
|
|
|
|
|
|
* @remark 4/2026 for the first integration of the Render Engine,
|
|
|
|
|
|
* a simplified implementation is used that just delegates
|
|
|
|
|
|
* to the regular heap allocator (which actually performs
|
|
|
|
|
|
* quite well on modern C++ STDLib). The plan is to
|
|
|
|
|
|
* use some kind of tiling pool allocator eventually,
|
|
|
|
|
|
* contingent on the actual performance observations.
|
|
|
|
|
|
*/
|
|
|
|
|
|
void
|
|
|
|
|
|
demonstrate_AllocatorInterface()
|
|
|
|
|
|
{
|
2026-05-08 01:58:36 +02:00
|
|
|
|
using Allo = HeapBufferAllocator;
|
2026-04-27 23:45:05 +02:00
|
|
|
|
CHECK (lib::allo::is_Stateless_v<Allo>);
|
|
|
|
|
|
|
|
|
|
|
|
Allo allo;
|
|
|
|
|
|
auto a1 = allo.allocate (55);
|
|
|
|
|
|
auto a2 = allo.allocate (555);
|
|
|
|
|
|
CHECK (a1.mem);
|
|
|
|
|
|
CHECK (a2.mem);
|
|
|
|
|
|
CHECK (a1.siz == Allo::TILE_SIZ);
|
|
|
|
|
|
CHECK (a2.siz % Allo::TILE_SIZ == 0);
|
|
|
|
|
|
CHECK (a2.siz > 555);
|
|
|
|
|
|
|
|
|
|
|
|
// can use that memory without blowing up....
|
|
|
|
|
|
auto doooh = new(a1.mem) f128{std::numeric_limits<f128>::max()};
|
|
|
|
|
|
*doooh /= 2;
|
|
|
|
|
|
CHECK (2 == std::numeric_limits<f128>::max() / *doooh);
|
|
|
|
|
|
|
|
|
|
|
|
allo.deallocate (a1);
|
|
|
|
|
|
allo.deallocate (a2);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-05-12 19:40:45 +02:00
|
|
|
|
/** @test show that a direct request for allocation is honored */
|
2026-04-27 23:45:05 +02:00
|
|
|
|
void
|
2026-05-12 19:40:45 +02:00
|
|
|
|
verify_syncRequest()
|
|
|
|
|
|
{
|
|
|
|
|
|
EngineBufferManager manager;
|
|
|
|
|
|
SHOW_EXPR(watch(manager).isEmpty())
|
|
|
|
|
|
|
|
|
|
|
|
Alloc alloc = manager.requestAllocation (555);
|
|
|
|
|
|
CHECK (not alloc.empty());
|
|
|
|
|
|
CHECK (alloc.siz >= 555);
|
|
|
|
|
|
|
|
|
|
|
|
SHOW_EXPR(watch(manager).bytesAllocd())
|
|
|
|
|
|
SHOW_EXPR(watch(manager).bytesLeased())
|
|
|
|
|
|
|
|
|
|
|
|
// can use that memory
|
|
|
|
|
|
char* buf = reinterpret_cast<char*> (alloc.mem);
|
|
|
|
|
|
string ranS{lib::randStr(555-1)};
|
|
|
|
|
|
auto* p = std::copy (ranS.begin(), ranS.end(), buf);
|
|
|
|
|
|
SHOW_EXPR(p - buf)
|
|
|
|
|
|
*p = '\0';
|
|
|
|
|
|
CHECK (ranS == buf);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** @test show that an working allocation request across thread boundaries */
|
|
|
|
|
|
void
|
|
|
|
|
|
verify_asyncRequest()
|
2026-04-27 23:45:05 +02:00
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** @test
|
|
|
|
|
|
*/
|
|
|
|
|
|
void
|
|
|
|
|
|
verify_lulz()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Register this test class... */
|
|
|
|
|
|
LAUNCHER (EngineBufferManager_test, "unit engine");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}}} // namespace vault::mem::test
|