mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-30 16:00:55 +00:00
Fix some r_scene_multithreaded related bugs
This commit is contained in:
parent
4cd994c027
commit
fb87f90d86
3 changed files with 18 additions and 9 deletions
|
@ -91,7 +91,8 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::mutex loadmutex;
|
static std::mutex loadmutex;
|
||||||
void RenderThread::PrepareTexture(FSoftwareTexture *texture, FRenderStyle style) {
|
void RenderThread::PrepareTexture(FSoftwareTexture *texture, FRenderStyle style)
|
||||||
|
{
|
||||||
if (texture == nullptr)
|
if (texture == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
#include "m_alloc.h"
|
#include "m_alloc.h"
|
||||||
#include "imagehelpers.h"
|
#include "imagehelpers.h"
|
||||||
#include "texturemanager.h"
|
#include "texturemanager.h"
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
inline EUpscaleFlags scaleFlagFromUseType(ETextureType useType)
|
inline EUpscaleFlags scaleFlagFromUseType(ETextureType useType)
|
||||||
{
|
{
|
||||||
|
@ -562,16 +562,24 @@ void FSoftwareTexture::FreeAllSpans()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note: this function needs to be thread safe
|
||||||
FSoftwareTexture* GetSoftwareTexture(FGameTexture* tex)
|
FSoftwareTexture* GetSoftwareTexture(FGameTexture* tex)
|
||||||
{
|
{
|
||||||
FSoftwareTexture* SoftwareTexture = static_cast<FSoftwareTexture*>(tex->GetSoftwareTexture());
|
FSoftwareTexture* SoftwareTexture = static_cast<FSoftwareTexture*>(tex->GetSoftwareTexture());
|
||||||
if (!SoftwareTexture)
|
if (!SoftwareTexture)
|
||||||
|
{
|
||||||
|
static std::mutex loadmutex;
|
||||||
|
std::unique_lock<std::mutex> lock(loadmutex);
|
||||||
|
|
||||||
|
SoftwareTexture = static_cast<FSoftwareTexture*>(tex->GetSoftwareTexture());
|
||||||
|
if (!SoftwareTexture)
|
||||||
{
|
{
|
||||||
if (tex->isSoftwareCanvas()) SoftwareTexture = new FSWCanvasTexture(tex);
|
if (tex->isSoftwareCanvas()) SoftwareTexture = new FSWCanvasTexture(tex);
|
||||||
else if (tex->isWarped()) SoftwareTexture = new FWarpTexture(tex, tex->isWarped());
|
else if (tex->isWarped()) SoftwareTexture = new FWarpTexture(tex, tex->isWarped());
|
||||||
else SoftwareTexture = new FSoftwareTexture(tex);
|
else SoftwareTexture = new FSoftwareTexture(tex);
|
||||||
tex->SetSoftwareTexture(SoftwareTexture);
|
tex->SetSoftwareTexture(SoftwareTexture);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return SoftwareTexture;
|
return SoftwareTexture;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -582,6 +590,7 @@ CUSTOM_CVAR(Bool, vid_nopalsubstitutions, false, CVAR_ARCHIVE | CVAR_NOINITCALL)
|
||||||
R_InitSkyMap();
|
R_InitSkyMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note: this function needs to be thread safe
|
||||||
FSoftwareTexture* GetPalettedSWTexture(FTextureID texid, bool animate, bool checkcompat, bool allownull)
|
FSoftwareTexture* GetPalettedSWTexture(FTextureID texid, bool animate, bool checkcompat, bool allownull)
|
||||||
{
|
{
|
||||||
bool needpal = !vid_nopalsubstitutions && !V_IsTrueColor();
|
bool needpal = !vid_nopalsubstitutions && !V_IsTrueColor();
|
||||||
|
|
|
@ -262,8 +262,7 @@ namespace swrenderer
|
||||||
{
|
{
|
||||||
RenderTranslucentPass *translucentPass = thread->TranslucentPass.get();
|
RenderTranslucentPass *translucentPass = thread->TranslucentPass.get();
|
||||||
short portalfloorclip[MAXWIDTH];
|
short portalfloorclip[MAXWIDTH];
|
||||||
int x2 = wallc.sx2;
|
for (int x = x1; x < x2; x++)
|
||||||
for (int x = wallc.sx1; x < x2; x++)
|
|
||||||
{
|
{
|
||||||
if (translucentPass->ClipSpriteColumnWithPortals(x, this))
|
if (translucentPass->ClipSpriteColumnWithPortals(x, this))
|
||||||
portalfloorclip[x] = mceilingclip[x];
|
portalfloorclip[x] = mceilingclip[x];
|
||||||
|
|
Loading…
Reference in a new issue