OpenGL fix: s_swapRequested must be volatile.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4964 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
e988a7487c
commit
40cc180dfd
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
#include "Thread.h"
|
#include "Thread.h"
|
||||||
|
#include "Atomic.h"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
@ -775,6 +776,8 @@ void Renderer::RenderToXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRect
|
||||||
{
|
{
|
||||||
s_skipSwap = g_bSkipCurrentFrame;
|
s_skipSwap = g_bSkipCurrentFrame;
|
||||||
|
|
||||||
|
VideoFifo_CheckEFBAccess();
|
||||||
|
|
||||||
// If we're about to write to a requested XFB, make sure the previous
|
// If we're about to write to a requested XFB, make sure the previous
|
||||||
// contents make it to the screen first.
|
// contents make it to the screen first.
|
||||||
VideoFifo_CheckSwapRequestAt(xfbAddr, fbWidth, fbHeight);
|
VideoFifo_CheckSwapRequestAt(xfbAddr, fbWidth, fbHeight);
|
||||||
|
@ -784,9 +787,6 @@ void Renderer::RenderToXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRect
|
||||||
// just use progressive.
|
// just use progressive.
|
||||||
if (!g_ActiveConfig.bUseXFB)
|
if (!g_ActiveConfig.bUseXFB)
|
||||||
{
|
{
|
||||||
// TODO: Find better name for this because I don't know if it means what it says.
|
|
||||||
g_VideoInitialize.pCopiedToXFB(false);
|
|
||||||
|
|
||||||
Renderer::Swap(xfbAddr, FIELD_PROGRESSIVE, fbWidth, fbHeight);
|
Renderer::Swap(xfbAddr, FIELD_PROGRESSIVE, fbWidth, fbHeight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -794,6 +794,8 @@ void Renderer::RenderToXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRect
|
||||||
// This function has the final picture. We adjust the aspect ratio here.
|
// This function has the final picture. We adjust the aspect ratio here.
|
||||||
void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight)
|
void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight)
|
||||||
{
|
{
|
||||||
|
Common::AtomicStoreRelease(s_swapRequested, FALSE);
|
||||||
|
|
||||||
if (s_skipSwap)
|
if (s_skipSwap)
|
||||||
return;
|
return;
|
||||||
const XFBSource* xfbSource = g_framebufferManager.GetXFBSource(xfbAddr, fbWidth, fbHeight);
|
const XFBSource* xfbSource = g_framebufferManager.GetXFBSource(xfbAddr, fbWidth, fbHeight);
|
||||||
|
@ -1081,6 +1083,8 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight)
|
||||||
// For testing zbuffer targets.
|
// For testing zbuffer targets.
|
||||||
// Renderer::SetZBufferRender();
|
// Renderer::SetZBufferRender();
|
||||||
// SaveTexture("tex.tga", GL_TEXTURE_RECTANGLE_ARB, s_FakeZTarget, GetTargetWidth(), GetTargetHeight());
|
// SaveTexture("tex.tga", GL_TEXTURE_RECTANGLE_ARB, s_FakeZTarget, GetTargetWidth(), GetTargetHeight());
|
||||||
|
|
||||||
|
g_VideoInitialize.pCopiedToXFB(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create On-Screen-Messages
|
// Create On-Screen-Messages
|
||||||
|
|
|
@ -105,7 +105,7 @@ int GLScissorX, GLScissorY, GLScissorW, GLScissorH;
|
||||||
|
|
||||||
static bool s_PluginInitialized = false;
|
static bool s_PluginInitialized = false;
|
||||||
|
|
||||||
static u32 s_swapRequested = FALSE;
|
volatile u32 s_swapRequested = FALSE;
|
||||||
static u32 s_efbAccessRequested = FALSE;
|
static u32 s_efbAccessRequested = FALSE;
|
||||||
static volatile u32 s_FifoShuttingDown = FALSE;
|
static volatile u32 s_FifoShuttingDown = FALSE;
|
||||||
static bool ForceSwap = true;
|
static bool ForceSwap = true;
|
||||||
|
@ -493,11 +493,12 @@ void VideoFifo_CheckSwapRequest()
|
||||||
if (ForceSwap || g_ActiveConfig.bUseXFB)
|
if (ForceSwap || g_ActiveConfig.bUseXFB)
|
||||||
{
|
{
|
||||||
Renderer::Swap(s_beginFieldArgs.xfbAddr, s_beginFieldArgs.field, s_beginFieldArgs.fbWidth, s_beginFieldArgs.fbHeight);
|
Renderer::Swap(s_beginFieldArgs.xfbAddr, s_beginFieldArgs.field, s_beginFieldArgs.fbWidth, s_beginFieldArgs.fbHeight);
|
||||||
g_VideoInitialize.pCopiedToXFB(false);
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
Common::AtomicStoreRelease(s_swapRequested, FALSE);
|
Common::AtomicStoreRelease(s_swapRequested, FALSE);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool addrRangesOverlap(u32 aLower, u32 aUpper, u32 bLower, u32 bUpper)
|
inline bool addrRangesOverlap(u32 aLower, u32 aUpper, u32 bLower, u32 bUpper)
|
||||||
|
@ -531,7 +532,8 @@ void Video_BeginField(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight)
|
||||||
if (g_VideoInitialize.bOnThread)
|
if (g_VideoInitialize.bOnThread)
|
||||||
{
|
{
|
||||||
while (Common::AtomicLoadAcquire(s_swapRequested) && !s_FifoShuttingDown)
|
while (Common::AtomicLoadAcquire(s_swapRequested) && !s_FifoShuttingDown)
|
||||||
Common::YieldCPU();
|
Common::SleepCurrentThread(1);
|
||||||
|
//Common::YieldCPU();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
VideoFifo_CheckSwapRequest();
|
VideoFifo_CheckSwapRequest();
|
||||||
|
@ -582,7 +584,8 @@ u32 Video_AccessEFB(EFBAccessType type, u32 x, u32 y)
|
||||||
if (g_VideoInitialize.bOnThread)
|
if (g_VideoInitialize.bOnThread)
|
||||||
{
|
{
|
||||||
while (Common::AtomicLoadAcquire(s_efbAccessRequested) && !s_FifoShuttingDown)
|
while (Common::AtomicLoadAcquire(s_efbAccessRequested) && !s_FifoShuttingDown)
|
||||||
Common::YieldCPU();
|
Common::SleepCurrentThread(1);
|
||||||
|
//Common::YieldCPU();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
VideoFifo_CheckEFBAccess();
|
VideoFifo_CheckEFBAccess();
|
||||||
|
|
|
@ -21,5 +21,6 @@
|
||||||
#include "pluginspecs_video.h"
|
#include "pluginspecs_video.h"
|
||||||
|
|
||||||
extern SVideoInitialize g_VideoInitialize;
|
extern SVideoInitialize g_VideoInitialize;
|
||||||
|
extern volatile u32 s_swapRequested;
|
||||||
|
|
||||||
#endif // _MAIN_H_
|
#endif // _MAIN_H_
|
||||||
|
|
Loading…
Reference in New Issue