Skip to content

Commit e14ec3d

Browse files
committed
xrRender_R1: support for fast geometry
Only for debugging purpose for now. (requires level reload to apply) New console command r1_force_geomx allows you to force render fast geometry on all renderers
1 parent 2d234ac commit e14ec3d

File tree

6 files changed

+117
-51
lines changed

6 files changed

+117
-51
lines changed

src/Layers/xrRender/FVisual.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,12 @@ void Fvisual::Load(const char* N, IReader* data, u32 dwFlags)
6060
p_rm_Indices->AddRef();
6161
#endif
6262
#endif
63-
#if (RENDER == R_R2) || (RENDER == R_R3) || (RENDER == R_R4) || (RENDER == R_GL)
6463
// check for fast-vertices
64+
#if RENDER == R_R1
65+
if (data->find_chunk(OGF_FASTPATH) && ps_r1_force_geomx)
66+
#else
6567
if (data->find_chunk(OGF_FASTPATH))
68+
#endif
6669
{
6770
destructor<IReader> geomdef(data->open_chunk(OGF_FASTPATH));
6871
destructor<IReader> def(geomdef().open_chunk(OGF_GCONTAINER));
@@ -97,7 +100,6 @@ void Fvisual::Load(const char* N, IReader* data, u32 dwFlags)
97100
// geom
98101
m_fast->rm_geom.create(fmt, m_fast->p_rm_Vertices, m_fast->p_rm_Indices);
99102
}
100-
#endif // (RENDER==R_R2) || (RENDER==R_R3) || (RENDER==R_R4) || (RENDER==R_GL)
101103
}
102104

103105
// read vertices
@@ -222,8 +224,11 @@ void Fvisual::Load(const char* N, IReader* data, u32 dwFlags)
222224

223225
void Fvisual::Render(float)
224226
{
225-
#if (RENDER == R_R2) || (RENDER == R_R3) || (RENDER == R_R4) || (RENDER==R_GL)
226-
if (m_fast && RImplementation.phase == CRender::PHASE_SMAP && !RCache.is_TessEnabled())
227+
#if RENDER == R_R1
228+
if (m_fast && ps_r1_force_geomx)
229+
#else
230+
if (m_fast && (ps_r1_force_geomx || RImplementation.phase == CRender::PHASE_SMAP && !RCache.is_TessEnabled()))
231+
#endif
227232
{
228233
RCache.set_Geometry(m_fast->rm_geom);
229234
RCache.Render(D3DPT_TRIANGLELIST, m_fast->vBase, 0, m_fast->vCount, m_fast->iBase, m_fast->dwPrimitives);
@@ -235,11 +240,6 @@ void Fvisual::Render(float)
235240
RCache.Render(D3DPT_TRIANGLELIST, vBase, 0, vCount, iBase, dwPrimitives);
236241
RCache.stat.r.s_static.add(vCount);
237242
}
238-
#else // (RENDER==R_R2) || (RENDER==R_R3) || (RENDER==R_R4) || (RENDER==R_GL)
239-
RCache.set_Geometry(rm_geom);
240-
RCache.Render(D3DPT_TRIANGLELIST, vBase, 0, vCount, iBase, dwPrimitives);
241-
RCache.stat.r.s_static.add(vCount);
242-
#endif // (RENDER==R_R2) || (RENDER==R_R3) || (RENDER==R_R4) || (RENDER==R_GL)
243243
}
244244

245245
#define PCOPY(a) a = pFrom->a

src/Layers/xrRender/xrRender_console.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ float ps_r1_lmodel_lerp = 0.1f;
116116
float ps_r1_dlights_clip = 40.f;
117117
float ps_r1_pps_u = 0.f;
118118
float ps_r1_pps_v = 0.f;
119+
int ps_r1_force_geomx = 0;
119120

120121
// R1-specific
121122
int ps_r1_GlowsPerFrame = 16; // r1-only
@@ -743,6 +744,7 @@ void xrRender_initconsole()
743744
CMD4(CCC_Float, "r1_dlights_clip", &ps_r1_dlights_clip, 10.f, 150.f);
744745
CMD4(CCC_Float, "r1_pps_u", &ps_r1_pps_u, -1.f, +1.f);
745746
CMD4(CCC_Float, "r1_pps_v", &ps_r1_pps_v, -1.f, +1.f);
747+
CMD4(CCC_Integer, "r1_force_geomx", &ps_r1_force_geomx, 0, 1);
746748

747749
// R1-specific
748750
CMD4(CCC_Integer, "r1_glows_per_frame", &ps_r1_GlowsPerFrame, 2, 32);

src/Layers/xrRender/xrRender_console.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ extern ECORE_API float ps_r1_lmodel_lerp;
6363
extern ECORE_API float ps_r1_dlights_clip;
6464
extern ECORE_API float ps_r1_pps_u;
6565
extern ECORE_API float ps_r1_pps_v;
66+
extern ECORE_API int ps_r1_force_geomx;
6667

6768
// R1-specific
6869
extern ECORE_API int ps_r1_GlowsPerFrame; // r1-only

src/Layers/xrRenderPC_R1/FStaticRender.cpp

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -250,20 +250,44 @@ IRenderVisual* CRender::getVisual(int id)
250250
VERIFY(id < int(Visuals.size()));
251251
return Visuals[id];
252252
}
253-
D3DVERTEXELEMENT9* CRender::getVB_Format(int id)
253+
D3DVERTEXELEMENT9* CRender::getVB_Format(int id, bool alternative)
254254
{
255-
VERIFY(id < int(DCL.size()));
256-
return DCL[id].begin();
255+
if (alternative)
256+
{
257+
VERIFY(id < int(xDC.size()));
258+
return xDC[id].begin();
259+
}
260+
else
261+
{
262+
VERIFY(id < int(nDC.size()));
263+
return nDC[id].begin();
264+
}
257265
}
258-
ID3DVertexBuffer* CRender::getVB(int id)
266+
ID3DVertexBuffer* CRender::getVB(int id, bool alternative)
259267
{
260-
VERIFY(id < int(VB.size()));
261-
return VB[id];
268+
if (alternative)
269+
{
270+
VERIFY(id < int(xVB.size()));
271+
return xVB[id];
272+
}
273+
else
274+
{
275+
VERIFY(id < int(nVB.size()));
276+
return nVB[id];
277+
}
262278
}
263-
ID3DIndexBuffer* CRender::getIB(int id)
279+
ID3DIndexBuffer* CRender::getIB(int id, bool alternative)
264280
{
265-
VERIFY(id < int(IB.size()));
266-
return IB[id];
281+
if (alternative)
282+
{
283+
VERIFY(id < int(xIB.size()));
284+
return xIB[id];
285+
}
286+
else
287+
{
288+
VERIFY(id < int(nIB.size()));
289+
return nIB[id];
290+
}
267291
}
268292
FSlideWindowItem* CRender::getSWI(int id)
269293
{

src/Layers/xrRenderPC_R1/FStaticRender.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ class CRender : public D3DXRenderBase
5050
xr_vector<FSlideWindowItem> SWIs;
5151
xr_vector<ref_shader> Shaders;
5252
typedef svector<D3DVERTEXELEMENT9, MAXD3DDECLLENGTH + 1> VertexDeclarator;
53-
xr_vector<VertexDeclarator> DCL;
54-
xr_vector<ID3DVertexBuffer*> VB;
55-
xr_vector<ID3DIndexBuffer*> IB;
53+
xr_vector<VertexDeclarator> nDC, xDC;
54+
xr_vector<ID3DVertexBuffer*> nVB, xVB;
55+
xr_vector<ID3DIndexBuffer*> nIB, xIB;
5656
xr_vector<dxRender_Visual*> Visuals;
5757
CPSLibrary PSLibrary;
5858
CLight_DB Lights;
@@ -78,7 +78,7 @@ class CRender : public D3DXRenderBase
7878

7979
private:
8080
// Loading / Unloading
81-
void LoadBuffers(CStreamReader* fs);
81+
void LoadBuffers(CStreamReader* fs, bool alternative = false);
8282
void LoadVisuals(IReader* fs);
8383
void LoadLights(IReader* fs);
8484
void LoadSectors(IReader* fs);
@@ -91,9 +91,9 @@ class CRender : public D3DXRenderBase
9191
public:
9292
ShaderElement* rimp_select_sh_static(dxRender_Visual* pVisual, float cdist_sq);
9393
ShaderElement* rimp_select_sh_dynamic(dxRender_Visual* pVisual, float cdist_sq);
94-
D3DVERTEXELEMENT9* getVB_Format(int id);
95-
ID3DVertexBuffer* getVB(int id);
96-
ID3DIndexBuffer* getIB(int id);
94+
D3DVERTEXELEMENT9* getVB_Format(int id, bool alternative = false);
95+
ID3DVertexBuffer* getVB(int id, bool alternative = false);
96+
ID3DIndexBuffer* getIB(int id, bool alternative = false);
9797
FSlideWindowItem* getSWI(int id);
9898
IRender_Portal* getPortal(int id);
9999
IRender_Sector* getSectorActive();

src/Layers/xrRenderPC_R1/FStaticRender_Loader.cpp

Lines changed: 65 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,22 @@ void CRender::level_Load(IReader* fs)
6262
// VB,IB,SWI
6363
g_pGamePersistent->SetLoadStageTitle("st_loading_geometry");
6464
g_pGamePersistent->LoadTitle();
65-
CStreamReader* geom = FS.rs_open("$level$", "level.geom");
66-
LoadBuffers(geom);
67-
LoadSWIs(geom);
68-
FS.r_close(geom);
65+
{
66+
CStreamReader* geom = FS.rs_open("$level$", "level.geom");
67+
R_ASSERT2(geom, "level.geom");
68+
LoadBuffers(geom, false);
69+
LoadSWIs(geom);
70+
FS.r_close(geom);
71+
}
72+
73+
//...and alternate/fast geometry
74+
if (ps_r1_force_geomx)
75+
{
76+
CStreamReader* geom = FS.rs_open("$level$", "level.geomx");
77+
R_ASSERT2(geom, "level.geomX");
78+
LoadBuffers(geom, true);
79+
FS.r_close(geom);
80+
}
6981

7082
// Visuals
7183
g_pGamePersistent->SetLoadStageTitle("st_loading_spatial_db");
@@ -147,13 +159,36 @@ void CRender::level_Unload()
147159
SWIs.clear();
148160

149161
//*** VB/IB
150-
for (I = 0; I < VB.size(); I++)
151-
_RELEASE(VB[I]);
152-
for (I = 0; I < IB.size(); I++)
153-
_RELEASE(IB[I]);
154-
DCL.clear();
155-
VB.clear();
156-
IB.clear();
162+
for (I = 0; I < nVB.size(); I++)
163+
{
164+
HW.stats_manager.decrement_stats_vb(nVB[I]);
165+
_RELEASE(nVB[I]);
166+
}
167+
168+
for (I = 0; I < xVB.size(); I++)
169+
{
170+
HW.stats_manager.decrement_stats_vb(xVB[I]);
171+
_RELEASE(xVB[I]);
172+
}
173+
nVB.clear();
174+
xVB.clear();
175+
176+
for (I = 0; I < nIB.size(); I++)
177+
{
178+
HW.stats_manager.decrement_stats_ib(nIB[I]);
179+
_RELEASE(nIB[I]);
180+
}
181+
182+
for (I = 0; I < xIB.size(); I++)
183+
{
184+
HW.stats_manager.decrement_stats_ib(xIB[I]);
185+
_RELEASE(xIB[I]);
186+
}
187+
188+
nIB.clear();
189+
xIB.clear();
190+
nDC.clear();
191+
xDC.clear();
157192

158193
//*** Components
159194
xr_delete(Details);
@@ -172,19 +207,23 @@ void CRender::level_Unload()
172207
b_loaded = FALSE;
173208
}
174209

175-
void CRender::LoadBuffers(CStreamReader* base_fs)
210+
void CRender::LoadBuffers(CStreamReader* base_fs, bool alternative)
176211
{
177212
Resources->Evict();
178213
u32 dwUsage = D3DUSAGE_WRITEONLY | (HW.Caps.geometry.bSoftware ? D3DUSAGE_SOFTWAREPROCESSING : 0);
179214

215+
xr_vector<VertexDeclarator>& _DC = alternative ? xDC : nDC;
216+
xr_vector<ID3DVertexBuffer*>& _VB = alternative ? xVB : nVB;
217+
xr_vector<ID3DIndexBuffer*>& _IB = alternative ? xIB : nIB;
218+
180219
// Vertex buffers
181220
if (base_fs->find_chunk(fsL_VB))
182221
{
183222
// Use DX9-style declarators
184223
CStreamReader* fs = base_fs->open_chunk(fsL_VB);
185224
u32 count = fs->r_u32();
186-
DCL.resize(count);
187-
VB.resize(count);
225+
_DC.resize(count);
226+
_VB.resize(count);
188227

189228
u32 buffer_size = (MAXD3DDECLLENGTH + 1) * sizeof(D3DVERTEXELEMENT9);
190229
D3DVERTEXELEMENT9* dcl = (D3DVERTEXELEMENT9*)_alloca(buffer_size);
@@ -200,9 +239,9 @@ void CRender::LoadBuffers(CStreamReader* base_fs)
200239

201240
u32 dcl_len = D3DXGetDeclLength(dcl) + 1;
202241

203-
DCL[i].resize(dcl_len);
204-
fs->r(DCL[i].begin(), dcl_len * sizeof(D3DVERTEXELEMENT9));
205-
//.????????? remove T&B from DCL[]
242+
_DC[i].resize(dcl_len);
243+
fs->r(_DC[i].begin(), dcl_len * sizeof(D3DVERTEXELEMENT9));
244+
//.????????? remove T&B from _DC[]
206245

207246
// count, size
208247
u32 vCount = fs->r_u32();
@@ -211,12 +250,12 @@ void CRender::LoadBuffers(CStreamReader* base_fs)
211250

212251
// Create and fill
213252
BYTE* pData = nullptr;
214-
R_CHK(HW.pDevice->CreateVertexBuffer(vCount * vSize, dwUsage, 0, D3DPOOL_MANAGED, &VB[i], nullptr));
215-
HW.stats_manager.increment_stats(vCount * vSize, enum_stats_buffer_type_vertex, D3DPOOL_MANAGED);
216-
R_CHK(VB[i]->Lock(0, 0, (void**)&pData, 0));
253+
R_CHK(HW.pDevice->CreateVertexBuffer(vCount * vSize, dwUsage, 0, D3DPOOL_MANAGED, &_VB[i], nullptr));
254+
HW.stats_manager.increment_stats_vb(_VB[i]);
255+
R_CHK(_VB[i]->Lock(0, 0, (void**)&pData, 0));
217256
fs->r(pData, vCount * vSize);
218257
// CopyMemory (pData,fs->pointer(),vCount*vSize); //.???? copy while skip T&B
219-
VB[i]->Unlock();
258+
_VB[i]->Unlock();
220259

221260
// fs->advance (vCount*vSize);
222261
}
@@ -232,20 +271,20 @@ void CRender::LoadBuffers(CStreamReader* base_fs)
232271
{
233272
CStreamReader* fs = base_fs->open_chunk(fsL_IB);
234273
u32 count = fs->r_u32();
235-
IB.resize(count);
274+
_IB.resize(count);
236275
for (u32 i = 0; i < count; i++)
237276
{
238277
u32 iCount = fs->r_u32();
239278
Msg("* [Loading IB] %d indices, %d Kb", iCount, (iCount * 2) / 1024);
240279

241280
// Create and fill
242281
BYTE* pData = nullptr;
243-
R_CHK(HW.pDevice->CreateIndexBuffer(iCount * 2, dwUsage, D3DFMT_INDEX16, D3DPOOL_MANAGED, &IB[i], nullptr));
244-
HW.stats_manager.increment_stats(iCount * 2, enum_stats_buffer_type_index, D3DPOOL_MANAGED);
245-
R_CHK(IB[i]->Lock(0, 0, (void**)&pData, 0));
282+
R_CHK(HW.pDevice->CreateIndexBuffer(iCount * 2, dwUsage, D3DFMT_INDEX16, D3DPOOL_MANAGED, &_IB[i], nullptr));
283+
HW.stats_manager.increment_stats_ib(_IB[i]);
284+
R_CHK(_IB[i]->Lock(0, 0, (void**)&pData, 0));
246285
// CopyMemory (pData,fs->pointer(),iCount*2);
247286
fs->r(pData, iCount * 2);
248-
IB[i]->Unlock();
287+
_IB[i]->Unlock();
249288

250289
// fs->advance (iCount*2);
251290
}

0 commit comments

Comments
 (0)