- Add polyobj support to r_scene_multithreaded

This commit is contained in:
Magnus Norddahl 2017-07-02 17:22:59 +02:00
parent adcc7588ec
commit 4545539045
3 changed files with 24 additions and 18 deletions

View file

@ -103,9 +103,9 @@ namespace swrenderer
// calls to GetPixels for this to work.
static std::mutex loadmutex;
loadmutex.lock();
try
{
std::unique_lock<std::mutex> lock(loadmutex);
texture->GetPixels();
const FTexture::Span *spans;
texture->GetColumn(0, &spans);
@ -114,12 +114,17 @@ namespace swrenderer
texture->GetPixelsBgra();
texture->GetColumnBgra(0, &spans);
}
loadmutex.unlock();
}
catch (...)
void RenderThread::PreparePolyObject(subsector_t *sub)
{
loadmutex.unlock();
throw;
static std::mutex polyobjmutex;
std::unique_lock<std::mutex> lock(polyobjmutex);
if (sub->BSP == nullptr || sub->BSP->bDirty)
{
sub->BuildPolyBSP();
}
}
}

View file

@ -84,6 +84,9 @@ namespace swrenderer
// Make sure texture can accessed safely
void PrepareTexture(FTexture *texture);
// Setup poly object in a threadsafe manner
void PreparePolyObject(subsector_t *sub);
private:
std::unique_ptr<SWTruecolorDrawers> tc_drawers;
std::unique_ptr<SWPalDrawers> pal_drawers;

View file

@ -390,10 +390,8 @@ namespace swrenderer
void RenderOpaquePass::AddPolyobjs(subsector_t *sub)
{
if (sub->BSP == nullptr || sub->BSP->bDirty)
{
sub->BuildPolyBSP();
}
Thread->PreparePolyObject(sub);
if (sub->BSP->Nodes.Size() == 0)
{
RenderSubsector(&sub->BSP->Subsectors[0]);