93 lines
1.6 KiB
C++
93 lines
1.6 KiB
C++
#include <STDInclude.hpp>
|
|
#include "LargeLocal.hpp"
|
|
|
|
namespace Game::Engine
|
|
{
|
|
#define CanUseServerLargeLocal() (SV_GetServerThreadOwnsGame() ? Sys_IsServerThread() : Sys_IsRenderThread())
|
|
|
|
LargeLocal::LargeLocal(int sizeParam)
|
|
{
|
|
assert(sizeParam);
|
|
assert(Sys_IsMainThread() || CanUseServerLargeLocal());
|
|
|
|
sizeParam = ((sizeParam + (128 - 1)) & ~(128 - 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 & 127));
|
|
|
|
if (Sys_IsMainThread())
|
|
{
|
|
return &g_largeLocalBuf[startPos];
|
|
}
|
|
|
|
const auto startIndex = startPos - size;
|
|
assert(startIndex >= 0);
|
|
|
|
return &g_largeLocalBuf[startIndex];
|
|
}
|
|
}
|