Skip to content

Commit

Permalink
Render availability check refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
Xottab-DUTY committed Jan 9, 2018
1 parent bc09520 commit 63e2ba5
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 157 deletions.
210 changes: 69 additions & 141 deletions src/xrEngine/EngineAPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@

#include "stdafx.h"
#include "EngineAPI.h"
#include "XR_IOConsole.h"

#include "xrCore/ModuleLookup.hpp"

extern xr_token* vid_quality_token;
extern xr_vector<xr_token> vid_quality_token;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
Expand All @@ -32,25 +33,20 @@ CEngineAPI::CEngineAPI()

CEngineAPI::~CEngineAPI()
{
// destroy quality token here
if (vid_quality_token)
{
xr_free(vid_quality_token);
vid_quality_token = NULL;
}
vid_quality_token.clear();
}

extern u32 renderer_value; // con cmd

bool is_enough_address_space_available()
{
SYSTEM_INFO system_info;
GetSystemInfo(&system_info);
return (*(u32*)&system_info.lpMaximumApplicationAddress) > 0x90000000;
}

void CEngineAPI::InitializeNotDedicated()
void CEngineAPI::SetupCurrentRenderer()
{
GEnv.CurrentRenderer = -1;

if (psDeviceFlags.test(rsR4))
{
if (hRenderR4->exist())
Expand Down Expand Up @@ -87,30 +83,51 @@ void CEngineAPI::InitializeNotDedicated()
GEnv.SetupCurrentRenderer = GEnv.SetupR2;
}
else
{
psDeviceFlags.set(rsR2, false);
psDeviceFlags.set(rsR1, true);
}
}

if (psDeviceFlags.test(rsR1))
{
if (hRenderR2->exist())
{
GEnv.CurrentRenderer = 1;
GEnv.SetupCurrentRenderer = GEnv.SetupR1;
}
else
psDeviceFlags.set(rsR1, false);
}
}

void CEngineAPI::InitializeRenderers()
{
if (!GEnv.isDedicatedServer)
InitializeNotDedicated();
{
SetupCurrentRenderer();

if (!psDeviceFlags.test(rsR4|rsR3|rsR2))
if (GEnv.SetupCurrentRenderer == nullptr
&& vid_quality_token[0].id != -1)
{
R_ASSERT(hRenderR1);
renderer_value = 0; // con cmd
GEnv.CurrentRenderer = 1;
GEnv.SetupCurrentRenderer = GEnv.SetupR1;
// if engine failed to load renderer
// but there is at least one available
// then try again
string32 buf;
xr_sprintf(buf, "renderer %s", vid_quality_token[0].name);
Console->Execute(buf);

// Second attempt
InitializeRenderers();
}

// ask current renderer to setup GlobalEnv
R_ASSERT(GEnv.SetupCurrentRenderer);
R_ASSERT2(GEnv.SetupCurrentRenderer, "Can't setup renderer");
GEnv.SetupCurrentRenderer();
}

void CEngineAPI::Initialize(void)
{
InitializeRenderers();

hGame = std::make_unique<XRay::Module>("xrGame");
R_ASSERT2(hGame, "Game DLL raised exception during loading or there is no game DLL at all");

Expand Down Expand Up @@ -159,20 +176,18 @@ void CEngineAPI::CreateRendererList()
{
hRenderR1 = std::make_unique<XRay::Module>("xrRender_R1");

if (GEnv.isDedicatedServer)
xr_vector<xr_token> modes;
// load only R1 for dedicated server,
// but if it's unavailable, then try other renderers
if (GEnv.isDedicatedServer && hRenderR1->exist())
{
vid_quality_token = xr_alloc<xr_token>(2);

vid_quality_token[0].id = 0;
vid_quality_token[0].name = xr_strdup("renderer_r1");

vid_quality_token[1].id = -1;
vid_quality_token[1].name = nullptr;

modes.push_back(xr_token("renderer_r1", 0));
modes.push_back(xr_token(nullptr, -1));
vid_quality_token = std::move(modes);
return;
}

if (vid_quality_token != nullptr)
if (!vid_quality_token.empty())
return;

// Hide "d3d10.dll not found" message box for XP
Expand All @@ -185,127 +200,40 @@ void CEngineAPI::CreateRendererList()
// Restore error handling
SetErrorMode(0);

bool bSupports_r2 = false;
bool bSupports_r2_5 = false;
bool bSupports_r3 = false;
bool bSupports_r4 = false;

if (strstr(Core.Params, "-perfhud_hack"))
if (hRenderR1->exist())
{
bSupports_r2 = true;
bSupports_r2_5 = true;
bSupports_r3 = true;
bSupports_r4 = true;
modes.push_back(xr_token("renderer_r1", 0));
}
else

if (hRenderR2->exist())
{
if (hRenderR2->exist())
{
bSupports_r2 = true;
if (GEnv.CheckR2 && GEnv.CheckR2())
bSupports_r2_5 = true;
}
if (hRenderR3->exist())
{
if (GEnv.CheckR3 && GEnv.CheckR3())
bSupports_r3 = true;
else
hRenderR3->close();
}
if (hRenderR4->exist())
{
if (GEnv.CheckR4 && GEnv.CheckR4())
bSupports_r4 = true;
else
hRenderR4->close();
}
modes.push_back(xr_token("renderer_r2a", 1));
modes.push_back(xr_token("renderer_r2", 2));
if (GEnv.CheckR2 && GEnv.CheckR2())
modes.push_back(xr_token("renderer_r2.5", 3));
}

bool proceed = true;
xr_vector<pcstr> tmp;
tmp.push_back("renderer_r1");
if (proceed &= bSupports_r2, proceed)
if (hRenderR3->exist())
{
tmp.push_back("renderer_r2a");
tmp.push_back("renderer_r2");
if (GEnv.CheckR3 && GEnv.CheckR3())
modes.push_back(xr_token("renderer_r3", 4));
else
hRenderR3->close();
}
if (proceed &= bSupports_r2_5, proceed)
tmp.push_back("renderer_r2.5");
if (proceed &= bSupports_r3, proceed)
tmp.push_back("renderer_r3");
if (proceed &= bSupports_r4, proceed)
tmp.push_back("renderer_r4");
u32 _cnt = tmp.size() + 1;
vid_quality_token = xr_alloc<xr_token>(_cnt);

vid_quality_token[_cnt - 1].id = -1;
vid_quality_token[_cnt - 1].name = NULL;

Msg("Available render modes[%d]:", tmp.size());
for (u32 i = 0; i < tmp.size(); ++i)

if (hRenderR4->exist())
{
vid_quality_token[i].id = i;
vid_quality_token[i].name = tmp[i];
Msg("[%s]", tmp[i]);
if (GEnv.CheckR4 && GEnv.CheckR4())
modes.push_back(xr_token("renderer_r4", 5));
else
hRenderR4->close();
}
modes.push_back(xr_token(nullptr, -1));

/*
if(vid_quality_token != NULL) return;
D3DCAPS9 caps;
CHW _HW;
_HW.CreateD3D ();
_HW.pD3D->GetDeviceCaps (D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);
_HW.DestroyD3D ();
u16 ps_ver_major = u16 ( u32(u32(caps.PixelShaderVersion)&u32(0xf << 8ul))>>8 );
xr_vector<LPCSTR> _tmp;
u32 i = 0;
for(; i<5; ++i)
{
bool bBreakLoop = false;
switch (i)
{
case 3: //"renderer_r2.5"
if (ps_ver_major < 3)
bBreakLoop = true;
break;
case 4: //"renderer_r_dx10"
bBreakLoop = true;
break;
default: ;
}
Msg("Available render modes[%d]:", modes.size());
for (auto& mode : modes)
if (mode.name)
Log(mode.name);

if (bBreakLoop) break;
_tmp.push_back (NULL);
LPCSTR val = NULL;
switch (i)
{
case 0: val ="renderer_r1"; break;
case 1: val ="renderer_r2a"; break;
case 2: val ="renderer_r2"; break;
case 3: val ="renderer_r2.5"; break;
case 4: val ="renderer_r_dx10"; break; // -)
}
_tmp.back() = xr_strdup(val);
}
u32 _cnt = _tmp.size()+1;
vid_quality_token = xr_alloc<xr_token>(_cnt);
vid_quality_token[_cnt-1].id = -1;
vid_quality_token[_cnt-1].name = NULL;
#ifdef DEBUG
Msg("Available render modes[%d]:",_tmp.size());
#endif // DEBUG
for(u32 i=0; i<_tmp.size();++i)
{
vid_quality_token[i].id = i;
vid_quality_token[i].name = _tmp[i];
#ifdef DEBUG
Msg ("[%s]",_tmp[i]);
#endif // DEBUG
}
*/
vid_quality_token = std::move(modes);
}
2 changes: 1 addition & 1 deletion src/xrEngine/EngineAPI.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class ENGINE_API CEngineAPI
void Initialize();

void InitializeRenderers();
void InitializeNotDedicated();
void SetupCurrentRenderer();

void Destroy();

Expand Down
10 changes: 6 additions & 4 deletions src/xrEngine/defines.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,12 @@ enum
mtParticles = (1ul << 17ul),

rsCameraPos = (1ul << 18ul),
rsR2 = (1ul << 19ul),
rsR3 = (1ul << 20ul),
rsR4 = (1ul << 21ul),
// 22-32 bit - reserved to Editor

rsR1 = (1ul << 19ul),
rsR2 = (1ul << 20ul),
rsR3 = (1ul << 21ul),
rsR4 = (1ul << 22ul), // 22 was reserved for editor too
// 23-32 bit - reserved to Editor
};

//. ENGINE_API extern u32 psCurrentMode ;
Expand Down
1 change: 0 additions & 1 deletion src/xrEngine/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,6 @@ int RunApplication(pcstr commandLine)
else
Console->Execute("renderer renderer_r1");

Engine.External.InitializeRenderers();
Engine.External.Initialize();
Startup();
Core._destroy();
Expand Down
1 change: 0 additions & 1 deletion src/xrEngine/xrSASH.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -481,7 +481,6 @@ void xrSASH::TryInitEngine(bool bNoRun)

InitInput();

Engine.External.InitializeRenderers();
Engine.External.Initialize();

Console->Execute("unbindall");
Expand Down
16 changes: 7 additions & 9 deletions src/xrEngine/xr_ioc_cmd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
#include "xr_object.h"
#include "xr_object_list.h"

xr_token* vid_quality_token = NULL;
xr_vector<xr_token> vid_quality_token;

xr_token vid_bpp_token[] = {{"16", 16}, {"32", 32}, {0, 0}};
//-----------------------------------------------------------------------
Expand Down Expand Up @@ -537,13 +537,14 @@ class CCC_r2 : public CCC_Token
virtual ~CCC_r2() {}
virtual void Execute(LPCSTR args)
{
// vid_quality_token must be already created!
tokens = vid_quality_token;
tokens = vid_quality_token.data();

inherited::Execute(args);
// 0 - r1
// 1..3 - r2
// 4 - r3
// 5 - r4
psDeviceFlags.set(rsR1, renderer_value == 0);
psDeviceFlags.set(rsR2, ((renderer_value > 0) && renderer_value < 4));
psDeviceFlags.set(rsR3, (renderer_value == 4));
psDeviceFlags.set(rsR4, (renderer_value >= 5));
Expand All @@ -556,15 +557,12 @@ class CCC_r2 : public CCC_Token
virtual void Save(IWriter* F)
{
// fill_render_mode_list ();
tokens = vid_quality_token;
if (!strstr(Core.Params, "-r2"))
{
inherited::Save(F);
}
tokens = vid_quality_token.data();
inherited::Save(F);
}
virtual xr_token* GetToken()
{
tokens = vid_quality_token;
tokens = vid_quality_token.data();
return inherited::GetToken();
}
};
Expand Down

0 comments on commit 63e2ba5

Please sign in to comment.