diff options
| -rw-r--r-- | src/GPU3D_Soft.cpp | 36 | ||||
| -rw-r--r-- | src/Platform.h | 1 | ||||
| -rw-r--r-- | src/wx/Platform.cpp | 5 | 
3 files changed, 30 insertions, 12 deletions
| diff --git a/src/GPU3D_Soft.cpp b/src/GPU3D_Soft.cpp index b781de8..d306a53 100644 --- a/src/GPU3D_Soft.cpp +++ b/src/GPU3D_Soft.cpp @@ -43,6 +43,7 @@ u8 StencilBuffer[256*2];  void* RenderThread;  bool RenderThreadRunning; +bool RenderThreadRendering;  void* Sema_RenderStart;  void* Sema_RenderDone;  void* Sema_ScanlineCount; @@ -57,12 +58,24 @@ bool Init()      Sema_ScanlineCount = Platform::Semaphore_Create();      RenderThreadRunning = false; +    RenderThreadRendering = false;      return true;  }  void DeInit()  { +    if (RenderThreadRunning) +    { +        RenderThreadRunning = false; +        Platform::Semaphore_Post(Sema_RenderStart); +        Platform::Thread_Wait(RenderThread); +        Platform::Thread_Free(RenderThread); +    } + +    Platform::Semaphore_Free(Sema_RenderStart); +    Platform::Semaphore_Free(Sema_RenderDone); +    Platform::Semaphore_Free(Sema_ScanlineCount);  }  void Reset() @@ -78,6 +91,12 @@ void Reset()          RenderThread = Platform::Thread_Create(RenderThreadFunc);      } +    if (RenderThreadRendering) +        Platform::Semaphore_Wait(Sema_RenderDone); + +    Platform::Semaphore_Reset(Sema_RenderStart); +    Platform::Semaphore_Reset(Sema_ScanlineCount); +      Platform::Semaphore_Post(Sema_RenderStart);  } @@ -1136,7 +1155,7 @@ void ClearBuffers()          }      }  } -int derp=0;int linebuf=0; +  void RenderPolygons(bool threaded, Polygon* polygons, int npolys)  {      // sort polygons @@ -1160,7 +1179,7 @@ void RenderPolygons(bool threaded, Polygon* polygons, int npolys)          RenderScanline(y, npolys);          if (threaded) -            Platform::Semaphore_Post(Sema_ScanlineCount);derp=y;linebuf++; +            Platform::Semaphore_Post(Sema_ScanlineCount);      }  } @@ -1173,40 +1192,33 @@ void RenderFrame(Vertex* vertices, Polygon* polygons, int npolys)  {      //ClearBuffers();      //RenderPolygons(false, polygons, npolys); -    //Platform::Semaphore_Wait(Sema_ScanlineCount); -    //Platform::Semaphore_Wait(Sema_RenderDone); -    if (linebuf!=0) printf("last frame was bad! %d\n", linebuf); +      Platform::Semaphore_Post(Sema_RenderStart); -    //printf("start frame %d\n", derp);  }  void RenderThreadFunc()  { -    //Platform::Semaphore_Post(Sema_ScanlineCount); -      for (;;)      {          Platform::Semaphore_Wait(Sema_RenderStart);          if (!RenderThreadRunning) return; +        RenderThreadRendering = true;          ClearBuffers();          RenderPolygons(true, RenderPolygonRAM, RenderNumPolygons); -        //Platform::Semaphore_Post(Sema_ScanlineCount);          Platform::Semaphore_Post(Sema_RenderDone); +        RenderThreadRendering = false;      }  }  void RequestLine(int line)  {      Platform::Semaphore_Wait(Sema_ScanlineCount); -    linebuf--;  }  u32* GetLine(int line)  { -    //Platform::Semaphore_Wait(Sema_ScanlineCount); -if (line > derp || linebuf<0) printf("bad! %d %d, %d\n", line, derp, linebuf);      return &ColorBuffer[line * 256];  } diff --git a/src/Platform.h b/src/Platform.h index 5eee7e5..4fefd33 100644 --- a/src/Platform.h +++ b/src/Platform.h @@ -30,6 +30,7 @@ void Thread_Wait(void* thread);  void* Semaphore_Create();  void Semaphore_Free(void* sema); +void Semaphore_Reset(void* sema);  void Semaphore_Wait(void* sema);  void Semaphore_Post(void* sema); diff --git a/src/wx/Platform.cpp b/src/wx/Platform.cpp index 1fb4373..b925e24 100644 --- a/src/wx/Platform.cpp +++ b/src/wx/Platform.cpp @@ -109,6 +109,11 @@ void Semaphore_Free(void* sema)      delete (wxSemaphore*)sema;  } +void Semaphore_Reset(void* sema) +{ +    while (((wxSemaphore*)sema)->TryWait() == wxSEMA_NO_ERROR); +} +  void Semaphore_Wait(void* sema)  {      ((wxSemaphore*)sema)->Wait(); |