- Do various stability improvements.

task.cpp:
- Fix race condition on Windows.
- Do some minor code cleanup.
This commit is contained in:
rogerman 2013-01-16 23:38:47 +00:00
parent 39997cfebf
commit c15911a1b1
4 changed files with 51 additions and 30 deletions

View File

@ -1036,6 +1036,7 @@ static void OGLClose()
{
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glDeleteBuffersARB(1, &vboVertexID);
isVBOSupported = false;
}
if (isPBOSupported)
@ -1044,6 +1045,7 @@ static void OGLClose()
glDeleteBuffersARB(2, pboRenderDataID);
pboRenderBuffer[0] = NULL;
pboRenderBuffer[1] = NULL;
isPBOSupported = false;
}
// FBO
@ -1056,6 +1058,8 @@ static void OGLClose()
glDeleteFramebuffersEXT(1, &fboClearImageID);
glDeleteTextures(1, &texClearImageColorID);
glDeleteTextures(1, &texClearImageDepthStencilID);
isFBOSupported = false;
}
//kill the tex cache to free all the texture ids
@ -1071,6 +1075,9 @@ static void OGLClose()
glDeleteTextures(1,&temp);
}
hasTexture = false;
currTexture = NULL;
glFinish();
ENDGL();

View File

@ -1,6 +1,6 @@
/*
Copyright (C) 2006 yopyop
Copyright (C) 2008-2012 DeSmuME team
Copyright (C) 2008-2013 DeSmuME team
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -2418,6 +2418,8 @@ SFORMAT SF_GFX3D[]={
//-------------savestate
void gfx3d_savestate(EMUFILE* os)
{
gpu3D->NDS_3D_RenderFinish();
//version
write32le(4,os);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2009-2012 DeSmuME team
Copyright (C) 2009-2013 DeSmuME team
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -1073,7 +1073,7 @@ static SoftRasterizerEngine mainSoftRasterizer;
static Task rasterizerUnitTask[_MAX_CORES];
static RasterizerUnit<true> rasterizerUnit[_MAX_CORES];
static RasterizerUnit<false> _HACK_viewer_rasterizerUnit;
static unsigned int rasterizerCores;
static unsigned int rasterizerCores = 0;
static bool rasterizerUnitTasksInited = false;
static void* execRasterizerUnit(void* arg)
@ -1629,6 +1629,15 @@ void _HACK_Viewer_ExecUnit(SoftRasterizerEngine* engine)
static void SoftRastRender()
{
// Force threads to finish before rendering with new data
if (rasterizerCores > 1)
{
for(unsigned int i = 0; i < rasterizerCores; i++)
{
rasterizerUnitTask[i].finish();
}
}
mainSoftRasterizer.polylist = gfx3d.polylist;
mainSoftRasterizer.vertlist = gfx3d.vertlist;
mainSoftRasterizer.indexlist = &gfx3d.indexlist;

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2009-2011 DeSmuME team
Copyright (C) 2009-2013 DeSmuME team
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -47,8 +47,8 @@ public:
void init();
//the work function that shall be executed
TWork work;
void* param;
TWork workFunc;
void* workFuncParam;
HANDLE incomingWork, workDone, hThread;
volatile bool bIncomingWork, bWorkDone, bKill;
@ -67,7 +67,7 @@ Task::Impl::~Impl()
}
Task::Impl::Impl()
: work(NULL)
: workFunc(NULL)
, bIncomingWork(false)
, bWorkDone(true)
, bKill(false)
@ -96,10 +96,10 @@ void Task::Impl::taskProc()
bIncomingWork = false;
//execute the work
param = work(param);
workFuncParam = workFunc(workFuncParam);
//signal completion
if(!spinlock) SetEvent(workDone);
bWorkDone = true;
if(!spinlock) SetEvent(workDone);
}
}
@ -134,8 +134,8 @@ void Task::Impl::shutdown()
void Task::Impl::execute(const TWork &work, void* param)
{
//setup the work
this->work = work;
this->param = param;
this->workFunc = work;
this->workFuncParam = param;
bWorkDone = false;
//signal it to start
if(!spinlock) SetEvent(incomingWork);
@ -145,15 +145,18 @@ void Task::Impl::execute(const TWork &work, void* param)
void* Task::Impl::finish()
{
//just wait for the work to be done
if(spinlock)
while(!bWorkDone)
if(spinlock)
{
while(!bWorkDone)
Sleep(0);
}
else
{
if(!bWorkDone)
WaitForSingleObject(workDone,INFINITE);
while(!bWorkDone)
WaitForSingleObject(workDone, INFINITE);
}
return param;
return workFuncParam;
}
#else
@ -174,8 +177,8 @@ public:
pthread_mutex_t mutex;
pthread_cond_t condWork;
TWork work;
void *param;
TWork workFunc;
void *workFuncParam;
void *ret;
bool exitThread;
};
@ -187,17 +190,17 @@ static void* taskProc(void *arg)
do {
pthread_mutex_lock(&ctx->mutex);
while (ctx->work == NULL && !ctx->exitThread) {
while (ctx->workFunc == NULL && !ctx->exitThread) {
pthread_cond_wait(&ctx->condWork, &ctx->mutex);
}
if (ctx->work != NULL) {
ctx->ret = ctx->work(ctx->param);
if (ctx->workFunc != NULL) {
ctx->ret = ctx->workFunc(ctx->workFuncParam);
} else {
ctx->ret = NULL;
}
ctx->work = NULL;
ctx->workFunc = NULL;
pthread_cond_signal(&ctx->condWork);
pthread_mutex_unlock(&ctx->mutex);
@ -210,8 +213,8 @@ static void* taskProc(void *arg)
Task::Impl::Impl()
{
_isThreadRunning = false;
work = NULL;
param = NULL;
workFunc = NULL;
workFuncParam = NULL;
ret = NULL;
exitThread = false;
@ -235,8 +238,8 @@ void Task::Impl::start(bool spinlock)
return;
}
this->work = NULL;
this->param = NULL;
this->workFunc = NULL;
this->workFuncParam = NULL;
this->ret = NULL;
this->exitThread = false;
pthread_create(&this->_thread, NULL, &taskProc, this);
@ -254,8 +257,8 @@ void Task::Impl::execute(const TWork &work, void *param)
return;
}
this->work = work;
this->param = param;
this->workFunc = work;
this->workFuncParam = param;
pthread_cond_signal(&this->condWork);
pthread_mutex_unlock(&this->mutex);
@ -272,7 +275,7 @@ void* Task::Impl::finish()
return returnValue;
}
while (this->work != NULL) {
while (this->workFunc != NULL) {
pthread_cond_wait(&this->condWork, &this->mutex);
}
@ -292,7 +295,7 @@ void Task::Impl::shutdown()
return;
}
this->work = NULL;
this->workFunc = NULL;
this->exitThread = true;
pthread_cond_signal(&this->condWork);