From 45f623faf45419567970142c0a7adf3c38ba8918 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sat, 4 Feb 2017 02:50:52 +0100 Subject: [PATCH] Move frame memory allocator into RenderThread --- src/swrenderer/line/r_line.cpp | 20 ++++++++++---------- src/swrenderer/plane/r_visibleplane.cpp | 11 ++++++----- src/swrenderer/plane/r_visibleplane.h | 4 ++-- src/swrenderer/plane/r_visibleplanelist.cpp | 2 +- src/swrenderer/r_memory.cpp | 3 --- src/swrenderer/r_memory.h | 12 ++++++------ src/swrenderer/r_renderthread.cpp | 2 ++ src/swrenderer/r_renderthread.h | 2 ++ src/swrenderer/scene/r_opaque_pass.cpp | 8 ++++---- src/swrenderer/scene/r_portal.cpp | 8 ++++---- src/swrenderer/scene/r_scene.cpp | 2 +- src/swrenderer/segments/r_portalsegment.cpp | 7 ++++--- src/swrenderer/segments/r_portalsegment.h | 4 +++- src/swrenderer/things/r_particle.cpp | 2 +- src/swrenderer/things/r_sprite.cpp | 2 +- src/swrenderer/things/r_voxel.cpp | 2 +- src/swrenderer/things/r_wallsprite.cpp | 2 +- 17 files changed, 49 insertions(+), 44 deletions(-) diff --git a/src/swrenderer/line/r_line.cpp b/src/swrenderer/line/r_line.cpp index 156c2f3af..17a475862 100644 --- a/src/swrenderer/line/r_line.cpp +++ b/src/swrenderer/line/r_line.cpp @@ -335,7 +335,7 @@ namespace swrenderer RenderPortal *renderportal = Thread->Portal.get(); - DrawSegment *draw_segment = RenderMemory::NewObject(); + DrawSegment *draw_segment = Thread->FrameMemory->NewObject(); Thread->DrawSegments->Push(draw_segment); draw_segment->CurrentPortalUniq = renderportal->CurrentPortalUniq; @@ -373,8 +373,8 @@ namespace swrenderer } else if (backsector == NULL) { - draw_segment->sprtopclip = RenderMemory::AllocMemory(stop - start); - draw_segment->sprbottomclip = RenderMemory::AllocMemory(stop - start); + draw_segment->sprtopclip = Thread->FrameMemory->AllocMemory(stop - start); + draw_segment->sprbottomclip = Thread->FrameMemory->AllocMemory(stop - start); fillshort(draw_segment->sprtopclip, stop - start, viewheight); memset(draw_segment->sprbottomclip, -1, (stop - start) * sizeof(short)); draw_segment->silhouette = SIL_BOTH; @@ -407,13 +407,13 @@ namespace swrenderer { if (doorclosed || (rw_backcz1 <= rw_frontfz1 && rw_backcz2 <= rw_frontfz2)) { - draw_segment->sprbottomclip = RenderMemory::AllocMemory(stop - start); + draw_segment->sprbottomclip = Thread->FrameMemory->AllocMemory(stop - start); memset(draw_segment->sprbottomclip, -1, (stop - start) * sizeof(short)); draw_segment->silhouette |= SIL_BOTTOM; } if (doorclosed || (rw_backfz1 >= rw_frontcz1 && rw_backfz2 >= rw_frontcz2)) { // killough 1/17/98, 2/8/98 - draw_segment->sprtopclip = RenderMemory::AllocMemory(stop - start); + draw_segment->sprtopclip = Thread->FrameMemory->AllocMemory(stop - start); fillshort(draw_segment->sprtopclip, stop - start, viewheight); draw_segment->silhouette |= SIL_TOP; } @@ -453,7 +453,7 @@ namespace swrenderer maskedtexture = true; // kg3D - backup for mid and fake walls - draw_segment->bkup = RenderMemory::AllocMemory(stop - start); + draw_segment->bkup = Thread->FrameMemory->AllocMemory(stop - start); memcpy(draw_segment->bkup, &Thread->OpaquePass->ceilingclip[start], sizeof(short)*(stop - start)); draw_segment->bFogBoundary = IsFogBoundary(frontsector, backsector); @@ -462,8 +462,8 @@ namespace swrenderer if (sidedef->GetTexture(side_t::mid).isValid()) draw_segment->bFakeBoundary |= 4; // it is also mid texture - draw_segment->maskedtexturecol = RenderMemory::AllocMemory(stop - start); - draw_segment->swall = RenderMemory::AllocMemory(stop - start); + draw_segment->maskedtexturecol = Thread->FrameMemory->AllocMemory(stop - start); + draw_segment->swall = Thread->FrameMemory->AllocMemory(stop - start); lwal = draw_segment->maskedtexturecol; swal = draw_segment->swall; @@ -563,13 +563,13 @@ namespace swrenderer // save sprite clipping info if (((draw_segment->silhouette & SIL_TOP) || maskedtexture) && draw_segment->sprtopclip == nullptr) { - draw_segment->sprtopclip = RenderMemory::AllocMemory(stop - start); + draw_segment->sprtopclip = Thread->FrameMemory->AllocMemory(stop - start); memcpy(draw_segment->sprtopclip, &Thread->OpaquePass->ceilingclip[start], sizeof(short)*(stop - start)); } if (((draw_segment->silhouette & SIL_BOTTOM) || maskedtexture) && draw_segment->sprbottomclip == nullptr) { - draw_segment->sprbottomclip = RenderMemory::AllocMemory(stop - start); + draw_segment->sprbottomclip = Thread->FrameMemory->AllocMemory(stop - start); memcpy(draw_segment->sprbottomclip, &Thread->OpaquePass->floorclip[start], sizeof(short)*(stop - start)); } diff --git a/src/swrenderer/plane/r_visibleplane.cpp b/src/swrenderer/plane/r_visibleplane.cpp index 0d9e97ef3..a0a58c7e7 100644 --- a/src/swrenderer/plane/r_visibleplane.cpp +++ b/src/swrenderer/plane/r_visibleplane.cpp @@ -29,6 +29,7 @@ #include "g_level.h" #include "gl/dynlights/gl_dynlight.h" #include "swrenderer/r_memory.h" +#include "swrenderer/r_renderthread.h" #include "swrenderer/scene/r_opaque_pass.h" #include "swrenderer/scene/r_3dfloors.h" #include "swrenderer/scene/r_portal.h" @@ -43,19 +44,19 @@ CVAR(Bool, tilt, false, 0); namespace swrenderer { - VisiblePlane::VisiblePlane() + VisiblePlane::VisiblePlane(RenderThread *thread) { picnum.SetNull(); height.set(0.0, 0.0, 1.0, 0.0); - bottom = RenderMemory::AllocMemory(viewwidth); - top = RenderMemory::AllocMemory(viewwidth); + bottom = thread->FrameMemory->AllocMemory(viewwidth); + top = thread->FrameMemory->AllocMemory(viewwidth); fillshort(bottom, viewwidth, 0); fillshort(top, viewwidth, 0x7fff); } - void VisiblePlane::AddLights(FLightNode *node) + void VisiblePlane::AddLights(RenderThread *thread, FLightNode *node) { if (!r_dynlights) return; @@ -77,7 +78,7 @@ namespace swrenderer } if (!found) { - VisiblePlaneLight *newlight = RenderMemory::NewObject(); + VisiblePlaneLight *newlight = thread->FrameMemory->NewObject(); newlight->next = lights; newlight->lightsource = node->lightsource; lights = newlight; diff --git a/src/swrenderer/plane/r_visibleplane.h b/src/swrenderer/plane/r_visibleplane.h index 5e1c9230b..970eee632 100644 --- a/src/swrenderer/plane/r_visibleplane.h +++ b/src/swrenderer/plane/r_visibleplane.h @@ -35,9 +35,9 @@ namespace swrenderer struct VisiblePlane { - VisiblePlane(); + VisiblePlane(RenderThread *thread); - void AddLights(FLightNode *node); + void AddLights(RenderThread *thread, FLightNode *node); void Render(RenderThread *thread, fixed_t alpha, bool additive, bool masked); VisiblePlane *next = nullptr; // Next visplane in hash chain -- killough diff --git a/src/swrenderer/plane/r_visibleplanelist.cpp b/src/swrenderer/plane/r_visibleplanelist.cpp index 7ecd745bf..18c1f57e4 100644 --- a/src/swrenderer/plane/r_visibleplanelist.cpp +++ b/src/swrenderer/plane/r_visibleplanelist.cpp @@ -58,7 +58,7 @@ namespace swrenderer VisiblePlane *VisiblePlaneList::Add(unsigned hash) { - VisiblePlane *newplane = RenderMemory::NewObject(); + VisiblePlane *newplane = Thread->FrameMemory->NewObject(Thread); newplane->next = visplanes[hash]; visplanes[hash] = newplane; return newplane; diff --git a/src/swrenderer/r_memory.cpp b/src/swrenderer/r_memory.cpp index 5b102c09b..11c5b0b3b 100644 --- a/src/swrenderer/r_memory.cpp +++ b/src/swrenderer/r_memory.cpp @@ -68,7 +68,4 @@ namespace swrenderer FreeBlocks.push_back(std::move(block)); } } - - std::vector> RenderMemory::UsedBlocks; - std::vector> RenderMemory::FreeBlocks; } diff --git a/src/swrenderer/r_memory.h b/src/swrenderer/r_memory.h index dcd00a7a8..f01d52a4d 100644 --- a/src/swrenderer/r_memory.h +++ b/src/swrenderer/r_memory.h @@ -21,23 +21,23 @@ namespace swrenderer class RenderMemory { public: - static void Clear(); + void Clear(); template - static T *AllocMemory(int size = 1) + T *AllocMemory(int size = 1) { return (T*)AllocBytes(sizeof(T) * size); } template - static T *NewObject(Types &&... args) + T *NewObject(Types &&... args) { void *ptr = AllocBytes(sizeof(T)); return new (ptr)T(std::forward(args)...); } private: - static void *AllocBytes(int size); + void *AllocBytes(int size); enum { BlockSize = 1024 * 1024 }; @@ -52,7 +52,7 @@ namespace swrenderer uint8_t *Data; uint32_t Position; }; - static std::vector> UsedBlocks; - static std::vector> FreeBlocks; + std::vector> UsedBlocks; + std::vector> FreeBlocks; }; } diff --git a/src/swrenderer/r_renderthread.cpp b/src/swrenderer/r_renderthread.cpp index 057c09632..096f64bf6 100644 --- a/src/swrenderer/r_renderthread.cpp +++ b/src/swrenderer/r_renderthread.cpp @@ -47,11 +47,13 @@ #include "swrenderer/plane/r_visibleplanelist.h" #include "swrenderer/segments/r_drawsegment.h" #include "swrenderer/segments/r_clipsegment.h" +#include "r_memory.h" namespace swrenderer { RenderThread::RenderThread() { + FrameMemory = std::make_unique(); OpaquePass = std::make_unique(this); TranslucentPass = std::make_unique(this); SpriteList = std::make_unique(); diff --git a/src/swrenderer/r_renderthread.h b/src/swrenderer/r_renderthread.h index 21bb4b6fa..24b86e861 100644 --- a/src/swrenderer/r_renderthread.h +++ b/src/swrenderer/r_renderthread.h @@ -36,6 +36,7 @@ namespace swrenderer class VisiblePlaneList; class DrawSegmentList; class RenderClipSegment; + class RenderMemory; class RenderThread { @@ -43,6 +44,7 @@ namespace swrenderer RenderThread(); ~RenderThread(); + std::unique_ptr FrameMemory; std::unique_ptr OpaquePass; std::unique_ptr TranslucentPass; std::unique_ptr SpriteList; diff --git a/src/swrenderer/scene/r_opaque_pass.cpp b/src/swrenderer/scene/r_opaque_pass.cpp index f2aca7a49..73d282488 100644 --- a/src/swrenderer/scene/r_opaque_pass.cpp +++ b/src/swrenderer/scene/r_opaque_pass.cpp @@ -519,7 +519,7 @@ namespace swrenderer ) : nullptr; if (ceilingplane) - ceilingplane->AddLights(frontsector->lighthead); + ceilingplane->AddLights(Thread, frontsector->lighthead); if (cameraLight->FixedLightLevel() < 0 && frontsector->e && frontsector->e->XFloor.lightlist.Size()) { @@ -560,7 +560,7 @@ namespace swrenderer ) : nullptr; if (floorplane) - floorplane->AddLights(frontsector->lighthead); + floorplane->AddLights(Thread, frontsector->lighthead); // kg3D - fake planes rendering if (r_3dfloors && frontsector->e && frontsector->e->XFloor.ffloors.Size()) @@ -625,7 +625,7 @@ namespace swrenderer basecolormap); if (floorplane) - floorplane->AddLights(frontsector->lighthead); + floorplane->AddLights(Thread, frontsector->lighthead); FakeDrawLoop(sub, floorplane, ceilingplane, foggy, basecolormap); clip3d->fake3D = 0; @@ -691,7 +691,7 @@ namespace swrenderer basecolormap); if (ceilingplane) - ceilingplane->AddLights(frontsector->lighthead); + ceilingplane->AddLights(Thread, frontsector->lighthead); FakeDrawLoop(sub, floorplane, ceilingplane, foggy, basecolormap); clip3d->fake3D = 0; diff --git a/src/swrenderer/scene/r_portal.cpp b/src/swrenderer/scene/r_portal.cpp index 38a9ffc1b..bf804a4d1 100644 --- a/src/swrenderer/scene/r_portal.cpp +++ b/src/swrenderer/scene/r_portal.cpp @@ -186,7 +186,7 @@ namespace swrenderer } // Create a drawseg to clip sprites to the sky plane - DrawSegment *draw_segment = RenderMemory::NewObject(); + DrawSegment *draw_segment = Thread->FrameMemory->NewObject(); draw_segment->CurrentPortalUniq = CurrentPortalUniq; draw_segment->siz1 = INT_MAX; draw_segment->siz2 = INT_MAX; @@ -195,8 +195,8 @@ namespace swrenderer draw_segment->x1 = pl->left; draw_segment->x2 = pl->right; draw_segment->silhouette = SIL_BOTH; - draw_segment->sprbottomclip = RenderMemory::AllocMemory(pl->right - pl->left); - draw_segment->sprtopclip = RenderMemory::AllocMemory(pl->right - pl->left); + draw_segment->sprbottomclip = Thread->FrameMemory->AllocMemory(pl->right - pl->left); + draw_segment->sprtopclip = Thread->FrameMemory->AllocMemory(pl->right - pl->left); draw_segment->maskedtexturecol = nullptr; draw_segment->swall = nullptr; draw_segment->bFogBoundary = false; @@ -526,7 +526,7 @@ namespace swrenderer void RenderPortal::AddLinePortal(line_t *linedef, int x1, int x2, const short *topclip, const short *bottomclip) { - WallPortals.Push(RenderMemory::NewObject(linedef, x1, x2, topclip, bottomclip)); + WallPortals.Push(Thread->FrameMemory->NewObject(Thread, linedef, x1, x2, topclip, bottomclip)); } } /* diff --git a/src/swrenderer/scene/r_scene.cpp b/src/swrenderer/scene/r_scene.cpp index 7e8d20f78..37eff0b2b 100644 --- a/src/swrenderer/scene/r_scene.cpp +++ b/src/swrenderer/scene/r_scene.cpp @@ -113,7 +113,7 @@ namespace swrenderer MaskedCycles.Reset(); WallScanCycles.Reset(); - RenderMemory::Clear(); + Thread->FrameMemory->Clear(); Clip3DFloors *clip3d = Thread->Clip3DFloors.get(); clip3d->Cleanup(); diff --git a/src/swrenderer/segments/r_portalsegment.cpp b/src/swrenderer/segments/r_portalsegment.cpp index dbc8df976..f1591b666 100644 --- a/src/swrenderer/segments/r_portalsegment.cpp +++ b/src/swrenderer/segments/r_portalsegment.cpp @@ -32,17 +32,18 @@ #include "r_data/colormaps.h" #include "swrenderer/segments/r_portalsegment.h" #include "swrenderer/r_memory.h" +#include "swrenderer/r_renderthread.h" namespace swrenderer { - PortalDrawseg::PortalDrawseg(line_t *linedef, int x1, int x2, const short *topclip, const short *bottomclip) : x1(x1), x2(x2) + PortalDrawseg::PortalDrawseg(RenderThread *thread, line_t *linedef, int x1, int x2, const short *topclip, const short *bottomclip) : x1(x1), x2(x2) { src = linedef; dst = linedef->special == Line_Mirror ? linedef : linedef->getPortalDestination(); len = x2 - x1; - ceilingclip = RenderMemory::AllocMemory(len); - floorclip = RenderMemory::AllocMemory(len); + ceilingclip = thread->FrameMemory->AllocMemory(len); + floorclip = thread->FrameMemory->AllocMemory(len); memcpy(ceilingclip, topclip, len * sizeof(short)); memcpy(floorclip, bottomclip, len * sizeof(short)); diff --git a/src/swrenderer/segments/r_portalsegment.h b/src/swrenderer/segments/r_portalsegment.h index 9c6f644df..74596bb4d 100644 --- a/src/swrenderer/segments/r_portalsegment.h +++ b/src/swrenderer/segments/r_portalsegment.h @@ -15,10 +15,12 @@ namespace swrenderer { + class RenderThread; + /* portal structure, this is used in r_ code in order to store drawsegs with portals (and mirrors) */ struct PortalDrawseg { - PortalDrawseg(line_t *linedef, int x1, int x2, const short *topclip, const short *bottomclip); + PortalDrawseg(RenderThread *thread, line_t *linedef, int x1, int x2, const short *topclip, const short *bottomclip); line_t* src = nullptr; // source line (the one drawn) this doesn't change over render loops line_t* dst = nullptr; // destination line (the one that the portal is linked with, equals 'src' for mirrors) diff --git a/src/swrenderer/things/r_particle.cpp b/src/swrenderer/things/r_particle.cpp index 7d2672368..529c57b41 100644 --- a/src/swrenderer/things/r_particle.cpp +++ b/src/swrenderer/things/r_particle.cpp @@ -182,7 +182,7 @@ namespace swrenderer return; // store information in a vissprite - RenderParticle *vis = RenderMemory::NewObject(); + RenderParticle *vis = thread->FrameMemory->NewObject(); vis->CurrentPortalUniq = renderportal->CurrentPortalUniq; vis->heightsec = heightsec; diff --git a/src/swrenderer/things/r_sprite.cpp b/src/swrenderer/things/r_sprite.cpp index 6b02a0ec1..5e4a8f908 100644 --- a/src/swrenderer/things/r_sprite.cpp +++ b/src/swrenderer/things/r_sprite.cpp @@ -159,7 +159,7 @@ namespace swrenderer double yscale = spriteScale.Y / tex->Scale.Y; // store information in a vissprite - RenderSprite *vis = RenderMemory::NewObject(); + RenderSprite *vis = thread->FrameMemory->NewObject(); vis->CurrentPortalUniq = renderportal->CurrentPortalUniq; vis->xscale = FLOAT2FIXED(xscale); diff --git a/src/swrenderer/things/r_voxel.cpp b/src/swrenderer/things/r_voxel.cpp index 0a2d8e074..4214cdd5f 100644 --- a/src/swrenderer/things/r_voxel.cpp +++ b/src/swrenderer/things/r_voxel.cpp @@ -107,7 +107,7 @@ namespace swrenderer } } - RenderVoxel *vis = RenderMemory::NewObject(); + RenderVoxel *vis = thread->FrameMemory->NewObject(); vis->CurrentPortalUniq = renderportal->CurrentPortalUniq; vis->xscale = FLOAT2FIXED(xscale); diff --git a/src/swrenderer/things/r_wallsprite.cpp b/src/swrenderer/things/r_wallsprite.cpp index 8b0dc16cc..699dcac52 100644 --- a/src/swrenderer/things/r_wallsprite.cpp +++ b/src/swrenderer/things/r_wallsprite.cpp @@ -105,7 +105,7 @@ namespace swrenderer gzt = pos.Z + scale.Y * scaled_to; gzb = pos.Z + scale.Y * scaled_bo; - RenderWallSprite *vis = RenderMemory::NewObject(); + RenderWallSprite *vis = thread->FrameMemory->NewObject(); vis->CurrentPortalUniq = renderportal->CurrentPortalUniq; vis->x1 = wallc.sx1 < renderportal->WindowLeft ? renderportal->WindowLeft : wallc.sx1; vis->x2 = wallc.sx2 >= renderportal->WindowRight ? renderportal->WindowRight : wallc.sx2;