Improve side and sector draw performance a bit
This commit is contained in:
parent
3b34a9d138
commit
83441734da
3 changed files with 20 additions and 22 deletions
|
|
@ -318,22 +318,22 @@ void DoomLevelMesh::SetLimits(FLevelLocals& doomMap)
|
|||
Reset(limits);
|
||||
}
|
||||
|
||||
void DoomLevelMesh::DrawSector(FRenderState& renderstate, int sectorIndex, LevelMeshDrawType drawType, bool noFragmentShader)
|
||||
void DoomLevelMesh::DrawSectors(FRenderState& renderstate, const TArray<int>& sectors, LevelMeshDrawType drawType, bool noFragmentShader)
|
||||
{
|
||||
for (const DrawRangeInfo& di : Flats[sectorIndex].DrawRanges)
|
||||
for (int sectorIndex : sectors)
|
||||
{
|
||||
if (di.DrawType == drawType)
|
||||
for (const DrawRangeInfo& di : Flats[sectorIndex].DrawRanges[(int)drawType])
|
||||
{
|
||||
renderstate.DrawLevelMeshRange(di.IndexStart, di.IndexCount, di.PipelineID, drawType, noFragmentShader);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DoomLevelMesh::DrawSide(FRenderState& renderstate, int sideIndex, LevelMeshDrawType drawType, bool noFragmentShader)
|
||||
void DoomLevelMesh::DrawSides(FRenderState& renderstate, const TArray<int>& sides, LevelMeshDrawType drawType, bool noFragmentShader)
|
||||
{
|
||||
for (const DrawRangeInfo& di : Sides[sideIndex].DrawRanges)
|
||||
for (int sideIndex : sides)
|
||||
{
|
||||
if (di.DrawType == drawType)
|
||||
for (const DrawRangeInfo& di : Sides[sideIndex].DrawRanges[(int)drawType])
|
||||
{
|
||||
renderstate.DrawLevelMeshRange(di.IndexStart, di.IndexCount, di.PipelineID, drawType, noFragmentShader);
|
||||
}
|
||||
|
|
@ -653,7 +653,8 @@ void DoomLevelMesh::FreeSide(FLevelLocals& doomMap, unsigned int sideIndex)
|
|||
FreeGeometry(geo.VertexStart, geo.VertexCount, geo.IndexStart, geo.IndexCount);
|
||||
Sides[sideIndex].Geometries.Clear();
|
||||
|
||||
Sides[sideIndex].DrawRanges.Clear();
|
||||
for (auto& list : Sides[sideIndex].DrawRanges)
|
||||
list.Clear();
|
||||
|
||||
for (auto& uni : Sides[sideIndex].Uniforms)
|
||||
FreeUniforms(uni.Start, uni.Count);
|
||||
|
|
@ -695,7 +696,8 @@ void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex)
|
|||
FreeGeometry(geo.VertexStart, geo.VertexCount, geo.IndexStart, geo.IndexCount);
|
||||
Flats[sectorIndex].Geometries.Clear();
|
||||
|
||||
Flats[sectorIndex].DrawRanges.Clear();
|
||||
for (auto& list : Flats[sectorIndex].DrawRanges)
|
||||
list.Clear();
|
||||
|
||||
for (auto& uni : Flats[sectorIndex].Uniforms)
|
||||
FreeUniforms(uni.Start, uni.Count);
|
||||
|
|
@ -1377,16 +1379,15 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh
|
|||
Sides[sideIndex].Geometries.Push(ginfo);
|
||||
Sides[sideIndex].Uniforms.Push(uinfo);
|
||||
|
||||
AddToDrawList(Sides[sideIndex].DrawRanges, pipelineID, ginfo.IndexStart, ginfo.IndexCount, drawType);
|
||||
AddToDrawList(Sides[sideIndex].DrawRanges[(int)drawType], pipelineID, ginfo.IndexStart, ginfo.IndexCount);
|
||||
}
|
||||
}
|
||||
|
||||
void DoomLevelMesh::AddToDrawList(TArray<DrawRangeInfo>& drawRanges, int pipelineID, int indexStart, int indexCount, LevelMeshDrawType drawType)
|
||||
void DoomLevelMesh::AddToDrawList(TArray<DrawRangeInfo>& drawRanges, int pipelineID, int indexStart, int indexCount)
|
||||
{
|
||||
DrawRangeInfo info;
|
||||
info.IndexStart = indexStart;
|
||||
info.IndexCount = indexCount;
|
||||
info.DrawType = drawType;
|
||||
info.PipelineID = pipelineID;
|
||||
drawRanges.Push(info);
|
||||
}
|
||||
|
|
@ -1662,7 +1663,7 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state
|
|||
SetSubsectorLightmap(sinfo.Index);
|
||||
}
|
||||
|
||||
AddToDrawList(Flats[sectorIndex].DrawRanges, pipelineID, ginfo.IndexStart, ginfo.IndexCount, drawType);
|
||||
AddToDrawList(Flats[sectorIndex].DrawRanges[(int)drawType], pipelineID, ginfo.IndexStart, ginfo.IndexCount);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -53,7 +53,6 @@ struct GeometryFreeInfo
|
|||
struct DrawRangeInfo
|
||||
{
|
||||
int PipelineID = 0;
|
||||
LevelMeshDrawType DrawType = {};
|
||||
int IndexStart = 0;
|
||||
int IndexCount = 0;
|
||||
};
|
||||
|
|
@ -76,7 +75,7 @@ struct SideSurfaceBlock
|
|||
TArray<HWDecalCreateInfo> Decals;
|
||||
bool InSidePortalsList = false;
|
||||
bool InSideDecalsList = false;
|
||||
TArray<DrawRangeInfo> DrawRanges;
|
||||
TArray<DrawRangeInfo> DrawRanges[(int)LevelMeshDrawType::NumDrawTypes];
|
||||
SurfaceUpdateType UpdateType = SurfaceUpdateType::None;
|
||||
LightListAllocInfo Lights;
|
||||
};
|
||||
|
|
@ -86,7 +85,7 @@ struct FlatSurfaceBlock
|
|||
int FirstSurface = -1;
|
||||
TArray<GeometryFreeInfo> Geometries;
|
||||
TArray<UniformsAllocInfo> Uniforms;
|
||||
TArray<DrawRangeInfo> DrawRanges;
|
||||
TArray<DrawRangeInfo> DrawRanges[(int)LevelMeshDrawType::NumDrawTypes];
|
||||
SurfaceUpdateType UpdateType = SurfaceUpdateType::None;
|
||||
TArray<LightListAllocInfo> Lights;
|
||||
};
|
||||
|
|
@ -107,8 +106,8 @@ public:
|
|||
|
||||
void ProcessDecals(HWDrawInfo* drawinfo, FRenderState& state);
|
||||
|
||||
void DrawSector(FRenderState& renderstate, int sectorIndex, LevelMeshDrawType drawType, bool noFragmentShader);
|
||||
void DrawSide(FRenderState& renderstate, int sideIndex, LevelMeshDrawType drawType, bool noFragmentShader);
|
||||
void DrawSectors(FRenderState& renderstate, const TArray<int>& sectors, LevelMeshDrawType drawType, bool noFragmentShader);
|
||||
void DrawSides(FRenderState& renderstate, const TArray<int>& sides, LevelMeshDrawType drawType, bool noFragmentShader);
|
||||
TArray<HWWall>& GetSidePortals(int sideIndex);
|
||||
|
||||
TArray<int> SideDecals;
|
||||
|
|
@ -197,7 +196,7 @@ private:
|
|||
void UpdateLight(FDynamicLight* light);
|
||||
void CopyToMeshLight(FDynamicLight* light, LevelMeshLight& meshlight, int portalgroup);
|
||||
|
||||
void AddToDrawList(TArray<DrawRangeInfo>& drawRanges, int pipelineID, int indexStart, int indexCount, LevelMeshDrawType drawType);
|
||||
void AddToDrawList(TArray<DrawRangeInfo>& drawRanges, int pipelineID, int indexStart, int indexCount);
|
||||
|
||||
void UploadDynLights(FLevelLocals& doomMap);
|
||||
|
||||
|
|
|
|||
|
|
@ -829,16 +829,14 @@ void HWDrawInfo::RenderScene(FRenderState &state)
|
|||
void HWDrawInfo::DrawSeenSides(FRenderState& state, LevelMeshDrawType drawType, bool noFragmentShader)
|
||||
{
|
||||
RenderWall.Clock();
|
||||
for (int sideIndex : SeenSides.Get())
|
||||
level.levelMesh->DrawSide(state, sideIndex, drawType, noFragmentShader);
|
||||
level.levelMesh->DrawSides(state, SeenSides.Get(), drawType, noFragmentShader);
|
||||
RenderWall.Unclock();
|
||||
}
|
||||
|
||||
void HWDrawInfo::DrawSeenFlats(FRenderState& state, LevelMeshDrawType drawType, bool noFragmentShader)
|
||||
{
|
||||
RenderFlat.Clock();
|
||||
for (int sectorIndex : SeenSectors.Get())
|
||||
level.levelMesh->DrawSector(state, sectorIndex, drawType, noFragmentShader);
|
||||
level.levelMesh->DrawSectors(state, SeenSectors.Get(), drawType, noFragmentShader);
|
||||
RenderFlat.Unclock();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue