94 lines
1.7 KiB
C++
94 lines
1.7 KiB
C++
|
#include <STDInclude.hpp>
|
||
|
#include "LargeLocal.hpp"
|
||
|
|
||
|
namespace Game::Engine
|
||
|
{
|
||
|
#define PAGE_SIZE 128
|
||
|
#define CanUseServerLargeLocal() (SV_GetServerThreadOwnsGame() ? Sys_IsServerThread() : Sys_IsRenderThread())
|
||
|
|
||
|
LargeLocal::LargeLocal(int sizeParam)
|
||
|
{
|
||
|
assert(sizeParam);
|
||
|
assert(Sys_IsMainThread() || CanUseServerLargeLocal());
|
||
|
|
||
|
sizeParam = ((sizeParam + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1));
|
||
|
|
||
|
if (Sys_IsMainThread())
|
||
|
{
|
||
|
this->startPos = LargeLocalBegin(sizeParam);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this->startPos = LargeLocalBeginRight(sizeParam);
|
||
|
}
|
||
|
|
||
|
this->size = sizeParam;
|
||
|
}
|
||
|
|
||
|
LargeLocal::~LargeLocal()
|
||
|
{
|
||
|
if (this->size)
|
||
|
{
|
||
|
this->PopBuf();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void LargeLocal::PopBuf()
|
||
|
{
|
||
|
assert(this->size);
|
||
|
assert(Sys_IsMainThread() || CanUseServerLargeLocal());
|
||
|
|
||
|
if (Sys_IsMainThread())
|
||
|
{
|
||
|
LargeLocalEnd(this->startPos);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LargeLocalEndRight(this->startPos);
|
||
|
}
|
||
|
|
||
|
this->size = 0;
|
||
|
}
|
||
|
|
||
|
void* LargeLocal::GetBuf() const
|
||
|
{
|
||
|
assert(this->size);
|
||
|
assert(Sys_IsMainThread() || CanUseServerLargeLocal());
|
||
|
|
||
|
return LargeLocalGetBuf(this->startPos, this->size);
|
||
|
}
|
||
|
|
||
|
void LargeLocalEnd(int startPos)
|
||
|
{
|
||
|
assert(Sys_IsMainThread());
|
||
|
assert(g_largeLocalBuf);
|
||
|
|
||
|
*g_largeLocalPos = startPos;
|
||
|
}
|
||
|
|
||
|
void LargeLocalEndRight(int startPos)
|
||
|
{
|
||
|
assert(CanUseServerLargeLocal());
|
||
|
assert(g_largeLocalBuf);
|
||
|
|
||
|
*g_largeLocalRightPos = startPos;
|
||
|
}
|
||
|
|
||
|
void* LargeLocalGetBuf(int startPos, int size)
|
||
|
{
|
||
|
assert(Sys_IsMainThread() || CanUseServerLargeLocal());
|
||
|
assert(g_largeLocalBuf);
|
||
|
assert(!(size & (PAGE_SIZE - 1)));
|
||
|
|
||
|
if (Sys_IsMainThread())
|
||
|
{
|
||
|
return &g_largeLocalBuf[startPos];
|
||
|
}
|
||
|
|
||
|
const auto startIndex = startPos - size;
|
||
|
assert(startIndex >= 0);
|
||
|
|
||
|
return &g_largeLocalBuf[startIndex];
|
||
|
}
|
||
|
}
|